Introduktion til programmering UML, Uge 45 Computer science, kap 7, særl. 7.4 og 7.5. Martin Fowler: UML distilled, kap. 3. Addision-Wesley, 2004.
Diagrammer Diagrammer er visuelle fremstillinger af beskrivelser der består af en lang række simple ens sætninger Diagrammer er abstraktioner. De udelader en mængde detaljer Diagrammer er redskaber til at reducere kompleksitet.
Hvornår diagrammer? Diagrammer er nødvendige når tingene bliver komplicerede Kør Beggars and Philanthropists
Entity-relation De simple sætninger: Entitet har Egenskab Entitet A står-i-relation-til Entitet B Relation Egenskab Entitet
ER-diagram Et kæledyr har et navn Et kæledyr har en fødselsdag Et kæledyr er ejet af en person Navn Navn ErEn 1 Art Kæledyr M M Species Fødselsdag Dødsdag Ejet af 1 Person Navn
Kald-struktur Structure chart De simple sætninger Funktion A kalder funktion B A B
HTML-tabellen def makehtmlpage(tablecontents): return makestart() + maketable(tablecontents) + makeending() def maketable(tablecontents):. htmltabel += makerow(row) return htmltabel def makerow(rowcontents):. htmlrow += makecell(cell). return htmlrow
HTML-tabellen makehtmlpage(tablecontents): makestart() maketable(tablecontents) makeending() makerow(rowcontents): makecell(cell)
Brugsscenarier Use case diagrams Defineret ved formål Aktør interagerer med Systemmodul Formål her: brugerne og udvikleren retter simuleringen så den passer med brugernes teori
Dataflow De simple sætninger Kilde producerer data En klient producerer en forespørgsel Data forsvinder i afløb En klient konsumerer en html-side Proces A omdanner data fra proces B og leverer resultatet til proces C En forespørgsel omdannes til en sqlkommando Process A henter data fra lager En sql-forespørgsel henter et svar fra en sqldatabase Process A gemmer data på lager En sql-kommando indsætter en række i en tabel Source/ sink Process
Eksempel Python program Client cgi.fieldstorage Construct sqlcommand SQL-server Sql-command Handle sqlcommand Sql-command Layout information Tuple of tuples Database Make webpage Html code Client
UML klassediagrammer De simple sætninger Klasse A er en underklasse/overklasse af klasse B En liste er en underklasse af klassen sekvens Et universitet er en underklasse af klassen organisation Klasse A er en del af/har delen klasse B En liste indeholder objekter som dele Et fakultet er en del af et universitet Klasse A står i relation til klasse B Et institut udbyder uddannelser Klasse A afhænger af klasse B En Python webcrawler er afhængig af httplib Klasse A har attributten B En sekvens har egenskaben længde En ansat har egenskaben lønramme Klasse A kan udføre metoden B En liste kan udføre metoden append Et fakultet kan ansætte og fyre ansatte
Generalisering/specialisering Klasse A er en underklasse/overklasse af klasse B Underklassen arver alle overklassens egenskaber og metoder >>> len('xxx') 3 >>> len([1,2,3]) 3 >>> len((1,2,3)) 3 >>> 'xxx'.isalpha() True >>> (1,2,3).isalpha() Traceback (most recent call last): File "<pyshell#9>", line 1, in <module> (1,2,3).isalpha() AttributeError: 'tuple' object has no attribute 'isalpha' >>> String +isalpha() +isdigit() Sequence -length +slicing() +() Tuple List +append() +extend()
Aggregering/dekomponering Klasse A er en del af/har delen klasse B
Organisationer: Århus Universitet
Metoder og attributter De simple sætninger Klasse A kan udføre metoden B Klassen A har attributten B class Ledelse: def init (self, medlemmer, organisation): self.medlemmer = medlemmer self.organisation = organisation def udnaevn(self, medlem): self.medlemmer.append(medlem) def fjern(self, medlem): self.medlemmer.remove(medlem)
Klasser Underklassens navn Overklassens navn Instans af underklassen Underklassens init Overklassens init class Organisation(Entitet): def init (self, navn,addresse, ledelse): Entitet. init (self,navn, addresse) self.ledelse = ledelse En instans af klassen dannes ved at skrive klassens navn efterfulgt af init s parametre, undtagen self. Man kalder i virkeligheden init (en constructor ) enorganisation = Organisation( Årh Univ, Ringgaden,enLedelse) Self betyder: mig, denne instans. Man refererer til instansens egenskaber ved at skrive self.egenskab, altså min egenskab. Hvis klassen er en underklasse af en overordnet klasse, skal underklassens init kalde overklassens init
Delvis implementering class Entitet: def init (self, navn,addresse): self.navn = navn self.addresse = addresse def verbalize(self): print vars(self) class Organisation(Entitet): def init (self, navn,addresse, ledelse): Entitet. init (self,navn, addresse) self.ledelse = ledelse class Uddannelse(Organisation): def init (self, navn,addresse, ledelse, tilknytning): Organisation. init (self, navn,addresse, ledelse) self.tilknytning=tilknytning class Universitet(Organisation): def init (self, navn,addresse, ledelse, fakulteter): Organisation. init (self, navn,addresse, ledelse) self.fakulteter = fakulteter class Fakultet(Organisation): def init (self, navn,addresse, ledelse, fagområde,institutter,uddannelser): Organisation. init (self, navn,addresse, ledelse) self.fagområde = fagområde self.institutter = institutter self.uddannelser = uddannelser class Institut(Organisation): def init (self, navn,addresse, ledelse,fagområde): Organisation. init (self, navn,addresse, ledelse) self.fagområde = fagområde class Ledelse: def init (self, medlemmer, organisation): self.medlemmer = medlemmer self.organisation = organisation def udnaevn(self, medlem): self.medlemmer.append(medlem) def fjern(self, medlem): self.medlemmer.remove(medlem) class Ansat(Entitet): def init (self, navn,addresse, lønramme,cpr,bankkonto): Entitet. init (self,navn, addresse) self.lønramme = lønramme self.cpr = cpr self.bankkonto = bankkonto if name == ' main ': imv = Institut('imv','IT-byen',[],'IT') humfak = Fakultet('hum fak','nobelparken',[],'humaniora',[imv],[]) imv.verbalize() humfak.verbalize()
Implementering Aggregering: en liste af komponenterne Associationer: en list af de associerede objekter Specialisering: subklasser Attributter: variable knyttet til klassen Metoder: funktioner knyttet til klassen
Opgave Skriv Python-kode der implementerer ovenstående UML-diagram. Generer instanser af jeres klasser. Check at de er rigtige ved hjælp af kommandoen vars(instans). Den udskriver instansens dictionary. Metoderne behøver I ikke at implementere fuldt. I kan nøjes med at de printer deres eget navn: def sendbesked(self,besked): print 'besked sendes' Husk: En instans af klassen dannes ved at skrive klassens navn efterfulgt af init s parametre, undtagen self. Altså: enorganisation = Organisation( Årh Univ, Ringgaden,enLedelse) Man kalder i virkeligheden init (en såkaldt constructor ) Self betyder: mig, denne instans. Man refererer til instansens egenskaber ved at skrive self.egenskab, altså min egenskab. Hvis klassen er en underklasse af en overordnet klasse, skal underklassens init kalde overklassens init
Patterns: reduktion af kompleksitet Standardløsninger på hyppige problemer State pattern Løser problemet at en instans ikke kan skifte klasse Når man bliver lektor skal man oprette en helt ny ansat
Associationer Klasse A står i relation til klasse B Multiplicitet Kan være en vigtig afgørelse Kan samme uddannelse ligger under to fakulteter? Tværfaglighed: Ja Studieordninger: Nej Økonomi: Nej
Afhængigheder: Det lille system på hjemmesiden EnkeltWebSide DynamicWebPages sql database htmlroutines MySQLdb cgi
Kobling Coupling Afhængigheder mellem moduler Kan man rette i eet modul uden at skulle rette i andre moduler? Skal være lav.
Sammenhæng Cohesion Sammenhæng indenfor det enkelte modul Logical cohesion: en klasse repræsenterer en sammenhængende verden. Functional cohesion: en klasses metoder kalder hinanden. Skal være høj.