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

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. Grundkursen. Programming in the small. Koncept som är kända från grundkursen (?

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

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

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

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

Objektorienterad programmering, allmänt

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

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

Objektorienterad programmering

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

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

Modulär design 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

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

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

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Modulär design. 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

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

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

Kursplanering Objektorienterad programmering

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.

Programmering = modellering

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

Generics och polymorfism. 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

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:

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

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

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

Preschool Kindergarten

Objektorienterad programmering

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

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

Designmönster/Design patterns

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

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

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

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

Objektorienterad konstruktion

Föreläsning 15: Repetition DVGA02

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

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

Instuderingsuppgifter läsvecka 2

Beijer Electronics AB 2000, MA00336A,

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

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

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

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

Seminarierna Instruktioner. Övningarna Viktiga relationer

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

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

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

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

Imperativ programmering. Föreläsning 4

Objektorienterad analys och design

Flervariabel Analys för Civilingenjörsutbildning i datateknik

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

OOMPA 2D1359 Föreläsning 2

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

Programmeringsteknik F1/TM1

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

Laboration 2: Designmönster

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

Att välja och planera ett projekt

Objektorienterad programmering. Grundläggande begrepp

Adding active and blended learning to an introductory mechanics course

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

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

Support Manual HoistLocatel Electronic Locks


Tentamen Programmering fortsättningskurs DIT950

Wittgenstein for dummies Eller hur vi gör det obegripliga begripligt. Västerås 15 februari 2017

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

PROGRAMMERING. Ämnets syfte. Kurser i ämnet

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

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

Information technology Open Document Format for Office Applications (OpenDocument) v1.0 (ISO/IEC 26300:2006, IDT) SWEDISH STANDARDS INSTITUTE

Isolda Purchase - EDI

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

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

Transkript:

Föreläsning 1 Introduktion Utveckla för förändring Grundkursen 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.

Koncept som är kända från grundkursen (?) klasser typomvandling uppräkningstyper klassvariabler synlighetsmodifierare metoder överlagring metodsignatur subklass överskuggning klasshierarki interface UML objekt enkla variabler räckvidd instansvariabler inkapsling instansmetoder värdeanrop arv association polymorfism abstrakta klasser anonyma klasser strömmar m.m Programming in the small 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 typer omslagsklasser referensvariabler attribut konstruktorer klassmetoder referensanrop superklass relationer dynamisk bindning abstrakta metoder paket exceptionella händelser

Programming in the large mycket komplexa programsystem kanske flera miljoner rader kod kanske 100-tals programmerare som är geografiskt utspridda lång livstid software engineering - behov av utvecklingsverktyg kodstandard testverktyg versionshantering... - behov av utvecklingsprocesser -... Mjukvarans livscykel ion ca t i f i r Ve Coding Documentation Te st i ng Refinement Risk Analysis En stabil design och en bra dokumentation är mycket viktigt. Pr od uc tio n n sig De Andra programmerare än de som utvecklade systemet utför uppdateringar och systemunderhåll. Sp ec i f i ca tio n Ingen person kan vara insatt i och förstå alla enskilda delar i systemet. nc e ena int Ma Kommersiella programsystem har lång livstid och kraven på systemen förändras under deras livstid. Ny funktionalitet läggs till.

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: ä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 ä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... 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?

Mjukvarukvalité Egenskaper som är viktiga och synliga för utvecklarna (interna faktorer): Underhållsbarthet (maintainability) ä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? Buggar Murphy s law: Anything that can go wrong will go wrong. (Edward A. Murphy) Buggar är programmeringens förbannelse. Kvarstående buggar i programvara som körs i drift: 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) Murphy s lag skall vara vägledande vid allt ingenjörsmässigt konstruktionsarbete se till att inget kan gå fel. Murphy was an optimist. (Tara O'Toole)

Kursens innehåll Kursen kommer främst att fokusera på de interna faktorerna avseende mjukvarukvalité, i syfte att åstadkomma mjukvara som är lätt att förstå förberedd för förändringar så buggfri som möjligt. Kursens innehåll Design patterns Decorator Adapter Observer Template Strategy Factory High cohension Principles GRASP SOLID Iterator Low coupling Open-closed Don't repeat yourself Liskov Substitution Principle Single Don't ask, tell responsibility Favor composition Foundation over inheritance Information hiding Design by Delegation Abstraction contract Inheritance Composition...... Cloning Generic Threads Anonymous classes Java Collections IO-framework Exceptions Inner classes equals hashcode State... Singleton...

Programmering är modellering Ett program är en modell av en verklig eller tänkt värld. I objektorienterad programmering består denna värld av en samling objekt som tillsammans löser den givna uppgiften. - De enskilda objekten har specifika ansvarsområden. - För att fullgöra sina skyldigheter, kan ett objekt behöva medverkan/support från andra objekt. - 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å något utfört. Från problem till kod Analys:* Utarbeta en exakt beskrivning av de uppgifter som programsystemet skall verkställa. Dokumenteras i en funktionell specifikation., som t.ex. inkluderar use cases. Design:* Huvudmålet är att identifiera vilka klasser som skall finnas identifiera klassernas ansvarsområden identifiera relationerna mellan klasserna. En iterativ process. Dokumenteras bl.a. med UMLdiagram. Implementation: Programspråk bestäms. Klasserna kodas och testas. * Många metodiker för objektorienterad systemutveckling gör ingen strikt skillnad mellan analys och design.

Programmering är modellering Analys&Design Implementation Objekt orienterad design Att göra bra design för ett programsystem är en stor utmaning. Designen utgör underlaget för implementationen: - en bra design reducerar kraftig tidsåtgången för implementationen - bristerna i en dålig implementation överförs till implementationen och blir mycket kostsamma att åtgärda. Vanligaste misstaget som görs i utvecklingsprojekt är att inte lägga tillräckliga på framtagandet av designen. I allmänhet bör mer tid avsättas för design än för implementation.

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) The Open-Closed Principle (OPC): Software modules should be open for extension, but closed for modification. Att ett programsystem skall vara lätt att underhålla(bertrand är en mycketmeyer) viktig egenskap! - Fel i den ursprungliga mjukvaran måste fixas. - Mjukvaran måste anpassas till nya användarkrav. - Den som ändrar i koden är sällan eller aldrig den som ursprungligen skrivit koden. - Största delen av pengarna och tiden under ett systems livstid åtgår till systemunderhåll (ca 80%). Utveckla för förändring! Utveckla för förändring The Open-Closed Principle (OPC): Software modules should be open for extension, but closed for modification. (Bertrand Meyer) Encapsulate what varies 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. Däremot vet vi inte med säkerhet vilka förändringar som kommer att bli aktuella. 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. Vi behöver identifiera de delar av systemet som kommer att påverkas av 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. Encapsulate what varies

Det objektorienterade paradigmet Objektorientering är en metodik som utvecklats specifikt för att reducera komplexiteten i mjukvarusystem. Rätt använd har objektorientering stor potential till: återanvänding av kod utbyggbarhet enklare systemunderhåll 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. Design smells: Symtom på dålig design Designen av ett mjukvarusystem tenderar att ruttna med tiden. Symtom på detta är: Stelhet (rigidity) när en ändring är svår att göra eftersom varje ändring propagerar till många andra delar av systemet och ger upphov till en mängd av ändringar i beroende moduler. Bräcklighet (fragility) när en ändring gör att det uppstår nya fel i delar av systemet som inte har något konceptuell koppling till den ändrade modulen. 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. 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å.

Orsaker till 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, varför ändringar blir svåra att göra och de ändringar som görs ökar komplexiteten hos designen - nya beroenden mellan komponenter skapas. Design smells

Hur motverka design smells Inse från början att kraven kommer att förändras - kräver ändringar i systemet. Använd beprövade tekniker för att minska beroenden mellan komponenterna i systemet. Refaktorisering (refactoring) - omstrukturering av koden som bevarar funktionalitet men förbättrar strukturen, utan att påverka det yttre beteendet - kvalitén på designen skall alltid hållas hög under systemets hela livstid - det är omöjligt att designa ett perfekt system på första försöket. Unken kod (Code smells) Synliga tecken i koden på att designen håller på att ruttna: Duplicerad kod, klipp&klistra -programmering Långa metoder Långa parameterlistor Stora klasser Klasser som endast innehåller data Publika instansvariabler Långa if- och switch-satser Avsaknad av kommentarer Onödiga kommentarer Oläslig kod

Complexity is your enemy 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. 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. Complexity is your enemy Controlling complexity is the essence of computer programming. (Brian Kernighan) 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.

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. 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) Keep it simple, stupid Everything should be made as simple as possible, but not simpler. (Albert Einstein)

Grundläggande designprinciper 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. Modularitet. Ett system skall brytas ned till en samling sammanhängande men löst kopplade moduler. Abstraktion. Bortse från detaljer när de är irrelevanta. Inkapsling & döljande av information. Keep it secret, keep it safe. Decoupling. Minimera beroenden mellan klasser, minimera beroenden av specifika typer. Delegering. Skicka vidare uppgifter till de klasser som är bäst lämpade att göra arbetet. Information Expert. Designmönster. Använd välkända och accepterade lösningar. Återanvändning av kod. Don't Repeat Yourself (DRY). Kodstil och namngivning Programs should be written for people to read, and only incidentally for machines to execute. (Abelson och Sussman) Konstruera och underhålla programvara är en process som sker mellan människor! För att underlätta för andra att läsa den kod du utvecklar skall du använda en kodkonvention. Lämpligen http://java.sun.com/docs/codeconv En av de viktigaste aspekterna på kodkonvention berör namngivning. Identifierarnamn måste väljas mycket omsorgsfullt. 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. Let the code talk!

Kodstil och namngivning Klasser: Namnen är oftast substantiv, t.ex Date, BankAccount och Car. Interface: Namnen slutar ofta på able, t.ex Cloneable och Comparable. Metoder: Namnen skall vara ett verb eller innehålla ett verb, t.ex. print, setsize, isvisible och getsize. Variabler: numberofmembers och loadingdone är bra namn. thenumberofthreadsintheapplicationrunningrightnow, nt, notyetdone och done är dåliga namn. Använd engelsk namngivning. Målsättningen skall vara att designa programsystemet runt sta Modulär design och utbytbara komponenter för att möjliggöra s abstraktioner och stegvisa förändringar. 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.

Modulär design temporarily ignored, thus reducing the cognitive burden of solving the original problem. Ett programsystem är för stort för att i sin It iskunna through the förstås decomposition processhelhet 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. System System Subsystem Subsystems Packages Packages Classes Classes Routines Routines 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. Koppling (coupling) För att få en flexibel design måste de av varandra som möjligt. 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, ingående modulerna vara så oberoende etc.). The package corresponding to a particular format would contain the code that implements the file viewer for that format. Med koppling avses hur starkt beroendeta package är mellan olika into moduler. is furthertvå decomposed a collection of one or more classes that together X Stark koppling implement that package s functionality. For example, the web browser s HTML viewer Y might consist of a dozen different classes. The functionality of each class is further decomposed into routines which implement the operations (or algorithms) of the class. Significant algorithms are typically decomposed X Y Svag koppling 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. Desto lägre grad av koppling som finns mellan modulerna i ett system, desto mer flexibelt och förändringsbart blir systemet.

Koppling (coupling) För att de ingående modulerna i ett system skall kunna samarbeta vid lösandet av en uppgift måste det naturligtvis finnas kopplingar mellan modulerna. Men för att få en bra design är vår uppgift att: minimera antalet kopplingar ha så lösa kopplingar som möjligt ha kontroll över kopplingarna - varje kopplingspunkt skall vara avsiktlig - varje kopplingspunkt skall ha ett väldefinierat gränssnitt. Dependency Inversion Principle (DIP): Depend on abstractions, not on concrete implementations. Dependency Inversion Principle (DIP): Kohesion (cohesion ) Depend on abstractions, not on concrete implementations. 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. X Y X Y Hög kohesion Låg kohesion

Återanvändning Låg koppling och hög kohesion lägger grunden för återanvändning. 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.