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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Static vs Dynamic binding Polymorfism. 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 (DIT952) Niklas Broberg, 2017

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

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

Introduktion. Grundkursen

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Classes och Interfaces, Objects och References, Initialization

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

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

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Föreläsning 1. Introduktion Utveckla för förändring. Grundkursen. Programming in the small. Koncept som är kända från grundkursen (?

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

Objektorienterad programmering

Föreläsning 15: Repetition DVGA02

Tentamen Programmering fortsättningskurs DIT950

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

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Observer Pattern och MVC. Objekt-orienterad programmering och design Alex Gerdes, 2016

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

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

Föreläsning 1. Introduktion Utveckla för förändring. Grundkursen. Programming in the small. Koncept som är kända från grundkursen (?

Tentamen i Objektorienterad modellering och design

Inkapsling (encapsulation)

Instuderingsuppgifter läsvecka 2

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

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

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

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

Seminarierna Instruktioner. Övningarna Viktiga relationer

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

Imperativ programmering. Föreläsning 4

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

Objekt-orienterad utveckling. Objektorienterad analys och design. Objekt-orienterad programutveckling. Objekt-orienterad analys och design: Litteratur

Objektorienterad analys och design

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

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

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

Programmering = modellering

OOMPA 2D1359 Föreläsning 2

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

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

Mer OOP. Variation i typ. Medlen repetition. Generiska klasser. Gränssnitt - Interface. Mer om klasser Några exempel UML

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

Tentamen i Objektorienterad modellering och design Helsingborg

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

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

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

Objektorienterad programmering

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

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

Objektorienterad programmering, allmänt

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

Objekt-orienterad utveckling. Objektorienterad analys och design. Objekt-orienterad programutveckling. Objekt-orienterad analys och design: Litteratur

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

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

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

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

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

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

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

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

UML: Exempel. Ett modelleringsspråk. UML: Ansvar. UML: tre huvudanvändningar. Exempel: En klass position storlek. UML Unified Modelling Language

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

Tentamen ID1004 Objektorienterad programmering October 29, 2013

Tentamen i Objektorienterad modellering och diskreta strukturer

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

Integritetsprincipen. Objektorienterad modellering och diskreta strukturer / design

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

Transkript:

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

Vad är ett bra program? Korrekt? Effektivt? Användbart? Flexibelt? Robust? Skalbart? Enkelt? Läsbart? Testbart? Maintainable? Reusable? Extensible? Fokus för denna kurs! Externa faktorer (berör användare) Interna faktorer (berör utvecklare)

Småskalig programmering Triviala program Få klasser Några 100-tal rader kod En eller ett fåtal programmerare Ingen eller kort livstid Just do it

Storskalig programmering Mycket komplexa programsystem Flera miljoner rader kod 100-tals programmerare, geografiskt utspridda Lång livstid Software engineering Behov av verktyg Behov av processer

Objekt-orientering Objekt-orientering är en metodik för att rätt använd! reducera komplexitet i mjukvarusystem. Rätt använd ger objekt-orientering stora möjligheter till: Code reuse Extensibility Easier maintenance Fel använd riskerar objekt-orientering att skapa extra komplexitet Big ball of mud Det finns mycket dålig kod därute Det finns väldigt många missförstånd kring objekt-orientering.

Design Designen (modellen) utgör underlaget för implementationen. Bra design minskar kraftigt tidsåtgången för implementationen. Brister i designen överförs till implementationen och blir mycket kostsamma att åtgärda. Vanligaste misstaget i utvecklingsprojekt är att inte lägga tillräckligt med tid på att ta fram en bra design. Bra design är svårt! I allmänhet bör mer tid avsättas för design än för implementation.

Maintenance (underhåll) All systems change during their life cycles. This must be borne in mind when developing systems expected to last longer than the first version. (Ivar Jacobson) Fel måste fixas. Mjukvara måste uppdateras till nya användarkrav. Den som ändrar koden är sällan den som ursprungligen skrev den. Största delen (~80%) av pengarna och tiden under ett systems livstid går till underhåll. Utveckla för förändring!

OCP: The Open-Closed Principle Software modules should be open for extension, but closed for modification. Vårt mål är reusability, extensibility, maintainability. OCP är kärnan i vår metodik för att uppnå detta.

Modulär design 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: Lätt att utvidga Moduler går att återanvända Uppdelning av ansvar Komplexiteten reduceras Moduler går att byta ut Tillåter parallell utveckling.

Cohesion Cohesion ( sammanhållning ) är ett mått på den inre sammanhållningen i en modul (e.g. metod, class, package, ). Hur väl samverkar komponenterna inom modulen? Vi eftersträvar high cohesion dvs när samtliga komponenter samverkar för att lösa modulens ansvarsområde, utan att behöva samverka med komponenter i andra moduler. Hur autonom är modulen? Klarar den sitt uppdrag på egen hand? Hur väldefinierat är modulens ansvarsområde? High cohesion Low cohesion

Coupling Coupling ( sammanbindning, koppling ) är ett mått på hur starkt beroendet är mellan två olika moduler. Hur autonom är modulen? Klarar den sitt uppdrag på egen hand? Hur väl avgränsad är modulen? Tillåter den andra moduler att bero på dess inre implementation? För att få en flexibel och modulär design måste ingående moduler vara så oberoende av varandra som möjligt. Vi eftersträvar low coupling mellan moduler. Har vi starka kopplingar kommer förändringar i en modul framtvinga förändringar i andra moduler som är beroende av den bryter mot OCP. Low coupling High coupling

Återanvändning High cohesion och Low coupling lägger grunden för återanvändning av komponenter. Ju mer välspecificerad uppgift ett subsystem har, och ju enklare dess gränssnitt är, desto större chans är det att subsystemet kan att återanvändas i andra sammanhang.

Dependency Inversion Principle Depend on abstractions, not on concrete implementations. Beroenden behövs! Men för en bra design gäller: Minimera antalet beroenden. Ha så lösa beroenden som möjligt (DIP). Ha kontroll över beroendena. Varje beroende ska vara avsiktligt. Varje kopplingspunkt (dvs möjlighet att skapa beroenden) ska vara avsiktlig. Varje kopplingspunkt ska ha ett väldefinierat gränssnitt.

Abstraktion [A]bstractions may be formed by reducing the information content of a concept [ ], selecting only the aspects which are relevant for a particular purpose. Wikipedia Abstraktion för våra syften handlar om att exponera så lite information som möjligt, för att göra beroenden så lösa som möjligt. Ju mindre en class (package, ) exponerar (metoder, attribut, ), desto mindre finns det för andra att bero på.

Encapsulation Encapsulation is the packing of data and functions into a single component. [ ] It allows selective hiding of properties and methods. Wikipedia Encapsulation ( inkapsling ) är en specifik språkmekanism i e.g. Java som hjälper oss att åstadkomma abstraktion. Notera: Encapsulation är vårt verktyg - abstraktion vårt (del-)mål.

Encapsulation i Java Fyra access modifiers: public tillgänglig för alla som vill private tillgänglig enbart i den egna klassen (inte ens subklasser) package private tillgänglig för alla inom samma package protected tillgänglig för alla inom samma package, samt subklasser till den egna klassen (även i andra packages) För classes: public eller package private (default) För metoder och attribut: public, protected, package private (default), private

UML Unified Modelling Language Grafiskt modelleringsspråk för att beskriva olika aspekter av objektorienterade system. Ett hjälpmedel för att: Kommunicera design. Förstå vilka beroenden ett system innehåller eller möjliggör. Upptäcka problem på en högre nivå än att försöka förstå ogenomtränglig spaghetti-kod.

Klassdiagram: Relationer Två grundläggande typer av relationer mellan classes och interface, med vardera två styrkor : Förhållande mellan subclass (subinterface) och superclass (superinterface): Generalisering (Is-A) En class (interface) är en direkt subclass (subinterface) till en annan class (interface). Realisering (implements) En class implementerar ett interface. Förhållande som anger grad av kännedom om annan class eller interface: Association (Has-A) En class har attribut (fields) som håller objekt av en annan class (interface). Beroende (usage dependency) En class (interface) använder eller skapar objekt av en annan class (interface).

Live code

Beroenden? Vilka beroenden finns i vår design? Steg ett: Rita UML

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

Low coupling? Vår design har löjligt många, och fullständigt ogenomtänkta, beroenden. Steg två: fundera över vilka beroenden som är rimliga och inte.

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

Mutual dependencies Beroenden mellan två klasser åt båda håll är (nästan) aldrig rimligt! Starka beroenden (association) åt båda håll är extra dåligt. Om A beror av B och B beror av A så är de i praktiken en enhet. Det finns specialfall då detta är rimligt men det ska i så fall designas mycket medvetet. Slutsats: DrawPolygons och Polygon bör inte båda bero av varandra.

Data model vs controller Vi har i princip alltid klasser som representerar vår datamodell, och klasser som hanterar denna modell. Klasserna som representerar data bör vara självständiga. Ger möjlighet till återanvändning i andra sammanhang. (Mycket mer om Model-View-Controller pattern nästa vecka.) Slutsats: Polygon bör inte bero av, eller ens känna till, DrawPolygons. Inte heller bör subclasses av Polygon göra det.

DIP: Dependency Inversion Principle Bero på abstraktioner, inte på konkreta implementationer. Slutsatser: DrawPolygons bör inte direkt bero på ArrayList. DrawPolygons bör inte vara starkt associerat med JFrame. DrawPolygons bör inte bero på konkreta subclasses till Polygon.

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

Minska beroenden Steg 3: Fundera över hur beroenden kan minskas. Detta är vad vi kommer spendera kommande veckor på!

Ansvar I en bra design vill vi att varje del (paket, class, metod) har ett väl avgränsat ansvarsområde. High cohesion. Mer om Single Responsibility Principle och Separation of Concern Principle nästa vecka. Fråga: Har DrawPolygons ett väl avgränsat ansvarsområde?

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

Quotes Any intelligent fool can make things bigger and more complex. It takes a touch of genius and a lot of courage to move in the opposite direction. (Albert Einstein) Simple can be harder than complex. You have to work hard to get your thinking clean to make it simple. But it s worth it in the end because once you get there, you can move mountains. (Steve Jobs)

What s next Block 4-2: Separation of Concern, introduktion till Design Patterns