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

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

Separation of Concern. 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

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

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

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 Alex Gerdes, 2016

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

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

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

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

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

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

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

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

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

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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:

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

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

Java, klasser, objekt (Skansholm: Kapitel 2)

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

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

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

Programmering = modellering

Föreläsning 5-6 Innehåll

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

Tentamen i Objektorienterad modellering och design Helsingborg

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

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

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

Objektorienterad programmering

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

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

DAT043 - föreläsning 8

Objektorienterad programmering, allmänt

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

Designmönster, introduktion. Vad är det? Varför skall man använda mönster?

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

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

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

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

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

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

Föreläsning 13 Innehåll

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

Introduktion och OO. 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

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

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

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

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

Inkapsling (encapsulation)

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

Lösningar till tentamen i EDAF25

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

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

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

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

Tentamen i Objektorienterad modellering och diskreta strukturer

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

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

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

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

Observer Pattern och MVC. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

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

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

Stackar, köer, iteratorer och paket

Föreläsning 2. Objektorienterad analys och design. Analys: att modellera världen. Design: att strukturera program.

Objektorienterad Programkonstruktion. Föreläsning 7 24 nov 2015

Länkade strukturer. (del 2)

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

Viktiga programmeringsbegrepp: Kontrakt

Funktioner. Programmering. Egendefinierade funktioner i Java. En Java-funktions anatomi. hh.se/db2004. Statiska metoder. Funktioner. resultatvärde.

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

OOP Objekt-orienterad programmering

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

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

TDDC74 FÖRELÄSNING 9 ANDERS MÄRAK LEFFLER IDA/HCS

Transkript:

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

Separation of Concern principle Do one thing do it well. Separation of Concern är inte specifikt för objekt-orientering, utan en generell maxim för all programmering. Termen ursprungligen från Edsger W. Dijkstra, som syftade på systematisk användning 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.

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 kan lägga på overhead vars kostnad för små projekt överstiger vinsten. Tumregel: Använd Separation of Concern som default låt alla avsteg 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 delsteg 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 återkommande delsteg. Möjliggör separat testning av delsteg. Sätter namn på delsteg, 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 och purity En sidoeffekt är en observerbar effekt av ett metodanrop utöver returvärdet. T ex: modifikation av data, skriv till en fil, rita grafik, skicka paket över nätverket... En metod utan sidoeffekter, vars returvärde endast beror på dess argument (både explicita och implicita), kallas pure. En pure metod kan man anropa hur många gånger som helst och alltid få samma svar (såvida ingen annan metod med sidoeffekter har ändrat argumenten).

Pure eller impure? Pure Pure int add(int x, int y) { return x + y; } int add(int x, int y) { long time = System.currentTimeMillis(); return x + y; }

Pure eller impure? Impure Pure Point center(point p) { Point newpoint = p; newpoint.move(0,0); return newpoint; } Point center(point p) { Point newpoint = new Point(p); newpoint.move(0,0); return newpoint; }

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.

Command-Query Separation Principle En metod ska antingen ha sidoeffekter (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.

Command-Query Separation Principle Vissa metoder från Javas standardbibliotek bryter mot Command-Query Separation Principle. T ex: Iterator.next(), Stack.pop(), Om principen bryts se till att det görs av en god anledning, ä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?

Single Responsibility Principle A class should have only one reason to change. (Robert C. Martin) Robert C. Martin ( Uncle Bob ) är en av författarna till The Agile Manifesto. SRP är en central aspekt av Agile software development "Gather together the things that change for the same reasons. Separate those things that change for different reasons. alternativ formulering, Robert C. Martin igen.

Varför SRP? Att ha classes som följer SRP ger många fördelar (det börjar bli lite upprepning..): Robusthet: 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...

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 + drawer : DrawPolygons + centerpoint : Point + updatecenter(int,int) : void + polygons : ArrayList<Polygon> + frame : JFrame + ticker : int + direction : boolean + update() : void + main(string[]) : void Rectangle Triangle Square

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

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