Introduktion till objektorienterad programmering (OOP) Sömnighetsfaktor = 3... Eva Pärt-Enander Klassbegreppet Vad är en klass? Svar: datatyp, mall Beskriver egendenierad datatyp. Klassdenition = representation (data) + operationer som kan utföras på objekt i klassen (medlemsfunktioner, metoder). Mall/mönster. Beskriver hur en samling objekt med samma uppbyggnad och egenskaper ser ut. 0-0 1 Ett objekt som tillhör en klass sägs utgöra Skilj på klass och objekt! en instans av klassen. Ett objekt är: modell av verkligt eller tänkt föremål Man denierar en klass, men brukar ofta skapa (instansiera) många objekt (instanser) av klassen. en slags variabel, själva förekomsten begränsad livstid: skapas, används/ändras, dödas har tillhörande attribut och metoder Objekten är fristående; en operation på ett objekt påverkar endast detta objekt. Dock gäller att objekt i samma klass har samma operationer (metoder, medlemsfunktioner). 2 3
Objektorientering Ett av de senaste inneorden i datavärlden. Man baserar uppbyggnaden av ett programsystem på de objekt som ingår i systemet istället för att utgå från de funktioner som systemet skall uppfylla. Programmet består av ett antal väl avgränsade enheter som kallas objekt. Objektorienterad programutveckling är ett slags modellbygge. Består av tre faser (iterativt): 1. Objektorienterad analys (OOA): Vad skall göras? 2. Objektorienterad design (OOD): Hur skall det göras? 3. Objektorienterad programmering (OOP): Implementera systemet! Objektorienteringens tre principer: Inkapsling: Gömma objektets attribut inne i objektet; oåtkomliga utifrån och kan bara förändras av objektet självt. Information hiding. Återanvändbarhet: Program uppbyggd på färdiga, väl uttestade komponenter medför att programutvecklingen: har lägre kostnad går snabbare får högre kvalitét. Mångformighet: Överlagring av funktioner och annat smart... 4 5 Uppnn inte hjulet igen! Vänj dig vid Objektorientering i praktiken: återanvändning. Använd h-ler och cpp-ler! Ändringsbarheten ökar om programmet uppbyggt i era självständiga moduler (klasser). Ej luddigheter! Låt varje modul utföra en speciell, väl denierad uppgift. Ändring av program = utbyte av moduler. Generella metoder! En programkomponent är återanvändbar om den är anpassbar till olika förhållanden (=olika sorters problem). Undvik utskrift/inläsning i metoder som ej direkt är avsedda för utskrift/inläsning. Lär dig förpackningsteknik! Utnyttja inkapsling. Undvik använda selektorer i onödan, använd istället metoder med objekt som parameter. 6 7
Objektorienterad analys (OOA): Vad??? sätta sig in i problemet förstå förutsättningar göra en första, grov, idealiserad modell av programmet nna objekt (substantiv) och operationer (verb) beskriva attribut, fastställa relationer a mellan objekt (iterativt) förutse, underlätta för kommande ändringar Objektorienterad design (OOD): Hur??? planera den objektorienterade programmeringen (ganska ytande mellan analys- och designfasen). konkretisera modellen i analysfasen, lägg till detaljer objekt för objekt delas in i systemdesign: kommunicera med omgivning, vilket OS?, vilket fönsterhanteringssystem? hantering av avbrott,... scenarier (användningsfall) dokumenteras i form av diagram systemutvecklingsmetod = arbetsschema, symbolspråk, t ex OMT b, UML c a se association, aggregat och arv nedan b Object-Oriented Modeling Technique c Unifyed Modeling Language objektdesign: utgå från objekten i analysfasen, ange algoritmer, hur skall objektoperationer utföras? parametrar? Använda redan färdiga objekt? Vilket programspråk? OOP: C++, JAVA, etc 8 9 Objektorienterad programmering (OOP): Implementera!!! Programmeringsprocessen: Ibland liknas processen vid följande schema: realisera analys design i form av ett 1. Intension, vision. bra, körbart datorprogram: 2. Specikation. korrekt: felfritt (minskar underhållskostnaden) eektivt: utnyttja datorresurser väl (ex. realtidssystem) 3. Analys och design. 4. Implementation. 5. Verikation. återanvändbart: billigare i längden ändringsbart: byt ut en hel modul, inkapsling 6. Produktion. 7. Modikation. Under hela processen: dokumentation 10 11
Specikation Hur indata avbildas på utdata. Dokumentation Skall skrivas från början och innefatta alla faser i processen. Beställarens önskemål = kravspecikation. användarmanual: Andra krav: portabilitet skrivs i förväg bygger på scenarier återförs på beställaren användarvänlighet systemdokumentation: eektivitet (CPU-tid och minnesutrymme) design noggrannhet implementation robusthet testning (testfall, resultat) Problem: att hålla aktuell! 12 13 Relationer mellan klasser och objekt: I OOP försöker man identiera objekten och klasserna + bestämma relationer mellan objekt. Verikation T ex: Hur skall vi låta objekt samarbeta och testning mot specikationen integrera för att uppnå den mest korrekta, exibla och bästa lösningen? kan bara påvisa fel förutsägbara testresultat Finns fem olika typer av relationer mellan objekt och klasser: svårt att testa många krav 1. klass-objekt 2. användning 3. association 4. aggregat 5. arv 14 15
Användningsrelation (utnyttjar) Klass-objekt-relation (förekomst av) Vanligaste relationen mellan objekt. Denna relation existerar alltid för ett objekt. Klassen beskriver typen på objektets samtliga dataelement, operationer + implementering av dessa. Testmening: objektet är en förekomst av klassen. Klassen klassicerar objektet. Ex. Innebär att ett objekt använder ett annat objekt genom att utföra en operation på det. Objekten samarbetar. Testmening: utför operation på, använder, utnyttjar. Ex. BankKonto Lisas; BankKonto Olles("Olle Olsson", 12300); Person jag(``nisse Olsson); Bil volvo(1999);... jag.koer_frammaat( volvo ); 16 17 Associationsrelation mellan två objekt (känner till) Aggregatrelation (har) Innebär en koppling mellan objekten (enkel- eller dubbelriktad). Kommunicerar med ett annat objekt, utan att vara uppbyggt av detta andra objekt. Ett objekt är uppbyggt av andra objekt och använder dessa för att tillhandahålla sin funktionalitet. Objekt som attribut. Är en pekare från ett objekt till ett annat. Kan vara en till en, en till många eller många till en. Kan ha associationer mellan objekt i samma klass. Relationen kan studeras utifrån det omslutande objektet (som innehåller andra objekt) utifrån det inneslutna objektet (som ingår i ett annat objekt). Skall ej blandas ihop med aggregat... Testmening: har koppling till, känner till, för varje X nns ett Y, pekar på. Skall ej blandas ihop med association... Testmening: består av, innehåller, har. Ex. En bil kan ha en person som ägare. Implementeras som att Bil-klassen har ett attribut som är pekare till objekt som hör till Person-klassen. Ex. En bil har en bensintank, en motor och fyra hjul. En bok består av kapitel. En bil har inte en ägare! (se association) 18 19
Arvsrelation (är) Dessutom... Polymor (mångformighet) Unik relation för objektorientering. En klass har vissa allmänna egenskaper som kan vara gemensamma med andra klasser. Arv sker mellan klasser och inte mellan objekt. Vid denition av ny klass (subklass) ärver man egenskaper från en annan existerande klass (basklass) och beskriver sedan skillnaden gentemot basklassen. Testmening: Är en, är ett. Ex. En bil är ett fordon, sparkonto är ett bankkonto, en ekorre är ett däggdjur. Polymor betyder mångformighet, t ex överlagring av funktioner/metoder och s k generiska programenheter (mallar, templates). Överlagring innebär att en programkonstruktion som ser ut på ett visst sätt kan innebära olika saker (t ex anrop av olika funktioner/klassmetoder), beroende på typerna av de ingående operanderna. Jfr. överlagrade konstruktorer. Generisk programenhet är en generell mall som programmeraren kan utgå ifrån för att på enkelt sätt skapa programkod. Kan användas för både funktioner och klasser. Kodbesparande! 20 21 Ex. Antag att vi har klassen Bil: class Bil private: int nr; public: ; Bil()nr = 0; Bil( int in ) nr = in; int haemta_nr() return nr; void Skriv() cout << "Bil av årsmodell: " << nr << ". "; Exempel på funktioner med samma namn, men olika datatyper: cout << "Max av " << a << " " << b << " = " << max( a, b ) << endl; cout << "Max av " << ett << " " << tvaa << " = " << max( ett, tvaa ) << endl; volvo.skriv(); opel.skriv(); cout << endl; cout << "Max = "; max( volvo, opel ).Skriv(); cout << endl; return 0; int max( int tal1, int tal2 ); double max( double tal1, double tal2 ); Bil max( Bil nr1, Bil nr2 ); int max( int tal1, int tal2 ) if ( tal1 > tal2 ) return tal1; int main() else return tal2; int a = 2, b = 11; double ett = 12.44, tvaa = 56.99; Bil volvo(1999), opel(1980); double max( double tal1, double tal2 ) if ( tal1 > tal2 ) return tal1; 22 23
else return tal2; Bil max( Bil nr1, Bil nr2 ) if ( nr1.haemta_nr() > nr2.haemta_nr() ) return nr1; else return nr2; Körning ger: Max av 2 11 = 11 Max av 12.44 56.99 = 56.99 Bil av årsmodell: 1999. Bil av årsmodell: 1980. Max = Bil av årsmodell: 1999. Exempel på mallen swap som byter värden mellan två variabler. template<class Type> void swap( Type a, Type b ) Type temp = a; a = b; b = temp; int main() Bil volvo(1989), saab(1999); int tal1 = 1, tal2 = 2; volvo.skriv(); swap(volvo, saab); volvo.skriv(); saab.skriv(); cout << endl; saab.skriv(); cout << endl; cout << tal1 << " " << tal2 << endl; swap(tal1,tal2); cout << tal1 << " " << tal2 << endl; return 0; 24 25 Sammanfattning: Körning ger: Bil av årsmodell: 1989. Bil av årsmodell: 1999. Bil av årsmodell: 1999. Bil av årsmodell: 1989. 1 2 2 1 Den objektorienterade modellen ger ett system som är en bra modell av verkligheten, mer modulariserat, enklare att förändra och bygga ut, eventuellt genererar återanvändbara komponenter, gör utvecklaren mer produktiv samt har en enhetlig terminologi och modell i alla delar av systemets livscykel. Eriksson: Objekt-orienterad programutveckling med C++ Vid OOP försöker man skriva korrekta, eektiva, återanvändbara och ändringsbara program genom att låta de enskilda modulerna i ett program utgöras av objektobjekt som möjliggör inkapsling. För att veta vilka objekt som behövs, så utgår man från den design som tidigare gjorts. Skansholm: C++ direkt 26 27
Viktigast inom OOP Inkapsling: Samla ihop objektets egenskaper till ett enda ställe i programmet. Gömma detaljerna som hör till ett visst objekt. Modierbart! Arv: Man skall kunna utgå från andra objekts egenskaper och lägga till nya egenskaper. Återanvändning! Polymor: En viss operation kan utföras på objekt av olika typer med olika implementationer för varje typ, t ex beräkna ytan av en grask gur ha en ytberäkningsfunktion i varje klass. yta <--- FIGUR / \ yta<-- CIRKEL REKTANGEL-->yta \ KVADRAT-->yta 28