Problemlösning
• Alla större projekt ”misslyckas”, eftersom det är
omöjligt för utvecklarna att till fullo förstå uppgiften
som ska lösas och vilka alla problem som är inneboende
i uppgiften.
– Antaganden måste klargöras
– Möjliga feltolkningar måste undanröjas
• När problem/uppgifterna blir större, måste lösningen
delas in i hanterliga delar
• Denna teknik är fundamental för programvaruutveckling
• I objektorienterad utveckling delas lösningen in i objekt
och klasser
Analys och design
med hjälp av CRC
40
41
OOA&D
Programutveckling sker i faser
• Design
– Kräver förståelse för uppgiften/problemet
• Här: starkt förenklat version
• Passar bara mindre projekt
• Fem delmoment:
–
–
–
–
–
• Analys
Fastställa och analysera förutsättningarna/kraven
Skapa en design
Implementera koden
Testning
Dokumentation
• OBS! Testning och dokumentation ska ske
parallellt med de övriga momenten.
42
43
Fastställa och analysera förutsättningarna/
kraven
OOA&D
•
•
•
•
• Modeller underlättar kommunikation
–
–
–
–
–
– Kräver språk för att uttrycka designen i
– Kräver ett strukturerat arbetssätt
– Bygger på erfarenhet
– Syftar till att få fram en OO modell som går att
implementera
• Design och analys hör ihop
Oberoende av programspråk
Abstraherar från oväsentliga detaljer
Underlättar ”testning” i tidigt skede
CRC-kort
UML (ett modelleringsspråk för OO utveckling)
Vad ska göras?
Vilka begränsningar finns?
Är alla oklarheter utredda?
Gör modeller/utkast
• Undvik att tänka på implementationen
44
45
Skapa en design
Implementation
• Bestäm klasser, objekt och metoder som behövs
– Vad finns redan?
• Bestäm algoritmer för problemlösningen
• I princip oberoende av programmeringsspråk
• Översättning av design till källkod
• Implementationen fokuserar på kod-detaljer
• Alla viktiga beslut tas vid analys och design
– Diagram
– Pseudokod
• Designa för återanvändning?
– Det är svårare att göra generella lösningar
– Kan löna sig i framtiden
– Återanvändning har varit en stor anledning till OOboomen
46
47
Testning och dokumentation
• Tester måste konstrueras för extremer,
svagheter och gränsfall
• Med tester ska fel finnas och inte
undvikas
• Testa tidigt och ofta
• Det är inte bara kod som kan testas
• Dokumentera fortlöpande
V modellen
DRIFT &
UNDERHÅLL
Validera kraven
ANALYS
ACCEPTANSTEST
SYSTEM
DESIGN
Verifiera
designen
PROGRAM
DESIGN
SYSTEMTEST
ENHETS- & INTEGRATIONSTEST
KODNING
48
Vad kännetecknar en god klass
• En odelad, väldefinierad abstraktion
• Uppgiften kan beskrivas kort och tydlig
• Namnet är en substantiv eller adjektiv som
beskriver abstraktionen på ett adekvat sätt
• Har ett koncist och sammanhängande gränssnitt
• Har tillstånd och beteende
• Representerar en mängd möjliga run-time objekt
• Problemet ska delas upp i “lämpliga” klasser
Cohesion och Coupling (sammanhörighet och
koppling)
Metoderna i varje klass ska ha stark sammanhörighet
Klasserna ska vara löst kopplade (oberoende av varann)
50
49
OOA&D med CRC-kort
• Analys
– Förstå problemet/uppgiften
– Utveckla en OO modell av problemet
• Design
– Utveckla en OO modell av lösningen
• Modeller underlättar kommunikation
– Oberoende av programspråk
– Abstraherar från oväsentliga detaljer
– Underlättar ”testning” i tidigt skede
• CRC-kort
• UML(ett modelleringsspråk för OO utveckling)
• Rollspelsdiagram
51
CRC ”Metoden”
Kandidater?
• Grupparbete(4-6 personer)
• Hitta kandidatobjekt
• Filtrera kandidatobjekten
• Skapa CRC-kort för kvarvarande kandidatobjekt
• Definiera scener för testning av modellen (testfall)
• ”Spela in” scener m.h.a rollspelsdiagram (testa)
• Uppdatera CRC-korten och scenerna
52
Filtrering
• Oavsett metod så måste man göra en
bearbetning av kandidaterna
• Brainstorming
– Fokuserat utforskande
– Okritiskt förhållningssätt i genereringsfasen
– Kräver bra förståelse och analys
• Substantiv & adjektiv i uppdragsbeskrivning
– Lätt metod
– Kräver en vettig och inte allt för ordig och lång
beskrivning
• Mix
53
CRC-kort
• Class-Responsibilities-Collaborators
• Klass-ansvar-sammarbetspartner
• Ett CRC-kort motsvarar en klassbeskrivning
– Så att god klass-design uppnås
– Liknande kandidater slås ihop
– Skippa kandidater som:
• Inte går att benämna med ett substantiv eller
adjektiv
• Beskriver imp. detaljer, egenskaper, utan direkt
ansvar, modellerar GUI, ”systemklasser”, utanför
ramarna, …
54
Scenarier
• Informellt verktyg för att ta fram och utvärdera olika
alternativ
55
RPD
• Exempel på hur systemet används
• Hur gör man för att ta fram scenarier?
– Brainstorming, Vilka använder systemet, hur
använder man systemet, vilka kommer i kontakt
med systemet, …
• Så ”heltäckande” det går
• Kräver en gedigen förståelse och analys av
uppgiften
56
• Börja med några väldigt enkla
57
Uppdatera CRC-korten
Efter några scenarion…
• När CRC-korten är någorlunda stabila kan
de ”göras om” till mera formella
klassdiagram
– Design
58
59
Cohesion
Klassdiagram
• Varje metod ska vara “ansvarig” för bara en
uppgift
• Cohesion mäter huruvida en metod uppfyller detta
krav
• Ju mer en metod fokuserar på en enda uppgift,
desto
• UML
– enklare är det att finna ett bra namn
– enklare och förståeligare blir koden
• Metoder med stark samhörighet kan lättare ändras
utan att andra metoder påverkas
Det ska vara möjligt att beskriva en metod med en
enkel mening med ett verb och ett objekt
60
Cohesion: Exempel 1
Cohesion: Exempel 2
• Exempel 3:
• Exempel 1:
public void setNameAndAge (String name, int age);
Bättre:
public void setName (String name);
public void setAge (int age);
public void setFirstName (String name){
firstName = name;
}
public void setLastName (String name){
lastName = name;
fullName = firstName + ”” + lastName;
}
Exempel 2:
/* Anropas en gång om året */
public void calculateHolidays();
{
holidays += new Holidays();
age++;
}
Bättre:
public void setFirstName (String name) {
firstName = name;
fullName = firstName + ”” + lastName;
}
Bättre:
public void calculateHolidays();
public void incrementAge();
61
public void setLastName (String name){
lastName = name;
fullName = firstName + ”” + lastName;
}
62
63
Coupling
Kategorier av metoder
• Konstruktorer
– Skapa instanser
• Selektor (get-metod)
– Returnerar information om objektets tillstånd
• Mutator (set-metod)
– enklare är det att förstå en enstaka klass
– enklare och förståeligare blir systemet som helhet
– Ändra objektets tillstånd
• Annat
– Gör någonting
En metod ska tillhöra bara en kategori
64
UML: Klassrelationer
• Ju starkare relation desto starkare koppling (
svag koppling
sämre)
• Dependency
Klass1
<<beror på>>
Klass 2
• Association
Klass1
relation
Klass 2
• Komposition!
Klass1
Klass 2
• Arv
Klass1
Klass 2
• Klasserna ska vara så oberoende som möjligt av
varandra
• Coupling mäter hur starkt klasserna är kopplade
• Ju lösare klasserna är kopplade, desto
stark koppling
66
• Klasserna med lös koppling kan lättare ändras
utan att andra klasser påverkas
Systemet blir lättare att ändra
Mera flexibilitet
PROBLEM: Arv skapar starka kopplingar
65