1 19. januar 2012 Noen punkter fra i går Godkjente øvinger og prosjekt er obligatorisk for å få gå opp til eksamen Noen myter om systemutvikling Ariane 5 ulykken 2 Noen myter om systemutvikling Myte 1: Systemet må tilpasse seg datamaskinens krav (bruke få ressurser, være tilpasset fysisk arkitektur) Informasjonssystemet skal være tilpasset bruker og deres krav! Nøkkelord: Evolusjonær utvikling, evaluering av prototyper, brukergrensesnittdesign Myte 2: De beste datasystemer er de du selv bygger opp fra grunnen ( Not Invented Here -syndromet) Studier viser at det er overraskende lite gjenbruk av funksjonalitet eller kode mellom prosjekter! Undersøk først om det finnes standardprogrammer (eller et sett med standardkomponenter) som allerede dekker (deler av) behovene, eller som enkelt kan tilpasses til å dekke behovene Nøkkelord: komponentbasert utvikling 1
3 Myte 3: datasystemet skal automatisere gamle rutiner Systemutvikling dreier seg også om å identifisere forbedringsmuligheter og finne nye løsninger for å oppnå bestemte mål. Ofte vil innføring av nye datasystemer omlegge rutinene i en bedrift totalt Nøkkelord: Målanalyse, BPR Eksempler: Bank, bestille flybillett 4 En myte til Myte 4: Programvare er så fleksibel at den alltid kan endres senere 2
5 Noen flere myter Myte 5: Løsningen ligger i å bruke riktige verktøy A fool with a tool is still a fool Myte 6: Ansett flere programmerere hvis prosjektet er forsinket Brook s Mythical Man-Month: adding people to a late software project makes it later : Opplæring Antall kommunikasjonskanaler = n(n-1)/2 6 Faren ved gjenbruk: the Ariane 5 accident, 1996 Single root cause failure! The bug : attitude deviation stored as 2-byte integer (max value 65,535) in stead of 4-byte (max value 4,294,967,295) SW module was reused from Ariane 4 Insufficient V&V of detailed requriements: larger attitude deviation tolerated in Ariane 5 than in Ariane 4 Ariane 5 production cost 10 years and $7 billion; luckily no victims because it was unmanned. 65,535 = 00000000 00000000 11111111 11111111 65,536 = 00000000 00000001 00000000 00000000 3
7 Introduksjon til objektorientert analyse og design 8 Mål med forelesningen Formål Introdusere objektorientert design med UML Foreløpig innføring i klassediagram Opplæringsmål Grunnleggende om programvaredesign Hva er et design Hva er funksjonen til et design Når i utviklingsprosessen lager vi design Grunnleggende om klassediagram i UML Klasser med attributter og operasjoner Assosiasjoner mellom klasser og multiplisitet Generalisering og abstrakte klasser 4
9 Agenda Hva er et design? Fra kode til diagram: Et praktisk eksempel Design forklart Funksjonen til et design Utarbeidelse av klassediagram Kort om klassediagram Praktisk eksempel Avhengigheter og multiplisitet Generalisering og abstrakte klasser Praktiske råd om objektorientert design 10 OOAD i livsløpsperspektiv Krav Design Konstruksjon Testing Vedlikehold Her er vi i nå 5
11 Hva er et design? public class FlatFile { public Group load(file afile) throws java.io.ioexception, ParseException { Group agroup = new Group(); FileReader afilereader = new FileReader(aFile); BufferedReader areader = new BufferedReader(aFileReader); String line = areader.readline(); while (line!= null) { agroup.addperson(assembleperson(line)); line = areader.readline(); return agroup; private Person assembleperson(string line) throws ParseException { StringTokenizer tokenizer = new StringTokenizer(line, ";"); String name = tokenizer.nexttoken(); String email = tokenizer.nexttoken(); Date date = parsedate(tokenizer.nexttoken()); Person aperson = new Person(); aperson.setname(name); aperson.setemail(email); aperson.setbirthdate(date); return aperson; 12 Hva er et design? public class FlatFile { public Group load(file afile) throws java.io.ioexception, ParseException { Group agroup = new Group(); FileReader afilereader = new FileReader(aFile); BufferedReader areader = new BufferedReader(aFileReader); String line = areader.readline(); while (line!= null) { agroup.addperson(assembleperson(line)); line = areader.readline(); return agroup; private Person assembleperson(string line) throws ParseException { StringTokenizer tokenizer = new StringTokenizer(line, ";"); String name = tokenizer.nexttoken(); String email = tokenizer.nexttoken(); Date date = parsedate(tokenizer.nexttoken()); Person aperson = new Person(); aperson.setname(name); aperson.setemail(email); aperson.setbirthdate(date); return aperson; 6
13 Hva er et design? public class FlatFile { public Group load(file afile) throws java.io.ioexception, ParseException { Group agroup = new Group(); FileReader afilereader = new FileReader(aFile); BufferedReader areader = new BufferedReader(aFileReader); String line = areader.readline(); while (line!= null) { agroup.addperson(assembleperson(line)); line = areader.readline(); return agroup; private Person assembleperson(string line) throws ParseException { StringTokenizer tokenizer = new StringTokenizer(line, ";"); String name = tokenizer.nexttoken(); String email = tokenizer.nexttoken(); Date date = parsedate(tokenizer.nexttoken()); Person aperson = new Person(); aperson.setname(name); aperson.setemail(email); aperson.setbirthdate(date); return aperson; 14 Hva er et design? public class FlatFile { public Group load(file afile) throws java.io.ioexception, ParseException { Group agroup = new Group(); FileReader afilereader = new FileReader(aFile); BufferedReader areader = new BufferedReader(aFileReader); String line = areader.readline(); while (line!= null) { agroup.addperson(assembleperson(line)); line = areader.readline(); return agroup; private Person assembleperson(string line) throws ParseException { StringTokenizer tokenizer = new StringTokenizer(line, ";"); String name = tokenizer.nexttoken(); String email = tokenizer.nexttoken(); Date date = parsedate(tokenizer.nexttoken()); Person aperson = new Person(); aperson.setname(name); aperson.setemail(email); aperson.setbirthdate(date); return aperson; 7
15 Hva er et design? 16 Design forklart Design: Strukturen til et programsystem Implisitt design: Strukturen til koden Eksplisitt design: Diagrammer som beskriver strukturen til et programsystem med en spesifikk notasjon Notasjon Språk bestående av grafiske symboler for å beskrive (modellere) programvaresystem Regler for hvordan de grafiske symbolene kan brukes og knyttes sammen UML: Notasjon for objektorientert design 8
17 Design forklart Det er dette vi mener med et design i dette kurset Design: Strukturen til et programsystem Implisitt design: Strukturen til koden Eksplisitt design: Diagrammer som beskriver strukturen til et programsystem med en spesifikk notasjon Notasjon Språk bestående av grafiske symboler for å beskrive (modellere) programvaresystem Regler for hvordan de grafiske symbolene kan brukes og knyttes sammen UML: Notasjon for objektorientert design 18 Funksjonen til et design Hvordan lager vi et design? Gjenskape design ('reverse engineering') med utgangspunkt i kode Konstruksjonsplanlegging ('forward engineering') med utgangspunkt i krav Hvorfor lager vi et design? Gjøre et design for å kommunisere designet til andre Gjøre et design for å forstå krav eller kode (for oss selv og andre) Typer design Kladd Konstruksjonsplan (Programmeringsspråk) 9
19 Agenda Hva er et design? Fra kode til diagram: Et praktisk eksempel Design forklart Funksjonen til et design Design av klassediagram Kort om klassediagram Praktisk eksempel Avhengigheter og multiplisitet Generalisering og abstrakte klasser Praktiske råd om objektorientert design 20 Klassediagram Hensikten med diagrammet Beskrive klassene i systemet Beskrive hvordan klassene forholder seg til hverandre (relasjoner) Klasse Strukturen på fenomenet (i motsetning til objekt som er instansen av fenomenet) Attributter Operasjoner 10
21 Grunnelementene i et klassediagram Argument-liste Retur-type Diagram Operasjons-navn Klassenavn Attributter Operasjoner 22 Praktisk eksempel: Del 1 Meldingsbroen skal motta meldinger fra telefonsvarere og oversette meldingene til kommandoer. Kommandoene skal meldingsbroen sende til kjernesystemet. Meldingsbroen skal oversette responsen fra kjernesystemet til en melding som sendes tilbake til telefonsvareren. Meldingsbroen skal lytte på innkommende oppkoblinger fra telefonsvarerne. En telefonsvarer kan sende flere meldinger før den kobler seg fra meldingsbroen. Telefonsvareren skal sende en avslutningsmelding til meldingsbroen når den er ferdig med å sende meldinger. Meldingsbroen skal selv avslutte en oppkobling dersom det ikke har mottatt en melding fra telefonsvareren på 60 sekunder. Meldingsbroen skal ikke akseptere flere enn 10 oppkoblinger fra telefonsvarerne. 11
23 Praktisk eksempel: Del 1 Meldingsbroen skal motta meldinger fra telefonsvarere og oversette meldingene til kommandoer. Kommandoene skal meldingsbroen sende til kjernesystemet. Meldingsbroen skal oversette responsen fra kjernesystemet til en melding som sendes tilbake til telefonsvareren. Meldingsbroen skal lytte på innkommende oppkoblinger fra telefonsvarerne. En telefonsvarer kan sende flere meldinger før den kobler seg fra meldingsbroen. Telefonsvareren skal sende en avslutningsmelding til meldingsbroen når den er ferdig med å sende meldinger. Meldingsbroen skal selv avslutte en oppkobling dersom det ikke har mottatt en melding fra telefonsvareren på 60 sekunder. Meldingsbroen skal ikke akseptere flere enn 10 oppkoblinger fra telefonsvarerne. 24 Praktisk eksempel: Del 1 Meldingsbroen skal motta meldinger fra telefonsvarere og oversette meldingene til kommandoer. Kommandoene skal meldingsbroen sende til kjernesystemet. Meldingsbroen skal oversette responsen fra kjernesystemet til en melding som sendes tilbake til telefonsvareren. Meldingsbroen skal lytte på innkommende oppkoblinger fra telefonsvarerne. En telefonsvarer kan sende flere meldinger før den kobler seg fra meldingsbroen. Telefonsvareren skal sende en avslutningsmelding til meldingsbroen når den er ferdig med å sende meldinger. Meldingsbroen skal selv avslutte en oppkobling dersom det ikke har mottatt en melding fra telefonsvareren på 60 sekunder. Meldingsbroen skal ikke akseptere flere enn 10 oppkoblinger fra telefonsvarerne. 12
25 Klassediagram for meldingsbro 26 Klassediagram til kode class Oppkobling { Telefonsvarer telefonsvarer; Kjernesystem kjernesystem; Oppkobling(Telefonsvarer telefonsvarer, Kjernesystem kjernesystem) { this.telefonsvarer = telefonsvarer; this.kjernesystem = kjernesystem; 13
27 Klassediagram til kode class Oppkobling { Telefonsvarer telefonsvarer; Kjernesystem kjernesystem; Oppkobling(Telefonsvarer telefonsvarer, Kjernesystem kjernesystem) { this.telefonsvarer = telefonsvarer; this.kjernesystem = kjernesystem; Melding motta() { 28 Klassediagram til kode class Oppkobling { Telefonsvarer telefonsvarer; Kjernesystem kjernesystem; Oppkobling(Telefonsvarer telefonsvarer, Kjernesystem kjernesystem) { this.telefonsvarer = telefonsvarer; this.kjernesystem = kjernesystem; Melding motta() { Respons send(kommando enkommando) { 14
29 Klassediagram til kode class Oppkobling { Telefonsvarer telefonsvarer; Kjernesystem kjernesystem; Oppkobling(Telefonsvarer telefonsvarer, Kjernesystem kjernesystem) { this.telefonsvarer = telefonsvarer; this.kjernesystem = kjernesystem; Melding motta() { Respons send(kommando enkommando) { void sendtilbake(melding enmelding { 30 Klassediagram til kode class Oppkobling { Telefonsvarer telefonsvarer; Kjernesystem kjernesystem; Oppkobling(Telefonsvarer telefonsvarer, Kjernesystem kjernesystem) { this.telefonsvarer = telefonsvarer; this.kjernesystem = kjernesystem; Melding motta() { Respons send(kommando enkommando) { void sendtilbake(melding enmelding { void koblefra() { 15
31 Assosiasjoner og multiplisitet Assosiasjoner Viser relasjonen til en annen klasse Hel linje mellom to klasser Enveisrelasjon: Linjen er rettet fra kildeklassen til målklassen Toveisrelasjon: Pil i begge ender Multiplisitet Indikasjon på hvor mange objekter som fyller attributtet 1, 0..1, * 32 Klassediagram for meldingsbro 16
33 Assosiasjoner for meldingsbro 34 Multiplisitet i meldingsbro 17
35 Praktisk eksempel: Del 2 En melding består av et meldingshode og en meldingskropp på dette formatet: #<meldingshode>#<meldingskropp> Meldingshodet er et standard for alle meldingene på følgende format: <3-sifret meldingskode>,<bankid>,<meldingstidspunkt> Meldingen for å overføre penger har meldingskode 503, og med følgende meldingskropp: <fra_konto 11 siffer>,<til konto 11 siffer>,<beløp> Meldingen for å sperre konto har meldingskode 201, og følgende meldingskropp: <konto som skal sperres 11 siffer> 36 Klassediagram meldingsbro 18
37 Generalisering og aggregering Generalisering (arv) Superklasse og barneklasse Eks: Hund er en type dyr Aggregeringer ( består av relasjoner) Klasse som beskriver hvordan hvordan noe er satt sammen Eks.: Sykkel består av ramme, hjul, sete, styre osv. Hjul består av felg, slange, dekk, nav, eiker osv. 38 Klassediagram meldingsbro Generalisering 19
39 3 enkle triks Ikke bruk all tilgjengelig notasjon. Hold det så enkelt som mulig (KISS keep it simple stupid) Konseptuelle klassediagrammer fokuserer på datamodellen og er nyttige for å forstå et domene. Ikke prøv å modellere alt. Forkuser på de viktigste delene. 40 Hva skal vi modellere? Hva vi tar med i modellen avhenger av hva vi skal lage. Om vi skal modellere en bil kan vi fokusere på: Mekanikk motor, drivverk, vindusheiser, bremser etc. Software kontroll av forgasser, bremser, girkasse 20
41 Oppsummering Grunnleggende om programvaredesign Hva et design er Hva funksjonen til et design er Når i utviklingsprosessen lager vi design Grunnleggende om klassediagram i UML Klasser med attributter og operasjoner Assosiasjoner mellom klasser og multiplisitet Generalisering og abstrakte klasser 21