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

Relevanta dokument
Introduktion. Grundkursen

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

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

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

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

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

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

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

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

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

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

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

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

Sammanfattning och Tentamensinfo 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

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

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 11 Jonas Lindgren, 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?

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

Mjukvarudesign. Designprocessen. Teknisk design. Konceptuell design

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

Objektorienterad programmering

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

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

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

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

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

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

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

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

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

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

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

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

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

Kursplanering Objektorienterad programmering

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

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

Programmering = modellering

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

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

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

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

Course Contents. Objektorienterad programmering. Goals. Buzzwords. Course overview (1) Book. Objektorienterad programmering d2. DAT050, 16/17, lp 2 1

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

Objektorienterad programmering

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

Preschool Kindergarten

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

Designmönster/Design patterns

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

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

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

Föreläsning 15: Repetition DVGA02

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

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

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

Objektorienterad konstruktion

Tentamen. DD2385 Programutvecklingsteknik vt 2013 Onsdagen den 22 maj 2013 kl Hjälpmedel: penna, suddgummi, linjal

Kursutvärderare: IT-kansliet/Christina Waller. General opinions: 1. What is your general feeling about the course? Antal svar: 17 Medelvärde: 2.

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

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

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

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

2.1 Installation of driver using Internet Installation of driver from disk... 3

Instuderingsuppgifter läsvecka 2

Beijer Electronics AB 2000, MA00336A,

Design. Vad lärde jag mig förra lekfonen? Hur bidrog jag Fll lärandet? Kravhantering sammanfa0ning 13/04/14

Configuration testing Why? Vad det är tänkt att koden ska göra. Performance testing Kommentarer Skriva om koden som kommentar

Seminarierna Instruktioner. Övningarna Viktiga relationer

Mönster. Ulf Cederling Växjö University Slide 1

OOMPA 2D1359 Föreläsning 2

PROGRAMMERING. Ämnets syfte. Kurser i ämnet

Analys och design. Objekt. Klass. med hjälp av CRC. Klassdiagram

Föreläsning 17 UTBLICK: FORTSÄTTNINGSKURSER I DATAVETENSKAP + ANDROID

Laboration 2: Designmönster

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

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

Imperativ programmering. Föreläsning 4

Linköpings universitet 1 TDP029. Systemutveckling. Systemutveckling. Vanliga faser. Fler faser. Systemutvecklingsmetod

Objektorienterad analys och design

Objektorienterad programmering. Grundläggande begrepp

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

Föreläsning 1, vecka 6: Abstraktion genom objektorientering

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

Programmeringsteknik F1/TM1

Att välja och planera ett projekt

Tentamen Programmering fortsättningskurs DIT950

Isolda Purchase - EDI

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

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

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

Flervariabel Analys för Civilingenjörsutbildning i datateknik

Adding active and blended learning to an introductory mechanics course

Laboration 2: Designmönster

Plats för projektsymbol. Nätverket för svensk Internet- Infrastruktur

Support Manual HoistLocatel Electronic Locks

Transkript:

Grundkursen Föreläsning 1 Introduktion Utveckla för förändring I grundkursen fick ni: lära er de grundläggande principerna för objektorienterad programmering lära er de grundläggande konstruktionerna i programspråket Java bekanta er med klassbiblioteket i Java konstruera enkla program. 2 Koncept som är kända från grundkursen (?) klasser typomvandling uppräkningstyper klassvariabler synlighetsmodifierare metoder överlagring metodsignatur subklass överskuggning klasshierarki interface UML m.m objekt enkla variabler räckvidd instansvariabler inkapsling instansmetoder värdeanrop arv association polymorfism abstrakta klasser anonyma klasser strömmar Programming in the small typer omslagsklasser referensvariabler attribut konstruktorer klassmetoder referensanrop superklass relationer dynamisk bindning abstrakta metoder paket exceptionella händelser 3 triviala program ett litet antal klasser några 100-tal rader kod en eller ett fåtal programmerare ingen eller kort livstid programmera direkt -metoden 4

Mjukvarans livscykel kodstandard testverktyg versionshantering... Documentation io n c at rifi e V Andra programmerare än de som utvecklade systemet utför uppdateringar och systemunderhåll. - behov av utvecklingsverktyg Refinement Coding software engineering Pr od uc tio n Te sti ng Ingen person kan vara insatt i och förstå alla enskilda delar i systemet. lång livstid Sp e c ific atio n kanske 100-tals programmerare som är geografiskt utspridda nce ena in t Ma Kommersiella programsystem har lång livstid och kraven på systemen förändras under deras livstid. Ny funktionalitet läggs till. kanske flera miljoner rader kod Risk Analysis mycket komplexa programsystem n sig De Programming in the large En stabil design och en bra dokumentation är mycket viktigt. - behov av utvecklingsprocesser -... 5 Mjukvarukvalité 6 Mjukvarukvalité Egenskaper som är viktiga och synliga för användarna (externa faktorer): Användbarhet (usability) är systemet lätt att använda? Korrekthet (correctness) fungera systemet i enlighet specifikationen? Robusthet (robustness) klarar systemet av oförutsedda situationer utan att krascha? Tillförlitlighet (reliability) systemet är tillförlitligt om det är korrekt och robust. Fullständighet (completeness) uppfyll systemet användarnas behov? Tillgänglighet (availability) hur ofta går systemet ner? Effektivitet (efficiency) klarar systemet av att ge efterfrågad service inom rimlig tid och med rimliga resurser? Flexibilitet (flexibility) kan systemet anpassas för individuella behov? Skalbarhet (scalability) kommer systemet att fungera korrekt även om om det problem som handhas skalas upp en magnitud? Egenskaper som är viktiga och synliga för utvecklarna (interna faktorer): Underhållsbarthet (maintainability) 7 är systemet lätt att modifiera och utöka med ny funktionalitet? - Läsbarhet (readability) är koden lätt att läsa och förstå? - Enkelhet (simpilicty) är koden onödigt komplex? - Utbyggbarhet (extensibility) är det enkelt att lägga till nya tjänster och ta bort gamla? Återanvändbarhet (reusability) kan komponenter i systemet lätt återanvändas inom systemet eller i andra system? Testbarhet (testability) är det lätt att testa systemet och de ingående komponenterna? Dessa egenskaper är fokus för kursen! 8

Buggar Kursens innehåll Murphy s law: Anything that can go wrong will go wrong. (Edward A. Murphy) Murphy) Kursen kommer främst att fokusera på de interna faktorerna avseende mjukvarukvalité, i syfte att åstadkomma mjukvara som är Buggar är programmeringens förbannelse. lätt att förstå Kvarstående buggar i programvara som körs i drift: förberedd för förändringar 1-10 buggar/kloc ordinär industriprogramvara 0.1-1 buggar/kloc hög kvalitativ (t.ex. Javas bibliotek) 0.01-0.1 buggar/kloc extremt säkerkritiskt (t.ex. NASA) så buggfri som möjligt. Murphy s lag skall vara vägledande vid allt ingenjörsmässigt konstruktionsarbete se till att inget kan gå fel. Murphy was an optimist. optimist. (Tara O'Toole) O'Toole) 9 Kursens innehåll Programmering är modellering Ett program är en modell av en verklig eller tänkt värld. Design patterns High cohension Strategy Don't repeat yourself Don't ask, tell Favor composition over inheritance Delegation... Cloning Generic Threads Anonymous classes Principles GRASP SOLID Immutability I objektorienterad programmering består denna värld av en samling objekt som tillsammans löser den givna uppgiften. Observer Iterator Low coupling Liskov Substitution Principle Foundation Information hiding Abstraction Inheritance Composition Java Collections IO-framework Exceptions Inner classes equals hashcode Open-closed State - De enskilda objekten har specifika ansvarsområden. Proxy Single responsibility - Varje objekt definierar sitt eget beteende. - För att fullgöra sina skyldigheter, kan ett objekt behöva medverkan/support från andra objekt. Design by contract... Singleton Adapter Factory... Decorator Template MVC 10 - Objekten samarbetar genom att kommunicera med varandra via meddelanden. - Ett meddelande till ett objekt är en begäran från ett annat objekt att få en uppgift utförd. UML Testning 11 12...

Från problem till kod Analys:* Programmering är modellering Utarbeta en exakt beskrivning av de uppgifter som programsystemet skall verkställa. Dokumenteras i en funktionell specifikation., som t.ex. inkluderar use cases. Analys&Design Login Design:* Huvudmålet är att identifiera vilka klasser som skall finnas identifiera klassernas ansvarsområden identifiera relationerna mellan klasserna. Withdraw cash Client En iterativ process. Dokumenteras bl.a. med UMLdiagram. Bank Obtain account balance Implementation Implementation: Programspråk bestäms. Klasserna kodas och testas. * Deposit cash Många metodiker för objektorienterad systemutveckling gör ingen strikt skillnad mellan analys och design. 13 Objekt orienterad design 14 Underhåll av mjukvarusystem 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) Att göra bra design för ett programsystem är en stor utmaning. Designen utgör underlaget för implementationen: Att ett programsystem skall vara lätt att underhålla är en mycket viktig egenskap! - en bra design minskar kraftig tidsåtgången för implementationen - Fel i den ursprungliga mjukvaran måste fixas. - bristerna i en dålig design överförs till implementationen och blir mycket kostsamma att åtgärda. - Mjukvaran måste anpassas till nya användarkrav. Vanligaste misstaget som görs i utvecklingsprojekt är att inte lägga tillräckliga på framtagandet av designen. - Den som ändrar i koden är sällan eller aldrig den som ursprungligen skrivit koden. I allmänhet bör mer tid avsättas för design än för implementation. - Största delen av pengarna och tiden under ett systems livstid åtgår till systemunderhåll (ca 80%). 15 Utveckla för förändring! 16

Utveckla för förändring Utveckla för förändring Vi lever i en föränderlig värld och vet med säkerhet att förändringar kommer att ske i de programsystem vi utvecklar. The Open-Closed Principle (OPC): Däremot vet vi inte med säkerhet vilka förändringar som kommer att bli aktuella. Software modules should be open for extension, but closed for modification. (Bertrand Meyer) Vi kan dock ofta någorlunda bra förutsäga var ändringarna kommer att införas och förbereda för detta d.v.s. göra vårt system framåtkompatibelt. The Open-Closed Principle (OPC): Vi behöver identifiera de delar av systemet som kommer att påverkas av Det skall vara möjligt att lägga till ny funktionalitet utan att modifiera existerande kod. framtida ändringar eller utökningar och förbereda genom att så långt som möjligt isolera och frigöra dessa delar från det övriga systemet. Software modules should be open for extension, but closed for modification. (Bertrand Meyer) Encapsulate what varies 17 Det objektorienterade paradigmet Design smells: Symtom på dålig design Designen av ett mjukvarusystem tenderar att ruttna med tiden. Symtom på detta är: Objektorientering är en metodik som utvecklats specifikt för att reducera komplexiteten i mjukvarusystem. Stelhet (rigidity) en ändring är svår att genomföra pga beroenden med många andra moduler av systemet. Ändringen ger upphov till en mängd av ändringar i de beroende modulerna. Rätt använd har objektorientering stor potential till: återanvänding av kod utbyggbarhet 18 Bräcklighet (fragility) en ändring skapar fel i delar av systemet som Encapsulate what varies inte har något konceptuell koppling till den ändrade modulen. enklare systemunderhåll Orörlighet (immobility) koden är svår att återanvända i andra applikationer. Modulerna är så hårt kopplade till varandra att de inte kan frigöras från den aktuella applikationen. Fel använd riskeras att få "a big ball of mud", i vilken man sitter fast i utan att kunna göra något produktivt. Seghet (viscosity) man har gjort designval som innebär att det krävs stora insatser att göra en bra ändring, varför lösningen blir ett hack. Oklarhet (opacity) en modul är svår att läsa och förstå. 19 20

Orsaker till design smells Design smells A system that is used will be changed. An evolving system increases its complexity unless work is done to reduce it. (Manny Lehman) Förruttnelsen orsakas direkt eller indirekt av olämpliga beroenden mellan de ingående delarna i systemet: Den ursprungliga designen är undermålig: - bristfällig förståelse av de ursprungliga kraven - bristfällig förståelse av systemets framtida utveckling - inkompetenta utvecklare Ändrade krav beaktas inte på allvar - snabba hack görs under tidspress för att lösa akuta problem - de som gör ändringarna förstår inte den ursprungliga designen, - de ändringar som görs skapar nya beroenden mellan komponenter skapas och ökar komplexiteten hos designen. 21 Hur motverka design smells 22 Unken kod (Code smells) Synliga tecken i koden på att designen håller på att ruttna: Inse från början att kraven kommer att förändras - utveckla för förändring Duplicerad kod, klipp&klistra -programmering Långa metoder Använd beprövade tekniker, principer och designmönster för att minska beroenden mellan komponenterna i systemet. Långa parameterlistor Stora klasser Refaktorisering (refactoring) Klasser som endast innehåller data - omstrukturering av koden som bevarar funktionalitet men förbättrar strukturen, utan att påverka det yttre beteendet Publika instansvariabler - kvalitén på designen skall alltid hållas hög under systemets hela livstid Avsaknad av kommentarer Långa if- och switch-satser Onödiga kommentarer - det är omöjligt att designa ett perfekt system på första försöket. 23 Oläslig kod 24

Complexity is your enemy Complexity is your enemy Controlling complexity is the essence of computer programming. (Brian Kernighan) Kernighan) A person can only keep 7 plus or minus 2 items in mind at one time. (George Miller) Mycket i programmering handlar om att reducera komplexiteten hos den mjukvara som utvecklas. För att åstadkomma programvara som blir enkel att underhålla och återanvända måste man försöka reducera komplexiteten på alla nivåer i utvecklingsarbetet, allt ifrån design av den övergripande systemarkitekturen till val av variabelnamn. Man måste hela tiden vara medveten om problemet med komplexitet och lära sig best practices för hur komplexitet skall hanteras. Design and programming are human activities; forget that and all is lost. (Bjarne Stroustrup) Komplexitet i ett program handlar inte om hur bra ett program går att köra på datorn, utan helt och hållet om hur lätt det är att läsa och förstås av människor. 25 Keep it simple, stupid 26 Keep it simple, stupid KISS (Keep it simple, stupid) är en designprincip/designslogan som U.S Navy introducerade under 1960-talet, vars essens är att A simple solution is better than a complex one even if the solution looks stupid. Everything should be made as simple as possible, but not simpler. (Albert Einstein) Einstein) Human nature has a tendency to admire complexity, but reward simplicity. (Ben Huh) Huh) 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) Einstein) That s been one of my mantras focus and simplicity. 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) Jobs) 27 28

Grundläggande designprinciper Kodstil och namngivning Programs should be written for people to read, and only incidentally for machines to execute. (Abelson och Sussman) Enhetlig kodstil. Minskar risken för fel och underlättar förståelsen av koden. Genomtänkt namngivning. Ett namn skall avspegla vilken roll en entitet har. Dokumentation. Oavsett hur bra design en mjukvara har är den värdelös utan dokumentation. Konstruera och underhålla programvara är en process som sker mellan människor! Modularitet. Ett system skall brytas ned till en samling sammanhängande men löst kopplade moduler. För att underlätta för andra att läsa den kod du utvecklar skall du använda en kodkonvention. Lämpligen Abstraktion. Bortse från detaljer när de är irrelevanta. http://java.sun.com/docs/codeconv Inkapsling & döljande av information. Keep it secret, keep it safe. Decoupling. Minimera beroenden mellan klasser, minimera beroenden av specifika typer. En av de viktigaste aspekterna på kodkonvention berör namngivning. Identifierarnamn måste väljas mycket omsorgsfullt. Delegering. Skicka vidare uppgifter till de klasser som är bäst lämpade att göra arbetet. Information Expert. Namnet är det första läsaren ser och skall vara en ledtråd för att förstå vad identifieraren representerar och vilken uppgift den har. Designmönster. Använd välkända och accepterade lösningar. Återanvändning av kod. Don't Repeat Yourself (DRY). Let the code talk! 29 Kodstil och namngivning Klasser: 30 Modulär design Namnen är oftast substantiv, t.ex Date, BankAccount och Car. Namnen slutar ofta på able, t.ex vara att designa programsystemet runt stabila Målsättningen skall Cloneable och Comparable. och utbytbara Metoder: abstraktioner Namnen skall vara ett verb eller innehålla ett verb, t.ex.komponenter för att möjliggöra små print, setsize, isvisible och getsize. och stegvisa förändringar. Variabler: numberofmembers och loadingdone är bra namn. Interface: thenumberofthreadsintheapplicationrunningrightnow, nt, notyetdone och done är dåliga namn. Använd engelsk namngivning. 31 Målsättningen skall vara att designa programsystemet runt stabila abstraktioner och utbytbara komponenter för att möjliggöra små och stegvisa förändringar. 32

Modulär design Koppling (coupling) temporarily ignored, thus reducing the cognitive burden of solving the original problem. Ett programsystem är för stort för att i sin helhet It iskunna through theförstås decomposition process that many of the necessary abstractions are discovered (or invented). måste dela upp systemet i mindre delar. Denna process kallas för Levels of Design dekomposition. Ett modulärt system är uppdelat i identifierbara abstraktioner som kallas moduler (t.ex. klasser, paket och subsystem). 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. För att få en flexibel design måste de ingående modulerna vara så oberoende av varandra som möjligt. Med koppling avses hur starkt beroendet är mellan två olika moduler. System System X Y X Y Stark koppling Subsystem Subsystems Svag koppling Packages Packages Har vi starka kopplingar kommer förändringar i en modul att framtvinga förändringar även i de moduler som är beroende av denna. Classes Classes Desto lägre grad av koppling som finns mellan modulerna i ett system, desto mer flexibelt och förändringsbart blir systemet. Routines Routines 33 34 Decomposition is inherently a top-down process. At the topmost level we have the entire system. The first level of decomposition divides the system into subsystems, each of which represents a major but somewhat independent chunk of the system s functionality. For example, the subsystems for a web browser might be Network Protocols, File Viewers, History, Favorites, Printing, etc. At the next level of decomposition, each subsystem is further subdivided into packages. Each package is responsible for implementing a part of the subsystem s functionality. For example, a web browser s File Viewers subsystem might contain a separate package for each different file format that the browser can display (HTML, PDF, XML, För att de ingående modulerna i ett system skall kunna samarbeta vid etc.). The package corresponding to a particular format would contain the code that lösandet av en uppgift måste det naturligtvis kopplingar implementsfinnas the file viewer for that format.mellan Koppling (coupling) modulerna. Men för att få en bra design är vår A package is further decomposed into a collection of one or more classes that together implement that package s functionality. For example, the web browser s HTML viewer uppgift might att: consist of a dozen different classes. minimera antalet kopplingar Dependency Inversion Principle (DIP): ha så lösa kopplingar som möjligt The functionality of each class is further decomposed into routines which implement the operations (or algorithms) of the class. Significant algorithms are typically decomposed ha kontroll över kopplingarna Kohesion (cohesion) Kohesion är ett mått på den inre sammanhållningen i en modul, d.v.s. de inbördes relationerna mellan komponenterna i modulen. En modul har hög kohesion när samtliga komponenter i modulen sinsemellan samverkar för att lösa det ansvarsområde modulen har, utan att behöva samverka med komponenter i andra moduler. Kohesion är dels ett mått på hur autonom en modul är, dels ett mått på hur väl definierad modulens ansvarsområde är. Depend on abstractions, not on concrete implementations. - varje kopplingspunkt skall vara avsiktlig - varje kopplingspunkt skall ha ett väldefinierat gränssnitt. X Y X Y Hög kohesion Dependency Inversion Principle (DIP) : Depend on abstractions, not on concrete implementations. Låg kohesion 35 36

Återanvändning Utmaningen med utveckling av mjukvarusystem När man utvecklar ett mjukvarusystem finns en rad krav och önskemål som skall uppfyllas. Vi vill åstadkomma ett system som: Låg koppling och hög kohesion lägger grunden för återanvändning. är färdigutvecklat på utsatt tid och inom givna budgetramar uppfyller sin uppgift så bra som möjligt är så enkelt att använda som möjligt har tillräckligt höga prestanda är felfritt är robust Ju mer välspecificerad uppgift ett subsystem har och ju enklare dess gränssnitt är, desto större chans är det att subsystemet kommer att återanvändas. 37 är så enkelt att underhålla som möjligt är så enkelt att modifiera som möjligt är så enkelt att bygga ut som möjligt är så enkelt att implementera som möjligt är så återanvändbart som möjligt... 38