Ansvarsdrevet OO: CRC og UML Sekvensdiagrammer



Like dokumenter
Spesifikasjon av Lag emne

Spesifikasjon av Lag emne. Kursregistrering bruksmønstermodell. Dagens forelesning. Fra krav til objekter

Fra krav til objektdesign

Spesifikasjon av Lag emne. Kursregistrering bruksmønstermodell (ny versjon) Dagens forelesning. Fra krav til objektdesign

Spesifikasjon av Lag emne. Kursregistrering g bruksmønstermodell. Dagens forelesning. Fra krav til objekter

NB! Endring i undervisningsplanen

Metode for ansvarsdrevet OO. Dagens forelesning. Delegering av ansvar i en trelagsarkitektur

Beskjed fra Skagestein

o UML klassediagrammer

Metode for ansvarsdrevet OO med UML. Dagens forelesning. Hovedflyt for Meld på kurs. Delegering av ansvar i en trelagsarkitektur

UML klassediagrammer

Metode for ansvarsdrevet OO med UML. Dagens forelesning. Hovedflyt for Meld på kurs. Delegering g av ansvar i en trelagsarkitektur

Dagens forelesning. o Litt mer om design med UML sekvensdiagrammer. Sentralisert og delegert kontrollstil

Metode for ansvarsdrevet OO. Dagens forelesning. Delegering av ansvar i en trelagsarkitektur

Metode for ansvarsdrevet OO. Dagens forelesning. Delegering av ansvar i en trelagsarkitektur

Dagens forelesning. o Litt mer om design med UML sekvensdiagrammer. Sentralisert og delegert kontrollstil

Oversikt over forelesningene. Fra analyse til objektdesign. Utfordringen i å lage OO-modeller. Metode for ansvarsdrevet OO. Uke 12: Ansvarsdrevet OO:

Use Case-modellering. INF1050: Gjennomgang, uke 04

UKE 11 UML modellering og use case. Gruppetime INF1055

INF 1050 BRUK AV MODELLERINGSVERKTØYET RATIONAL ROSE

INF1000 Metoder. Marit Nybakken 16. februar 2004

INF1000: Forelesning 7

GJENNOMGANG UKESOPPGAVER 4 USE CASE MODELLERING HELGA NYRUD & KRISTIN BRÆNDEN

UML 1. Use case drevet analyse og design Kirsten Ribu

Fra krav til objekter. INF1050: Gjennomgang, uke 05

Use case drevet design med UML

INF1000: Forelesning 7. Konstruktører Static

GJENNOMGANG UKESOPPGAVER 6 MER OM OBJEKTORIENTERING OG UML

UML- Use case drevet analyse og design. Domenemodeller Sekvensdiagrammer Use case realisering med GRASP patterns Klassediagram - designmodeller

UKE 13 Mer UML modellering. Gruppetime INF1055 Julie Hagen Nilsen & Maria Stolinski

Mer$om$objektorientering$og$UML

UML-Unified Modeling Language

Produktrapport Gruppe 9

UNIVERSITETET I OSLO

Objektorientering og UML. INF1050: Gjennomgang, uke 06

OO Design, del 2. Oversikt over forelesningene. Metode for ansvarsdrevet OO Hva er et objekt. Uke 12: Fra sekvensdiagram til klasser

Utvikling fra skallet og inn

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

I dag UML. Domenemodell visualisering av konsepter. Eksempel. Hvordan finne domeneklasser?

IN2000:&Kravhåndtering,&modellering,&design

OPPGAVE 5b og 8b Java Kode

UNIVERSITETET I OSLO

Modellering av krav. INF1050: Systemutvikling 11. februar Universitetslektor Yngve Lindsjørn

Kursregistrering bruksmønstermodell

UML-Unified Modeling Language. Prosess-oversikt. Use case realisering

Kravspesifikasjon. Kravspesifikasjon. Mal for kravspesifikasjon. Hvordan finne fram til kravene? Hva skal systemet gjøre? Hvem og hva påvirker krav?

UNIVERSITETET I OSLO

Universitetet i Oslo Institutt for informatikk. Eskild Busch. UML hefte

UNIVERSITETET I OSLO

Modellering av krav. INF1050: Systemutvikling 07. februar Førstelektor Yngve Lindsjørn

Innhold. INF1000 Høst Unified Modeling Language (UML) Unified Modeling Language (UML)

Kravspesifikasjon. Dagens forelesning. Mal for kravspesifikasjon. Hvordan finne fram til kravene? Kravspesifikasjon og objektorientert analyse

Hensikten med denne delen av kurset. Objektets egenskaper. Objektorientering hva er det? Best practises ved programvareutvikling. Kravspesifikasjonen

GJENNOMGANG UKESOPPGAVER 7 REPETISJON

Forside. Eksamen i IN1030 for Våren Ingen hjelpemidler tillatt.

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

HØGSKOLEN I SØR-TRØNDELAG

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

UNIVERSITETET I OSLO

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

UNIVERSITETET I OSLO

INF1000: Forelesning 6. Klasser og objekter del 1

INF1010, 15. januar time. Parametriserte klasser (generiske klasser) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

INF1010, 21. januar Klasser med parametre = Parametriserte klasser = Generiske klasser

UNIVERSITETET I OSLO

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

INF1000: noen avsluttende ord

UNIVERSITETET I OSLO

Mer om objektorientering og UML

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

Løsningsforslag til Case. (Analysen)

INF1010 UML. Marit Nybakken 26. januar 2004

Klasser, objekter, pekere og UML. INF gruppe 13

INF Seminaroppgaver til uke 3

Løsningsforslag til eksamen i INF1000 våren 2006

Enkle generiske klasser i Java

Objektorientert design av kode. Refaktorering.

Kravspesifikasjon med UML use case modellering. Erik Arisholm

UNIVERSITETET I OSLO

Obligatorisk oppgave 5: Modellering av krav

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

INF Modellering med objekter (Oblig 2) **TimeregistreringSystem** (Designet av Alen Cemer

Kravspesifikasjon. Erik Arisholm. Simula Research Laboratory. Institutt for Informatikk. INF1050-krav-1

Eksamen INF1050: Gjennomgang, uke 15

Persistens. Erik Arisholm. Institutt for informatikk Erik Arisholm INF1050-persistens-1

Sensur-veiledning INF1000 h 2013 (fasit) am - 6. des. 2013

Løse reelle problemer

INF1010 våren januar. Objektorientering i Java

Etter uke 9 skal du. Introduksjon til objektorientert programmering. Innhold. Klasser som abstraksjoner

INF1000 Prøveeksamen Oppgave 7 og 9

INF2120 V2005. Gruppe 2 christrc ieronnin kjetimk noushinm sjuros. Trafikanten+ Innlevering

TOD063 Datastrukturer og algoritmer

INF 5120 Modellering med objekter

Erfaringer fra våren Oppsummering: Hvordan utvikles et informasjonssystem? Noen eksamenstips, og litt teknikk Hvordan er eksamensoppgaven?

Generelt om oblig 3. Oppgaveteksten kort sammendrag. Deloppgaver/menyvalg 15/03/2010. INF1000 Forelesning 9

Oblig 4Hybelhus litt mer tips enn i oppgaven

UNIVERSITETET I OSLO

Eksamen 2013 Løsningsforslag

Introduksjon til objektorientert programmering

Transkript:

Fra krav til objekter Ansvarsdrevet OO: CRC og UML Sekvensdiagrammer INF1050--1

Dagens forelesning o Kort repetisjon av kravspesifikasjon med UML Hva skal systemet gjøre? UML: Bruksmønstermodeller (Use Cases) o Objektdesign Hvordan skal systemet fungere? Tre typer objekter CRC: Hvordan finne gode objekter? UML: Sekvensdiagrammer INF1050--2

Kursregistrering bruksmønstermodell Meld på kurs Lag Emne Student Meld av kurs Lag Kurs Kursadministrator Betal semesteravgift Registrer eksamensresultat Skiller mellom "Emne" (f.eks. Inf1050) og "Kurs" i emnet (Inf1050 v08) Variasjon for "Lag Emne": Opprett nytt emne Variasjon for "Lag Kurs": Opprett nytt kurs Variasjoner for "Meld på kurs": Kurset forutsetter tt andre emner: Studenten t må ha bestått kurs for emnene Dersom et kurs er fullt: Studenten kan bli satt på venteliste Variasjon for "Meld av kurs": Dersom kurset var fullt: Første student på venteliste blir meldt på kurset INF1050--3

Spesifikasjon av Lag emne Navn: Lag emne Aktør: Kursadministrator Hovedflyt: 1. Kursadministrator velger emnekode 2. Systemet t finner emnet 3. Kursadministratoren oppdaterer beskrivelsen av emnet (her kan det være mange underpunkter og variasjoner, for eksempel registrering av hvilke andre emner som forutsettes) 4. Systemet t registrerer den nye informasjonen Alternativ flyt, steg 2: Emnekoden eksisterer ikke: A.1.1. Systemet spør om nytt emne skal opprettes og oppretter i så fall nytt emne med gitt emnekode (dvs, Nytt emne er en variasjon over Lag emne ) Relatert informasjon: Pga behov for historikk og avhengighet til kurs kan man ikke slette emner, men det bør være mulig å definere at et nytt emne erstatter et gammelt emne under punkt 3. INF1050--4

Tekstlig spesifikasjon av Meld på kurs Navn: Meld på kurs Aktør: Student Prebetingelse: Student har betalt semesteravgift Postbetingelse: Student er meldt på kurset eller er satt på venteliste Hovedflyt: 1. Studenten velger emne 2. Systemet sjekker at studenten er kvalifisert til å ta emnet 3. Systemet finner kurs for emnet 4. Systemet sjekker om det er ledig plass på kurset 5. Systemet t registrerer studenten t på kurset INF1050--5

Alternativ flyt, steg 1: Emnet finnes ikke: A.1.1 Bruksmønsteret avsluttes Meld på kurs (forts.) Alternativ flyt, steg 2: Emnet forutsetter andre emner: A.2.1 Systemet sjekker at studenten har bestått kurs for emner som forutsettes Alternativ flyt, steg A.2.1: Studenten har bestått kurs for emner som forutsettes: A.2.1.1.1 Bruksmønsteret fortsetter fra steg 3 Alternativ flyt, steg A.2.1: Studenten har ikke bestått kurs for emner som forutsettes: A.2.1.2.1 Bruksmønsteret avsluttes Alternativ flyt, steg 3: Det holdes ikke kurs i emnet dette semesteret: A31B A.3.1 Bruksmønsteret tavsluttes Alternativ flyt, steg 4: Kurset er fullt: A.4.1 Systemet spør om studenten ønsker å bli satt på venteliste Alternativ flyt, steg A.4.1: Studenten ønsker å bli satt på venteliste: A.4.1.1.1 Systemet setter studenten på venteliste. A.4.2 Bruksmønsteret avsluttes INF1050--6

Metode for ansvarsdrevet OO Inf1050 metoden (Iterativ): Analyse av krav (1) Identifiser aktører og deres mål (2) Lag et høynivå bruksmønsterdiagram (3) Spesifiser hvert bruksmønster tekstlig med hovedflyt og alternativ flyt Objektdesign For hvert bruksmønster: (4) Identifiser objekter og fordel ansvar mellom dem (CRC) (5) Lag sekvensdiagram for hovedflyt og viktige variasjoner (6) Lag klassediagram som tilsvarer sekvensdiagrammene (7) Lag til slutt klassediagram på systemnivå INF1050--7

Hva er et objekt Et objekt er en representasjon av en virkelig ting. Et objekt har en entydig identitet, en indre tilstand, og evnen til å reagere på meldinger utenfra. Et objekt har altså liv. I modeller e er alt mulig - også å bevisstgjøre e i utgangspunktet døde ting som innsjøer, veier, kommuner, firmaer, lån... INF1050--8

Et låneobjekt kan f.eks. Det bevisste lån o kjenne til sin egen saldo, rentefot, forfallsdatoer osv. o forrente seg selv o purre på avdrag o akseptere innbetalinger lån Hei, du har glemt å betale avdraget! INF1050--9

Utfordringen i å lage OO-modeller Gitt et sett bruksmønstre: Hvordan finne de riktige objektene og fordele ansvar mellom dem slik at bruksmønstrene blir realisert! INF1050--10

Hvordan finne objekter? Ta først utgangspunkt i språket til domenet (problemområdet): o F.eks. produkt, ingrediens, kunde, student, konto, innskudd, reservasjon o Finn begreper i bruksmønsterspesifikasjonene! Lag CRC-kort for objektene du tror du trenger Lag sekvensdiagrammer for bruksmønstrene INF1050--11

Tre typer objekter Forretningsobjekter ( entity objects ) Kontrollobjekter ( control objects ) Kantobjekter ( boundary objects ) Litt forenklet kan man si at denne tredelingen skiller mellom 1) objekter som skal lagres i en database, 2) objekter som koordinerer handlingene i et bruksmønster og 3) objekter som kommuniserer med aktørene. INF1050--12

Forretningsobjekter ( entity objects ) Representerer de tingene virksomheten håndterer, som for eksempel vare, tilbud, ordre, kunde osv. En forekomst av et forretningsobjekt kan leve lenge - kanskje like lenge som virksomheten! I motsetning til kantobjekter og kontrollobjekter lagres forretningsobjektene i en database (de er persistente ) t ) INF1050--13

Kontrollobjekter ( control objects ) Representerer noe som gjøres i virksomheten Et kontrollobjekt lever vanligvis ikke lenger enn det handlingsforløpet det inngår i. Inf1050: ett kontrollobjekt pr. bruksmønster. Inf1050: Navnet på kontrollobjektet = navnet på bruksmønsteret! INF1050--14

Kantobjekter (boundary objects) Kantobjekter aktiveres av handlinger fra aktører via brukergrensesnittet o for eksempel når aktøren ønsker å starte et bruksmønster ved å trykke på Meld på kurs -knappenknappen i brukergrensesnittet. Kantobjektet oppretter deretter en forekomst av kontrollobjektet kt t som kontrollerer selve handlingsforløpet i bruksmønsteret Vi kan godt tenke på kantobjekter som bindeleddet mellom et uspesifisert brukergrensesnitt og et kontrollobjekt. Kantobjekter kommuniserer kun med aktører (via brukergrensesnittet) og kontrollobjekter. INF1050--15

CRC-kort (Class-Responsibility-Collaboration) Navn på objektet <<type objekt>> Liste over samarbeidende Ansvar: objekter Hva objektet må vite (objekter som jeg utveksler meldinger med) Hva objektet skal gjøre INF1050--16

Eks: CRC-kort for Student Student <<entity>> Kurs Vet min studentid Vet hvilke kurs jeg har bestått Vet hvilke kurs jeg er meldt opp til Vet hvilke kurs jeg står på venteliste på + andre ansvarsområder: Vil bli tydeligere etter hvert som man designer bruksmønstre ved hjelp av sekvensdiagrammer INF1050--17

Eks: CRC-kort for Universitet Objektorienterte systemer inneholder ofte et slikt oppslagsobjekt Universitet <<entity>> Emne Student Oppslagsobjekt som er tilgjengelig for alle andre objekter: Vet hvilke Emner og Studenter som finnes på universitetet Har metode for å finne en gitt student Har metode for å finne et gitt emne INF1050--18

Eks: CRC-kort for bruksmønsteret Meld på kurs Kant <<boundary>> Kommuniserer med aktøren og kontrollobjektet MeldPaaKurs Universitet <<entity>> Oppslagsobjekt som vet hvilke emner og studenter som finnes i systemet t Emne Student Emne <<entity>> Vet min emnekode Vet hvilke emner som forutsettes Vet hvilke kurs som holdes i emnet Kurs Kurs Emne MeldPaaKurs <<control>> Kontrollerer hendelses- forløpet i bruksmønsteret Meld på kurs Universitet Emne Kurs Student Kant Student <<entity>> Vet min studentid Vet hvilke kurs jeg har bestått Vet hvilke kurs jeg er meldt opp til Vet hvilke kurs jeg står på venteliste på Kurs <<entity>> Vet semesteret som (et kurs i) et bestemt emne holdes Vet antall plasser Vet hvilke studenter som er påmeldt Vet hvilke studenter som står på venteliste Student INF1050--19

Objektdesign med UML sekvensdiagrammer Et UML sekvensdiagram viser en interaksjon mellom aktører og objekter i systemet for et bestemt bruksmønster o Fokuserer på hvordan objektene samarbeider for å løse en bestemt oppgave (bruksmønster) o Er ofte nyttig for å identifisere (og spesifisere bruken av) metodene til objektene i systemet INF1050--20

Syntaks for UML sekvensdiagram Meldingen sendes bare dersom betingelser er oppfylt Java: if (betingelser) { returverdi = objekt1.metode(parametere) } objekt1:klasse1 objekt2:klasse2 [betingelser] returverdi := metode (parametere) Klassen til objektet må ha en metode som kan ta hånd om meldingen Meldingens aktive periode Returmelding. Vises vanligvis i ikke i diagrammet Objektet fjernes det trengs ikke lenger INF1050--21

Sammenheng mellom bruksmønster og sekvensdiagram For hvert bruksmønster lager du (i de aller fleste tilfeller) et sekvensdiagram for hovedflyt For hver alternative flyt kan du velge å lage et nytt sekvensdiagram. o Det er viktig å lage sekvensdiagram for variasjoner som har stor innvirkning på designet Introduserer variasjonen nye objekter? Introduserer variasjonen nye metoder? INF1050--22

Hovedflyt for Meld på kurs (iterasjon #1, uten forretningsobjektene) Student kantobjektet: Kant ok:=meldpaakurs(studentid, emnekode, semester) <<create>> meldpaa: MeldPaaKurs Lager en instans av kontrollobjektet ok:=meldpaakurs(studentid, emnekode, semester) Kontrollobjektet sørger for at studenten blir meldt på kurset Kontrollobjektet slettes INF1050--23

(infostoff) Eksempel i Java: metoden meldpaakurs til kantobjektet Student kantobjektet: Kant ok:=meldpaakurs(studentid, emnekode, semester) boolean meldpaakurs(string studentid, String emnekode, String semester) { MeldPaaKurs meldpaa; boolean ok; // kantobjektet lager et nytt kontrollobjekt: meldpaa = new MeldPaaKurs(this); } // så overtar kontrollobjektet handlingsforløpet i bruksmønsteret: ok = meldpaa.meldpaakurs(studentid, emnekode, semester); return ok; INF1050--24

Hovedflyt for Meld på kurs Objektet som returneres av finnemne Objektet som returneres av Emne::finnKurs Objektet som returneres av finnstudent Student kantobjektet: Kant universitetet: Universitet emnet: Emne kurset: Kurs studenten: Student ok:=meldpaakurs(studentid, emnekode, semester) <<create>> meldpaa: MeldPaaKurs ok:=meldpaakurs(studentid, emnekode, semester) Hovedflyt: 1. Studenten velger emne 2. Systemet sjekker at studenten er kvalifisert til å ta emnet 3. Systemet finner kurset for emnet 4. Systemet sjekker om det er ledig plass på kurset 5. Systemet registrerer studenten på kurset CRC-kortene forteller deg hvilket objekt som skal motta en bestemt melding studenten:=finnstudent(studentid) emnet:=finnemne(emnekode) forutsetter:=forutsetteremner() kurset:=finnkurs(semester) erledigplass:=ledigplass() paameldingok:=meldpaa(studenten) ermeldtpaa(kurset) INF1050--25

(infostoff - NB! Ikke komplett kode) Eksempel i Java: metoden meldpaakurs til kontrollobjektet public class MeldPaaKurs { public boolean meldpaakurs(string studentid, String emnekode, String semester) { } // antar at objektet universitetet er globalt tilgjengelig: Student studenten = universitetet.finnstudent(studentid); Emne emnet = universitetet.finnemne(emnekode); boolean forutsetteremner = emnet.forutsetteremner(); Kurs kurset = emnet.finnkurs(semester); t boolean erledigplass = kurset.ledigplass(); boolean paameldingok = kurset.meldpaa(studenten); studenten.ermeldtpaa(kurset); return paameldingok; } INF1050--26

Objektdiagram, før Per melder seg på Inf1050 UiO: Universitet har Student har Student har Emne har Emne navn = "Per" Per : Student studentid = "12345" navn = 'Kari' Kari : Student studentid = '44456' Inf1050 : Emne emnekode = 'Inf1050' Inf1000 : Emne emnekode = 'Inf1000' er u undervisning i er undervisning ng i Inf1050v08 : Kurs Inf1050v07 : Kurs er meldt på antallpaameldt = 299 antallplasser = 300 semester = 'v08' antallpaameldt = 278 antallplasser = 300 semester = 'v07' er meldt på 299 andre studenter: t Student t 278 studenter: Student INF1050--27

og så registrerer Per seg på Inf1050 v08 Student kantobjektet: Kant UiO: Universitet Inf1050 : Emne Inf1050v08: Kurs Per: Student ok:=meldpaakurs('12345', 'Inf1050', 'v08') <<create>> meldpaa: MeldPaaKurs ok:=meldpaakurs('12345', 'Inf1050', 'v08') studenten:=finnstudent('12345') emnet:=finnemne('inf1050') forutsetter:=forutsetteremner() kurset:=finnkurs('v08') erledigplass:=ledigplass() paameldingok:=meldpaa(studenten) ermeldtpaa(kurset) INF1050--28

Objektdiagram, etter at Per har meldt seg på Inf1050 v08 UiO: Universitet har Student har Student har Emne har Emne Per : Student Kari : Student navn = "Per" navn = 'Kari' studentid ="12345" studentid ='44456' Inf1050 : Emne emnekode = 'Inf1050' Inf1000 : Emne emnekode = 'Inf1000' er meldt t på er u undervisning i er undervisnin ng i Inf1050v08 : Kurs Inf1050v07 : Kurs er meldt på antallpaameldt = 300 antallplasser = 300 semester = 'v08' antallpaameldt = 278 antallplasser = 300 semester = 'v07' er meldt på 299 andre studenter: Student 278 studenter: t Student t INF1050--29

Alternativ flyt, steg 4 (kurset er fullt og studenten ønsker å sette seg på venteliste) Student kantobjektet: Kant universitetet: Universitet emnet: kurset: studenten: Emne Kurs Student ok:=meldpaakurs(studentid, emnekode, semester) <<create>> meldpaa: MldP MeldPaaKurs ok:=meldpaakurs(studentid, emnekode, semester) studenten:=finnstudent(studentid) emnet:=finnemne(emnekode) forutsetter:=forutsetteremner() kurset:=finnkurs(semester) erledig:=ledigplass() [erledig==false] vilvente:=oenskerventeliste() [vilvente==true] okvent:=settventeliste(studenten) [okvent==true] erpaaventeliste(kurset) INF1050--30

(infostoff - NB! Ikke komplett kode) Java tilsvarende steg 1-3 + alternativ flyt, y, steg 4 (kurset er fullt og studenten ønsker å sette seg på venteliste) public class MeldPaaKurs { } private Kant kantobjektet; public boolean meldpaakurs(string studentid, String emnekode, String semester) { } Student studenten = universitetet.finnstudent(studentid); Emne emnet = universitetet.finnemne(emnekode); boolean forutsetteremner = emnet.forutsetteremner(); Kurs kurset = emnet.finnkurs(semester); boolean erledigplass = kurset.ledigplass(); if (erledigplass == false) { } boolean vilvente = kantobjektet.oenskerventeliste(); if (vilvente == true) { } boolean okvent= kurset.settventeliste(studenten); if (okvent == true) { } studenten.erpaaventeliste(kurset); return true; INF1050--31

Objektdiagram, etter at Kari ble satt på venteliste UiO: Universitet har Student har Student har Emne har Emne navn = "Per" Per : Student studentid = "12345" navn = 'Kari' Kari : Student studentid = '44456' Inf1050 : Emne emnekode = 'Inf1050' Inf1000 : Emne emnekode = 'Inf1000' er meldt på er på ventelis iste er undervisning i er undervisning i Inf1050v08 : Kurs Inf1050v07 : Kurs er meldt på antallpaameldt = 300 antallplasser = 300 semester = 'v08' antallpaameldt = 278 antallplasser = 300 semester = 'v07' er meldt på 299 andre studenter: Student 278 studenter: te Studentt INF1050--32