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

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

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

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

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

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

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

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

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

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

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

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

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

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 (DIT953) Niklas Broberg, 2018

Generics och polymorfism. 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 Alex Gerdes, 2016

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

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

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

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

Classes och Interfaces, Objects och References, Initialization

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

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

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

Introduktion. Grundkursen

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

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

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

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

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

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

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

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

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

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

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

Instuderingsuppgifter läsvecka 2

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

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

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

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

Tentamen Programmering fortsättningskurs DIT950

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

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

Föreläsning 15: Repetition DVGA02

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

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Inkapsling (encapsulation)

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

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

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

Objektorienterad programmering

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

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

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

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

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

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

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

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

Imperativ programmering. Föreläsning 4

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

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

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

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

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

Seminarierna Instruktioner. Övningarna Viktiga relationer

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

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

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

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

Objektorienterad analys och design

Objektorienterad programmering

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

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

Objektorienterad programmering, allmänt

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

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

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

Föreläsning 4. Polymorfism. Polymorfism Dynamisk bindning Inkapsling Information hiding Access-metoder och mutator-metoder

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

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

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

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

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

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

Objektorienterad Programmering (TDDC77)

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

Objektorienterad Programmering (TDDC77)

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

Java-syntax (arv) Exempel: public class Crow extends Bird {... } Jämför med Lab 1: public class FirstApp extends Frame {... }

Outline. Objektorienterad Programmering (TDDC77) Åsidosättning. Signatur. Åsidosättning. Abstrakta klasser. Ahmed Rezine.

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

Föreläsning 13 Innehåll

Transkript:

Dependencies High cohesion, low coupling Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 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)

Tillbakablick Klasser vs objekt, initialisering, static vs non-static Primitiva typer vs referenstyper, variablers statiska vs dynamiska typ, dynamisk bindning, overload vs override Polymorfism, subtypning, generics, co- vs contra- vs in-varians Arv, abstrakta klasser, interfaces; komposition, delegering Mekanismer - Relation till (framförallt) OCP och LSP

Framåtblick Designprinciper Designmönster, relation till principer (Kort om exceptions (mekanism))

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. Utvecklaförfö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 öppen kopplingspunkt (dvs möjlighet att skapa beroenden) ska vara avsiktlig. Varje öppen 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å.

Interface Segregation Principle No client should be forced to depend on methods it does not use. Om ett objekt A är stort, med mycket funktionalitet, och objekt B beror på en liten del av denna funktionalitet: Introducera en abstraktion vars gränssnitt är precis den del av A som B behöver 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

Exempel på abstraktion Funktionell nedbrytning Ge en metod eller ett attribut en mer restriktiv access modifier (e.g. public -> private) Gör klass privat inom paket Ta bort metodsignatur ur interface Introducera interface mellan klass och klient Introducera interface som kopplingspunkt till paket

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). Allt utöver detta är överkurs.

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 senare.) 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 starkt 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

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 i nästa block. 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