Introduktion. Lagom är bäst. OO eller ej? TDP004 Objektorienterad Programmering Fö 7 Objektorienterad design, tips och råd



Relevanta dokument
Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

TDDC76 - Programmering och Datastrukturer

Objektorientering - Arv och polymorfi. Eric Elfving Institutionen för datavetenskap

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

UML. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Imperativ programmering. Föreläsning 4

Classes och Interfaces, Objects och References, Initialization

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

Dynamisk bindning och polymorfism

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Objektorienterad Programkonstruktion. Föreläsning 6 23 nov 2015

F8: Typkonvertering i C++

Del2 Klasser, medlemmar och arv Ämnesområden denna föreläsning:

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

Introduktion till arv

Klasser. Kapitel 2. Kapitel 2 - Klasser, medlemmar och arv. Klasser. Klasser Medlemmar Arv

Objektorienterad Programmering (OOP) Murach s: kap 12-16

Tentamen i TDP004 Objektorienterad Programmering Teoretisk del

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Objekt-orienterad programmering. Klassbegreppet och C++ UML. UMLs fördelar

Objektorienterad Programmering (TDDC77)

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Outline. Objektorienterad Programmering (TDDC77) Att instansiera en klass. Objekt. Instansiering. Åtkomst. Abstrakt datatyp.

Programsystem konstruktion med C++ (2D1387) Innehåll. övning 2 klasser och arv

Enkla variabler kontra referensvariabel

Klasshierarkier - repetition

Objektorienterade programmeringsspråk. Objektorienterade språk. Den objekt-orienterade modellen. Jämför med icke-oo

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

Lösningsförslag till tentamen TDP004 Objektorienterad Programmering Teoretisk del

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Laboration 1 - Grunderna för OOP i Java

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

Laboration 2: Designmönster

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Arv. Objektorienterad och komponentbaserad programmering

Programmering för språkteknologer II, HT2014. Rum

Typhierarkier del 1 Gränssnitt, ärvning mellan gränssnitt, ärvning mellan klasser

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Målen med OOSU. Objektorienterad programmering. Objektorienterad programmering. Karlstads Universitet, Johan Öfverberg 1

Objekt, klasser. Tillstånd Signatur Kommunikation Typ. Fält, parametrar och lokala variabler. Konstruktorer Metoder DAVA15

OOMPA 2D1359 Föreläsning 2

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Chapter 4: Writing Classes/ Att skriva egna klasser.

Programmering B med Visual C

TDDC76 - Programmering och Datastrukturer

Objektorienterad Programmering (TDDC77)

I STONE. I Variabler, datatyper, typkonvertering. I Logiska och matematiska uttryck. I Metoder-returvärde och parametrar. I Villkorssatser if/else

OOP Objekt-orienterad programmering

Tentamen ID1004 Objektorienterad programmering October 29, 2013

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

TDDC76 Programmering och datastrukturer

Vad kännetecknar en god klass. Vad kännetecknar en god klass. F12 Nested & Inner Classes

Laboration 2: Designmönster

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

Polymorfi. Objektorienterad och komponentbaserad programmering

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Grundläggande programmering med C# 7,5 högskolepoäng

Exempel: Exempel: Exempel: Exempel: $djur=array("ko","katt","älg"); foreach ($djur as $d) { echo $d. " "; } Resultat. ko katt älg

Övningsuppgift. Bankkonton. Steg 2. Författare: Mats Loock Kurs: Inledande programmering med C# Kurskod:1DV402

Objekt-orienterad programmering och design. DIT953 Niklas Broberg, 2018

Outline. Objektorienterad Programmering (TDDC77) Laborationsserie del två. Vad händer under HT2. Introduktion HT2 UML.

Föreläsningsmaterial (Arv) Skrivet av Andreas Lund

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Objektorienterad Programmering (TDDC77)

TENTAMEN OOP

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Övningar Dag 2 En första klass

OOP Objekt-orienterad programmering

Principles of subclasses. Objekt-orienterad programmering och design Alex Gerdes, 2018

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Konvertering från sträng. Winstrand Development

Systemvetarutbildningen och dataekonomutbildningen

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Typecasting - primitiva typer. Innehåll. DoME klasser

Innehåll. dynamisk bindning. och programmering CRC) u Arv, polymorfi och

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

Programsystemkonstruktion med C++: Övning 2. Karl Palmskog september 2010

TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 3 Erik Nilsson, Institutionen för Datavetenskap, LiU

DIAGNOSTISKT PROV. Tid. Hjälpmedel. Antaganden. Rättning. Övrigt. Diagnostiskt Prov. Klockan Inga

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 11 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Abstrakta Klasser 2. Kodning är bara en liten del i programvaruutvecklingen 6% 1% 6% Abstrakta Klasser - deklaration. Programutveckling sker i faser

Objektorienterad programmering

Arv (Inheritance) Multipelt arv finns i verkligheten. Överskuggning, metodbindning. Läsanvisning: ! Arv! Object, instanceof! Relationer!

Kapitel 3. Synlighet. Kapitel 3 - Klassanvändning, operatorer och pekare. Synlighet

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

Del3 Klassanvändning, operatorer och pekare Ämnesområden denna föreläsning:

Design av en klass BankAccount som representerar ett bankkonto

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Separation of Concern. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Transkript:

Introduktion TDP004 Objektorienterad Programmering Fö 7 Objektorienterad design, tips och råd Vi har diskuterat vilka möjligheter till OO som erbjuds i C++. Vilka vill vi använda och varför? Allt har användningsområden men är de samma som problemet du vill lösa? Om man bara har en hammare så verkar alla problem vara en spik. Efterföljande speglar mina erfarenheter och frågor till flera verksamma C++programmerare. Inte tentamensmaterial, men användbart ändå. Lagom är bäst Ny teknik favoriseras pga nyhetens behag. En bra design använder den metod/design som passar bäst för ändamålet. Det är inte säkert att OO är det bästa i din situation I framtiden kanske vi går tillbaka till att använda mera procedurell programmering pga trådar (multi core CPU:er, assymetriska processorer etc) med olika exekveringshastigheter. OO eller ej? När ska man använda OO? Omöjligt att svara på. Vad tillåter språket? Finns det något som kan vara ett objekt? Har objekten egenskaper och data? Logiskt att spara dem i samma objekt? Potentiella subklasser? Ovanstående är bara godtyckliga bedömningar. 1

OO(?) exempel En beskrivning av ett system I en bank finns det olika sorters konton; sparkonto, långtidskonto och korttidskonto. Ett konto har minst en innehavare. Varje innehavare kan ha flera konton. På alla sorters konton kan man sätta in och ta ut pengar samt kontrollera innehavet. Kontona har olika räntor och denna ska beräknas på olika sätt enligt kap 2.4. Transaktionshistoriken ska sparas, och denna ska ha det innehåll som beskrivs i kap 3.1. En beskrivning av ett system, forts. Kap 2.4. Räntor för olika sorters konton ska beräknas månadsvis på sparkonto, årsvis på långtidskonto och dagsvis på korttidskonto. Räntorna är olika för olika sorters konton och ändras genom den existerande räntehanteraren. Kap 3.1 En transaktion ska innehålla summan som blev flyttad/insatt/uttagen samt vilket eller vilka konton som är involverade. Från beskrivning till klassdiagram I sin enklaste form kan ett objekt i en beskrivning bli en klass, en aktivitet blir en funktion och mängdförhållanden representerar just det. Objekt Aktiviteter Mängdförhållanden Identifiera klasser mm I en bank finns det olika sorters konton: sparkonto, långtidskonto och korttidskonto. Ett konto har minst en innehavare. Varje innehavare kan ha flera konton. På alla sorters konton kan man sätta in och ta ut pengar samt kontrollera innehavet. Kontona har olika räntor och denna ska beräknas på olika sätt för olika konton enligt kap 2.4. Transaktionshistoriken ska sparas, och denna ska ha det innehåll som beskrivs i kap 3.1. 2

Identifiera klasser mm, forts. Kap 2.4. Räntor för olika sorters konton ska beräknas för varje månad på sparkonto, för varje år på långtidskonto och för varje dag på korttidskonto. Räntorna är olika för alla sorters konton och ändras genom den existerande räntehanteraren. Kap 3.1 En transaktion ska innehålla summan som blev flyttad/insatt/uttagen och vilket eller vilka konton som är involverade. Klasser och aktiviteter Konton: sparkonto, långtidskonto, korttidskonto Innehavare Transaktionshistorik Räntor Räntehanteraren Sätta in/ta ut pengar, kontrollera innehavet Ändra ränta Beräkna ränta Spara transaktionshistorik Partiellt klassdiagram i fusk-uml på nästa bild. Transaction 1..n 1..n 1..n 1..n 1..n Account bool Deposit(double sum) bool Withdraw(double sum); const double GetBalance() const; virtual double CalculateInterest() = 0; bool SetInterestRate(double newrate); double m_balance; double m_interestrate; list<person*> m_accountowners; list<transaction*> m_transactionhistory; Person SavingsAccount ShortTermAccount LongTermAccount double CalculateInterest(); double CalculateInterest(); InterestHandler??? 1 OO exempel, diskussion double CalculateInterest(); Räntan ingen egen klass. Bara en variabel. Inga egna funktioner. InterestHandler en svart låda. Transaktionshistoriken list<transaction*>. Kunde ha varit TransactionHistory* med annan TransactionHistory-klass. Naturligt med arv från Account? Naturligt att Person är en fristående klass? Saknas funktioner för att ta bort/lägga till Person. Lätt exempel ingen entydig uppdelning. 3

Arv Tänk på virtuell destruktor i basklassen. Abstrakta klasser har användningsområde. Virtuella funktioner används med fördel då subklasserna utför beräkningarna på olika sätt. Polymorfi är kraftfullt. Även fördelaktigt om man är flera som parallellt programmerar på olika subklasser till samma superklass. Skilj på virtuella och rent virtuella funktioner. Shape Shape(double aheight, double awidth); Abstrakt basklass virtual double Calculate Area() = 0; Rectangle Triangle double CalculateArea() double CalculateArea() return height * width; return (height * width) / 2.0; Enkelt klassdiagram. Subklasserna definierar funktionen CalculateArea() på olika sätt. Konstruktorer etc i subklasserna utelämnade. Animal virtual void MoveToPosition(Position& pos); Abstrakta klasser Eagle void MoveToPosition(Position& pos) FlyToPosition(pos); Whale void MoveToPosition(Position& pos) SwimToPosition(pos); Har minst en rent virtuell funktion Omöjligt att skapa en instans av en abstrakt klass. När ska man använda abstrakta klasser? När det verkar ologiskt att kunna skapa en instans av något (tex djur på föregående bild. Vad representerar ett generellt djur?) Klasserna Eagle och Whale implementerar funktionen MoveToPosition från basklassen Animal. Inuti dessa anropas andra funktioner. Detta sätt att implementera funktioner kan ibland vara mera flexibelt. 4

Åtkomst Fundera noga över vad som ska vara public och private. Vad av det som är private kan tänkas vilja ärvas från den här klassen? Dessa är kandidater till att vara protected. Friend används med försiktighet. Bra ibland men långt ifrån alltid. Inkapsling Använd möjligheterna till inkapsling. Göm implementationen i en funktion, returnera const & / const* / const <typ> om returvärdet inte ska kunna ändras. Det som du vill att andra ska kunna titta på/ändra är public. Public data kan ändras utan att den ägande klassen vet om det. Private data och public gränssnitt (t.ex. get/set). Data/funktioner som ingen annan ska använda ska vara private. Tex hjälpfunktioner till den egna klassen. Inkapsling, forts. Fördelar Viktiga interna data är mera skyddade från misstag från andra klasser. Implementationen kan utvecklas utan att interfacet ändras. Dvs du kan ändra hur du löser en uppgift utan att någon utomstående behöver veta om det. Viktigt i större projekt. Minskar beroendet mellan klasserna: ingen utomstående vet vilka variabler som finns och kan inte vara beroende av dem. Composition vs Inheritance ( Has A versus Is A ) Ska en klass vara en subklass till en annan eller ska den tillgång till information från andra klasser? Läs beskrivningen av klasserna: Hålls de logiskt ihop? Verkar de beskriva liknande saker? Verkar det en finnas en vettig arvshierarki? Ofta föredrar man composition istället för inheritance. Arv orsakar ibland problem, dessa undviks ofta mha composition. Tänk på inkapsling och programmera defensivt. 5

Separera uppgifter Lätt hänt att en klass blir en hel verktygslåda som försöker lösa alla problem. Separera (arv och/eller composition) till flera klasser som var och en löser färre uppgifter vardera. Undersökningar visar att en klass komplexitet (och därmed buggarna) ökar kvadratiskt med antalet uppgifter i klassen. Gör en sak och gör den bra! Modularitet En klass/enhet/subsystem gör sin sak och har tillgång till den data och de funktioner som det behöver för att lösa det. Om möjligt försök att knyta ihop några klasser som sköter samma uppgifter/hanterar samma data till ett mindre system. Detta mindre system har sedan väldefinierade interface till resten av programmet. Cohesion Cohesion mäter hur fokuserade och sammanhängande klasserna i en modul är. Exempel på låg cohesion: Modul C använder endast data från modul D. Klasserna i modul C har ingen med varandra och göra. Exempel på hög cohesion: Klasserna arbetar tillsammans för att utföra en gemensam uppgift. Sträva efter hög cohesion. Coupling Coupling mäter hur klasser är beroende av/påverkar varandra. Exempel på hög coupling: Klass A påverkar B. Svårt att förstå klass A ensam. Svårt att återanvända klass A eftersom den kräver klass B. Sträva efter låg coupling. 6

Designmönster Design Patterns standardiserad arkitekturlösning med standardiserad terminologi, på ofta förekommande arkitekturproblem. Jämför med tex sorteringsalgoritm - standardiserad algoritmlösning på ofta förekommande algoritmproblem. Många olika patterns: Singleton, Adapter, Wrapper etc. Boken Design Patterns av Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Utgiven av Addison Wesley. Create-Init Konstruktorn returnerar inget. Gick viktiga initieringar bra? Problemet kan lösas mha Create-Init. // I MyClass.h static MyClass* Create( ); MyClass(); // Konstruktor bool Init( ) // I Init( ) sker viktiga initieringar! // I MyClass.cc Myclass* MyClass::Create( ) MyClass* res = NULL; res = new MyClass(); // Konstruktorn tar ingen this som parameter. if (false == res->init( )) delete res; res = NULL; return res; Typkonverteringar Gör typkonverteringar om det behövs. Bättre att konvertera en gång för mycket än en gång för lite. Konvertera åt rätt håll, oftast till decimaltal/högre noggrannhet. Avsaknad av konverteringar kan ge svårfunna buggar och kod som ser rätt ut. Tips från verkligheten STL är väldigt kraftfullt. const. Allt som kan bör vara const: variabler, returvärden, inparametrar och funktioner. Kompilatorn är duktig på att hitta fel. Vettiga variabel-, funktions- och klassnamn. Ett (skräck)exempel ur det verkliga livet: float BerBrf(int hix, int mix, int pix)?!?! Vettiga och korrekta kommentarer. 7

Tips från verkligheten, forts. "The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time." Hofstadter's law: "It always takes longer than you expect, even when you take into account Hofstadter's law." Stens lag: 90% av alla programmerare är 90% klara 90% av tiden. Sammanfattning Composition är ofta att föredra framför arv men även arv har sin plats. Modularitet och inkapsling. Använd const och STL. Designvalen är sällan svartvita. Det tar tid att bli bra på programmering och design öva! 8