Modulär design Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Relevanta dokument
Modulär design. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Separation of Concern. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016 Johannes Åman Pohjola, 2017

Dependencies High cohesion, low coupling. Objekt-orienterad programmering och design Alex Gerdes, 2018

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

Dependencies High cohesion, low coupling. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

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

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

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

Classes och Interfaces, Objects och References, Initialization

Mutability och State. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

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

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

Lambdas. (och fler design patterns) Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

Generics och polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Principles of subclasses Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

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

Design Patterns. Objekt-orienterad programmering och design Alex Gerdes, 2016

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

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

Design Patterns Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

Generic type declarations. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Objekt-orienterat vs funktionellt Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Model View Controller. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016 Johannes Åman Pohjola, 2017

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

Sammanfattning och Tentamensinfo Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Introduktion. Objekt-orienterad Programmering och Design (TDA551) Alex Gerdes, HT-2016

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

JUnit. Ska kompletteras med kodexempel på JUnit. DD2385 Programutvecklingsteknik Några bilder till föreläsning 12 21/5 2012

Design Patterns. Objekt-orienterad programmering och design Alex Gerdes, 2018

Introduktion och OO. Objekt-orienterad Programmering och Design (TDA552) Alex Gerdes, HT-2018

UML Objektdiagram. Objektorienterad modellering och design (EDAF25) Föreläsning 3. UML Sekvensdiagram. UML Objektdiagram. Agenda

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design Alex Gerdes, 2016

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

Objektorienterad programmering

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

Programmering = modellering

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

Subtyping och variance. Objekt-orienterad programmering och design Alex Gerdes, 2018

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

Objekt-orienterat vs funktionellt Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

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

Objektorienterad programmering, allmänt

Viktiga egenskaper hos ett program (Meyer): Objektorienterad programmering, allmänt. Vilka egenskaper vill vi att våra program ska ha?

Undantag, Sammanfattning och Tentamensinfo. Objekt-orienterad programmering och design Alex Gerdes, 2016

Föreläsning 10. ADT:er och datastrukturer

Föreläsning 6. Använd beskrivande namn

Introduktion. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

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

Tentamen i Objektorienterad modellering och design

SOLID är en akronym för fem stycken designprinciper som används vid mjukvaruutveckling. SOLID står för:

Static vs Dynamic binding Override vs Overload. Objekt-orienterad programmering och design Alex Gerdes och Sólrún Halla Einarsdóttir, 2018

Objekt-orienterat vs funktionellt Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

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

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

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

Kursombud. Objektorienterad modellering och diskreta strukturer / design. Agile? Designprinciper EDAF10 EDA061. Lennart Andersson. Grupper för projekt

Observer Pattern och MVC. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Tentamen i Objektorienterad modellering och design Helsingborg

Principer, Patterns och Tekniker. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Lösningsförslag till tentamen i EDAF25 Objektorienterad modellering och design Helsingborg

Introduktion. Grundkursen

Principer, Patterns och Tekniker. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Objekt-orienterad Programmering och Design. TDA551 Alex Gerdes, HT-2016

DAT043 - föreläsning 8

Välkommen till. Datastrukturer, algoritmer och programkonstruktion. eller DOA

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Objektorienterad Programmering (TDDC77)

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Principer, Pa+erns och Tekniker. Objekt-orienterad programmering och design Alex Gerdes, 2018

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

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

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

Föreläsning 5-6 Innehåll

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

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

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

TDA550 Objektorienterad programmering, fortsättningskurs. Föreläsning 1. Introduktion Variabler och typer

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Tentamen i EDAF25. 1 juni Skrivtid: Skriv inte med färgpenna enda tillåtna färg är svart/blyerts.

Objekt-orienterad Programmering och Design. TDA552 Alex Gerdes, HT-2018

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

Föreläsning 13 Innehåll

Java, klasser, objekt (Skansholm: Kapitel 2)

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

Arrayer. results

Föreläsning 1. Introduktion Utveckla för förändring

Inkapsling (encapsulation)

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Föreläsning 5. När skall man använda implementationsarv? När skall man använda implementationsarv?

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

Att skriva till och läsa från terminalfönstret

TDDD78, TDDE30, 729A Typhierarkier del 2 Vad krävs? Hur fungerar det?

Dagens program. Objektorienterad modellering och diskreta strukturer / design. Model/View/Control-implementering. Model/View/Control-arkitektur

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

TENTAMEN OOP

HT1 2013, FÖRELÄSNING 14 (INFÖR TENTAN)

OOMPA 2D1359 Föreläsning 2

Viktiga programmeringsbegrepp: Kontrakt

Imperativ programmering. Föreläsning 4

Transkript:

Modulär design Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Vad är ett bra program? I kursen pratar vi om bra kod utifrån ett utvecklar-perspektiv, dvs det som gör koden lätt att (vidare-)utveckla. Reusability Extensibility Maintainability Enkelt, läsbart Testbart Robust (vid förändringar)

Separation of Concern principle Do one thing do it well. Separation of Concern är inget specifikt för objekt-orientering, utan en generell maxim för all programmering. Termen ursprungligen från Edsger W. Dijkstra, som syftade på det systematiska användandet av abstraktion: Betrakta en sak i taget, och håll alla andra så abstrakta som möjligt, för att bättre förstå och bestämma hur denna enda sak bör hanteras.

Modulär design Ett system som uppfyller Separation of Concern kallas modulärt: Ett programsystem är för stort för att kunna förstås i sin helhet. Vi måste bryta ner det i delsystem för att förstå. Denna process kallas dekomposition. Ett modulärt system är uppdelat i identifierbara abstraktioner på olika nivåer t ex classes, delkomponenter, paket, subsystem. Customer + name : String # phonenr : PhoneNumber + sendorder() : void + receiveorder() : void Order - receiptnumber: int - items: List<Sandwich> + getreceiptnumber(): Panini Sandwich {abstract} # name : String + getname() : String + getprice() : int Baguette public class Customer { public void sendorder(){ } public void receiveorder(){ } } + getprice() : int + getprice() : int System Subsystem Packages Delkomponenter Classes Metoder

Modulär design Fördelar med en välgjord modulär design: Uppdelning av ansvar Komplexiteten reduceras Lätt att utvidga Moduler går att återanvända Moduler går att byta ut Moduler går att testa Tillåter parallell utveckling

Modularitet Ju mer välspecificerad uppgift en komponent* har, och ju enklare dess gränssnitt och implementation är, desto större chans är det att komponenten kan: Återanvändas i andra sammanhang. Utökas med mer funktionalitet i andra komponenter Läsas och förstås lätt Testas isolerat från andra moduler Motstå förändringar gjorda i andra moduler (robustness) * Komponent = metod, class, package, - principerna gäller på alla nivåer

A word of moderation Ju större projekt ju fler inblandade personer, ju fler rader kod, ju fler delsystem, ju längre livslängd etc desto större behov av Separation of Concern, och allt det medför. Det omvända gäller förvisso också: ju mindre projekt, desto mindre blir kostnaden av att strunta i designprinciper. Att följa designprinciper, inklusive Separation of Concern, kan lägga på overhead vars kostnad för små projekt överstiger vinsten. Rule of thumb: Använd alltid Separation of Concern som default låt alla avsteg från principen vara medvetna!

Modularitet på olika nivåer Roadmap för dagens föreläsning: Modularitet för metoder Dekomposition (uppdelning) med avseende på specifik uppgift Functional decomposition Modularitet för classes Uppdelning med avseende på ansvar Single Responsibility Principle Modularitet för paket och sub-system Uppdelning med avseende på aspekter Modell vs kontroll

Modularitet för metoder På metod-nivå tillämpar vi functional decomposition ( funktionell nedbrytning ) för att reducera komplexiteten: Enklare del-beräkningar eller -beteenden bryts ut till egna metoder som anropas från den ursprungliga metoden med rätt argument. Ger flera fördelar, väl utfört: Reducerar den kognitiva komplexiteten i varje (del-)metod. Möjliggör code reuse för del-beräkningar och -beteenden som återkommer. Möjliggör separat testning av del-beräkningar och -beteenden. Sätter namn på del-beräkningar och -beteenden, vilket ger högre grad av abstraktion och förståelse. Följer OCP: Större chans att framtida förändringar kan återanvända och utöka, istället för att behöva ändra.

Live code Rectangle.getCorners()

Abstraktion kräver bra namn För variabler, använd namn som specificerar vad de representerar. Typiskt substantiv centerpoint isf xy, rotation isf degrees För metoder, använd namn som indikerar deras syfte och beteende. Typiskt verb eller verb-fraser sort, print, add, getrotation, isempty

Live code Mystery.x()

Sidoeffekter En sidoeffekt av en metod är varje modifikation av data när metoden anropas, som är observerbar utanför metoden. Om en metod inte har några sidoeffekter kan man anropa den hur många gånger som helst och alltid få samma svar (såvida ingen annan metod med sidoeffekter har anropats under tiden). En metod som inte har några sidoeffekter kallas pure. (Haskell har purity som default, sidoeffekter enbart i IO (typ).)

Quiz A a = new A(); int r = a.method(1) a.method(1); Vad är värdet på r? Svar: Utan purity, ingen aning!

Principer för sidoeffekter Grundkonventionen i objekt-orienterade språk (konvention, inte regel) som Java är att metoder får ha sidoeffekter. För att undvika förvirring krävs att vi upprätthåller vissa principer: Sidoeffekter ska vara väl deklarerade och intuitivt lätta att förstå, utifrån en metods namn, signatur, dokumentation, och kontext. Generellt är det acceptabelt att metoder uppdaterar tillståndet (attribut) hos sitt implicita argument, dvs objektet som metoden anropas på. En metod bör inte förändra andra objekt de explicita argumenten, eller tillgängliga statiska variabler ( global state mer senare). mylist.addall(otherlist); Vi förväntar oss att otherlist ska vara oförändrad efter anropet, men att mylist har ändrats.

The Command-Query Separation Principle En metod ska antingen ha sido-effecter (en mutator) eller returnera ett värde (en accessor), inte båda. En metod som returnerar information om ett objekt ska inte ändra tillståndet hos objektet. En metod som ändrar tillståndet hos ett objekt ska som regel inte samtidigt returnera information om objektet.

Quiz Nämn några metoder från Javas standardbibliotek som bryter mot Command-Query Separation Principle. Svar: Iterator.next(), Stack.pop(), Om principen bryts se till att det görs av god anledning, och är mycket väldokumenterat och intuitivt lätt att förstå. Om en mutator också returnerar information, se till att det finns en ren accessor som kan returnera samma information utan sidoeffekt. E.g. Stack.peek()

God abstraktion för metoder Väl utförd functional decomposition hänger på bra abstraktion: Bra namngivning Inga överraskningar Inga oönskade sidoeffekter Om (och endast om) vi har bra utförd abstraktion kan vi uppnå fördelarna med modularitet: Reducerad komplexitet, lätt att förstå, lätt att testa,

Modularitet för classes Vi säger att en class ska ha ett väl avgränsat ansvarsområde. Vad innebär det? Hur definierar vi konkret ett ansvarsområde?

Live code DrawPolygons Shape

Single Responsibility Principle A class should have only one reason to change. (Robert C. Martin) A class should have at most one reason to change. Mitt förtydligande; Martins formulering tar inte hänsyn till immutabilitet (mer senare). Robert C. Martin ( Uncle Bob ) är en av författarna till The Agile Manifesto. SRP är en central aspekt av Agile software development

Varför SRP? Att ha classes som följer SRP ger många fördelar (det börjar bli lite upprepning..): Robusthet: Om funktionalitet behöver förändras minskar risken för sammanblandning, och förändringar kan hållas väl avgränsade. Testning: En class med ett väl avgränsat ansvarsområde är lättare att testa separat från annan funktionalitet. Easy access: All kod som rör ett visst ansvarsområde kan hittas på ett enda ställe Bra namngivning av classes gör detta lättare.

Live code Refactor DrawPolygons Fundera över Shape

Modularitet för paket/subsystem Samma principer som gäller för komponenter på lägre nivåer gäller även för större delar. Vi delar upp med avseende på aspekt eller funktion. E.g.: Datamodellen bör inte blandas samman med kontrollen. Modeller för olika data-aspekter bör modelleras separat från varandra. Olika topp-nivå-beteende ( applikationer ) bör inte bo tillsammans.

Java packages Språk-feature för att definiera väl avgränsade komponenter på högre nivå än classes. Lägg filerna som hör ihop i en separat mapp, med samma namn som paketet. Lägg till en package declaration högst upp i filerna: package DIT952.shapes; I andra filer som ska använda paketet, lägg till import statements: import DIT952.shapes.*; Obs! shapes är inte ett package, DIT952.shapes är. Även i andra subpackages till DIT952 måste hela sökvägen anges.

Point JComponent JFrame ArrayList Polygon <<abstract>> DrawPolygons Rectangle + drawer : DrawPolygons + centerpoint : Point + updatecenter(int,int) : void Triangle Square + polygons : ArrayList<Polygon> + frame : JFrame + ticker : int + direction : boolean + update() : void + main(string[]) : void

Point JComponent JFrame ArrayList Polygon <<abstract>> DrawPolygons Rectangle + drawer : DrawPolygons + centerpoint : Point + updatecenter(int,int) : void Triangle Square + polygons : ArrayList<Polygon> + frame : JFrame + ticker : int + direction : boolean + update() : void + main(string[]) : void

Live code DIT952.polygons

Sammanfattning: Modulär design Väl utförd modularisering dvs uppdelning i separata och väl avgränsade komponenter ger många fördelar: Reusability Extensibility Maintainability Enkelt, läsbart, överblickbart Testbart Robust (vid förändringar) Precis de aspekter vi är ute efter i den här kursen!

Cliffhanger Nu har vi DIT952.polygons som ett eget subpackage vi har löst de utåtgående beroendena. Vi har dock fortfarande inåtgående beroenden på interna implementationsdetaljer, som gör det svårt att byta ut DIT952.polygons mot till exempel DIT952.shapes. Hur kan vi göra DIT952.polygons bättre avgränsad? Väl-definierat gränssnitt till hela sub-paketet. Väl genomtänkta kopplingspunkter. Väl inkapslad (encapsulated) intern implementation och representation.

What s next Block 5-2: Introduktion till Design patterns