TDDD78 Objektorientering i Java, del 3. Ärvning av implementation, inklusive abstrakta klasser Hur ska vi ärva? När ska vi ärva?

Relevanta dokument
Ärvning av implementation. Ärvning av implementation, inklusive abstrakta klasser Hur ska vi ärva? När ska vi ärva?

TDDD78, TDDE30, 729A Typhierarkier del 3 När och hur vill vi använda dem? Några Best Practices

Typhierarkier del 1 Gränssnitt, ärvning mellan gränssnitt, ärvning mellan klasser

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

TDDD78 Objektorientering i Java, del 2

Sammansatta datatyper Generics: Parametrisk polymorfism

TDDD78 Objektorientering: Lagring och livstid

Objektorientering: Lagring och livstid

TDDD78 Objektorientering i Java, del 3

TDDD78 Viktiga begrepp, del 2

Motivation. Programmeringsuppgift: En första ansats: Lagra info om anställda Håll reda på varje anställds närmaste chef. som också är en anställd!

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

Objektorientering: Lagring, räckvidd och livstid

OOP Objekt-orienterad programmering

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

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

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

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

TDDD78 Objektorientering i Java, del 4. Hur vet man om två objekt är lika? Hur undviker man objekt och när?

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

Classes och Interfaces, Objects och References, Initialization

"Är en"-relation. "Har en"-relation. Arv. Seminarium 2 Relevanta uppgifter. I exemplet Boll från förra föreläsningen gällde

Laboration 1: Figurer i hierarki

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

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

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

Föreläsning 13 Innehåll

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

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

Sammansatta datatyper Generics: Parametrisk polymorfism

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

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

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

Klasshierarkier - repetition

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

Objektorienterad Programmering (TDDC77)

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

Arrayer. results

TDDD78, TDDE30, 729A85 Objektorienterad programmering och Java

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

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 7/ Exempel: Implementation av Schackpjäser.

DAT043 - Föreläsning 7

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

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

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

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

Introduktion till arv

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

Konstruktion av klasser med klasser

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 31/ Exempel: Implementation av Schackpjäser.

Begreppet subtyp/supertyp i Java. Mera om generik. Generik och arv. Generik och arv. Innehåll

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

Objektorienterad programmering Föreläsning 12. Copyright Mahmud Al Hakim

Samlingar, Gränssitt och Programkonstruktion! Förelasning 11!! TDA540 Objektorienterad Programmering!

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

Viktiga programmeringsbegrepp: Kontrakt

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

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

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

Repetition av OOP- och Javabegrepp

TDDD78 Introduktion till OOP i Java

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

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

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

Innehåll. 1 Kort om dynamisk polymorfism. 2 Arv i C++ 3 Multipelt arv. 4 Något om statisk polymorfism. class Container {

Repetition av OOP- och Javabegrepp

Objektorienterad programmering. Grundläggande begrepp

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

Övningar Dag 2 En första klass

Lösningar till tentamen i EDAF25

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

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

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

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Instuderingsuppgifter läsvecka 2

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

OOP Objekt-orienterad programmering

Föreläsningsmaterial (Arv) Skrivet av Andreas Lund

TENTAMEN OOP

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

Föreläsning 15: Repetition DVGA02

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

TDDD78, TDDE30, 729A85 Objektorienterad programmering och Java

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

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

LÖSNINGSFÖRSLAG TENTAMEN

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

DAT043 - föreläsning 8

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

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

Monday, November 16, Senaste Labben

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

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

Transkript:

TDDD78 Objektorientering i Java, del 3 Ärvning av implementation, inklusive abstrakta klasser Hur ska vi ärva? När ska vi ärva? jonas.kvarnstrom@liu.se 2017

Implementationsarv 1: Klassnivåer 3 Nu kan vi ha godtyckligt antal nivåer men bara en klassnivå. Vill vi ha mer? Varför?

Implementationsarv 2: Nya medlemmar 4 En anledning: Addera egenskaper + funktionalitet till en klass Vill ibland lagra geometriska cirklar x y radie Ha kvar rena cirklar: Geometriklasser ska bara ha geometri, renare design Lägre minnesåtgång Kommer från klassbibliotek, kan inte ändras Vissa ska vara grafiska Outlinefärg Fyllfärg Ritmetod Utökad version!

Implementationsarv 3: Nya medlemmar 5 Adderar Ärver Ärver Adderar GraphicCircle utökar eller ärver från Circle GraphicCircle är en subklass till Circle Circle är en superklass till GraphicCircle

Implementationsarv 4: Visualisering 6 getcircum getarea setradius code code code getcircum getarea setradius draw code code code code

Implementationsarv 5: Overriding 7 Anledning 2: Ändra eller utöka nedärvd funktionalitet Kan override:a ("ersätta") metoder: Ge dem en ny implementation Fråga superklassen vad den tycker Kräver identiska parametertyper annars blir det overloading

Implementationsarv 6: super() 8 Modellering med super() 3. skulle vi inte få med framtida ändringar i Circle:s isvalid()! 2. Om vi istället skrev här: if (r < 0) return false; 1. Modellering: Inte bara bekvämlighet Superklassen vet när dess fält är giltiga vi måste fråga den! Sedan kan vi gå vidare med vårt ansvarsområde

UML-klassdiagram: Generalisering 9 Klassrelation: Generalisering (ärvning) Som för gränssnitt

Annoteringar vid overriding 10 Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av IDEA Den här implementationen ersätter en annan! Stava fel, använd fel typer, ta bort get() från superklassen kompileringsfel!

Multipel ärvning? 11 Multipel ärvning i vissa språk: Utöka flera klasser Användbart och förvirrande Om båda superklasser har implementerat Vilken implementation ska ärva? Förbjudet i Java

Rötter i klasshierarkin 12 I vissa språk har klasshierarkin flera rötter Vissa klasser är relaterade via ärvning, andra fristående Java: Allt går tillbaka till Object!

Enkelrotad klasshierarki 13 Utan extends Med extends Så småningom kommer vi till Object! Fördel: En Object-variabel kan peka på vilket objekt som helst Användbart i generella datatyper Set, List, Vet inte typen av element i förväg

Konstruktorer och arv 1 15 Först: minnesallokering, defaultvärden, för alla fält Ingen får komma åt "gammalt skräp" Sedan släpps konstruktorer in: -delen "konstruerar sig" Kryss = null (pekar ingenstans) -delen "konstruerar sig" I vilken ordning? Superklassen först Ingen får komma åt -fälten (x,y,r) innan initialiserat dem Inte ens dess egen subklass!

Konstruktorer och arv 2 16 Men vi anropade ju Det första GraphicCircle gör: Anropa superklassens konstruktor Circle får initialisera sig Sedan får GraphicCircle sin chans att titta på objektet Sedan får vi objektet från konstruktorn, och kan titta på det Strunta i super( ) kompilatorn stoppar in super() utan argument Men Circle() finns inte: Kompileringsfel!

Konstruktorer: Skicka vidare! 17 Glöm inte att skicka vidare parametrar! Ibland ser vi följande: Tom Circle-konstruktor Anropar tom Circle-konstruktor Petar själv in värden i Circle-delen Dålig modellering! Circle får inte bestämma över sig själv Kan inte validera sina parametrar, Kan inte ändra sin implementation Upprepad kod i alla Circle-subklasser

Konstruktorer: Försvara klassen! 18 Se till att Circle kan försvara sig! Skapa bara konstruktorer som kräver rätt argument Underklasser kan inte låta bli att skicka x, y, r

Motivation 20 Klasshierarkin ska oftast grundas i begrepp, klassificering Naturligt att prata om listor i allmänhet ge flera implementationer X är en speciell sorts Y, som Naturligt att prata om grafiska komponenter i allmänhet Vissa komponenter är knappar Vissa komponenter är textfält Men ibland vill vi helt enkelt undvika redundant kod! (Vanligt problem i projekt )

Motivation 2: Duplicerad kod 21 A lot of common code! length field size(), indexof() Massor av duplicerad kod Hur kan vi använda samma kod för båda klasser? Inte flytta till List: Gränssnitt ska ange krav, inte implementation

Försök 1: Återanvända med konkret klass? 22 Bra försök, men skulle behöva implementera!

Försök 2: Dummy-implementation? 23 Bra försök, men skulle inte uppfylla kraven på : get ska returnera rätt element!

Abstract 1: Intro 24 Vi vill ha en klass, där: Vissa metoder ska implementeras Andra metoder ska krävas, men inte implementeras Klassen blir ofullständig, ungefär som gränssnitt Partiellt implementerad Kallas abstrakt existing in thought or as an idea but not having a physical or concrete existence Bara för att undvika redundant kod!

Ärver löften/kod från GenericList Implementerar det som saknas jonkv@ida Abstract 2: För återanvändning! 25 Ärver löften från List Saknar ändå get(), add, set()

Abstract 3: Gå hela vägen! 26 Relaterat problem i projekt: Ärvningen finns där, men medlemmar repeteras ändå! Flytta till superklassen!

Abstract 4: Varning för upprepning 27 Relaterat problem i projekt: Ärvningen finns där, men fält repeteras ändå! Ger skuggning av fält: Varje ArrayList har TVÅ fält med namnet length Vilket som används beror på pekartypen Slösar minne Svårt att förstå!

Abstract 5: Instansiering 28 Kan inte instansieras med Kan bara skapa konkreta objekt Men vi kan skapa, vilket ger en sorts GenericList!

Abstract 6: Konstruktorer 29 Även en abstrakt klass ska initialisera sina objekt Det finns fält (som ärvs av ArrayList, ) Initialiseras i en konstruktor: Klassen bestämmer över sina objekt

Abstract 7: Begrepp? 30 Abstrakta klasser: Kan vara ett undantag från begreppsmodelleringen Inget behov att prata om GenericList: Då räcker det med List Men vi vill samla gemensam kod

Abstrakt klass eller gränssnitt? (1) 32 Gränssnitt Kan implementera flera Ingen kod, bara löften / kontrakt Kan vara både List och Queue Alla som implementerar måste ha kod för alla metoder kan ta godtycklig Vem som helst kan implementera Även om man också implementerar eller utökar en klass Gränssnitt ger ingen gemensam kod att ärva

Abstrakt klass eller gränssnitt? (2) 33 Abstrakta klasser Ger löften och kod Kan bara utöka en Klasser tillhandahåller kod som alla subklasser använder Ingen klass kan vara Reader och InputStream Subklasser till och ärver användbar kod

Abstrakt klass eller gränssnitt? (3) 34 Javas I/O-klasser har suboptimal design "Basen" i dessa hierarkier är abstrakta klasser, inte gränssnitt I/O-kod deklarerar parametrar, fält, variabler av klasstyperna och! För att skapa en ny strömtyp som metoden kan använda, måste man utöka InputStream Då kan klassen inte utöka något annat Hade List och Queue varit abstrakta klasser, kunde LinkedList inte ha varit både List and Queue!

Abstrakt klass eller gränssnitt? (4) 35 Bra teknik: Använd båda! Hierarkiernas "baser" är gränssnitt (List, Queue) används för deklarationer etc. Man kan implementera dessa direkt full frihet Om man har mycket gemensam kod, och kan tjäna på att ha en abstrakt klass

Abstrakt klass eller gränssnitt? (5) 36 Kan man bara "stoppa in" en abstrakt klass! Metoder kräver/returnerar fortfarande List, inte AbstractList kan ta/returnera en CheckedList skriven utan den abstrakta klassen

Sammanfattning: Klasshierarkier 38 2. Ett gränssnitt kan ärva från och utöka (löftena som gavs av) ett annat gränssnitt 1. Ofta (men inte alltid) har vi en mängd gränssnitt som definierar funktionalitet och ger löften (kontrakt), bland annat genom att ange abstrakta metoder

Sammanfattning: Klasshierarkier (2) 39 3. En metod kan ta "godtycklig Collection" som parameter 2. En metod kan ta godtycklig List som parameter. Kan vara en SkipList eller CheckedList spelar ingen roll! 4. En klass kan implementera flera gränssnitt. Ingen tvetydighet, eftersom ingen kod ärvs. 1. Klasser kan implementera gränssnitt måste uppfylla deras kontrakt

Sammanfattning: Klasshierarkier (3) 40 1. Abstrakta klasser (GenericList) can tillhandahålla partiella implementationer där vissa metoder är abstrakta ("löften" att metoden ska finnas) 2. och kan ha konkreta subklasser som implementerar den saknade funktionaliteten

Sammanfattning: Klasshierarkier (4) 41 En del klasser, som MyList, implementerar inga gränssnitt alls

Sammanfattning: Klasshierarkier (5) 42 men alla klasser utökar (direkt eller indirekt) java.lang.object!

jonas.kvarnstrom@liu.se 2017 Att använda ärvning eller inte

Personer 1: Klasser 45 Vi vill ha en persondatabas för universitetet Ett sätt att modellera: En klass för varje typ av person Problem: Doktorander är både anställda och studenter

Personer 2: Gränssnitt 46 OK, vi använder gränssnitt multipel ärvning! Problem: Hur byter man typ?

Personer 3: Byta typ 47 Många personer byter typ under sin livstid Student doktorand postdoktor lektor professor? Objekt kan inte byta typ Vi måste skapa nytt objekt Praktiskt problem: Det gamla objektet kan lagras på många platser Måste bytas ut mot det nya, överallt Begreppsproblem: Jag byttes inte ut mot en ny person!

Personer 4: Alternativ klassificering 48 Varför dela upp enligt just anställningsform? Andra klassificeringar: Prefekt, dekan, rektor en roll som en professor kan ha Medlem i utbildningsnämnd, eller inte? Medlem i institutionsstyrelse, eller inte? Ska allt detta motsvaras av egna gränssnitt?

Personer 4: Annan lösning 49 Försök inte tvinga in ärvning för ärvningens skull! Alternativ lösning: Anställningsform är en egenskap som kan ändras En eller flera roller, kan också ändras

Schack: En kontrast 50 Schackspel: Kan ha flera klass för pjäser: Varje pjäs har en typ Eget beteende (förflyttningsregler), kanske tillräckligt komplext för egen klass Pjäser byter sällan typ kan enkelt hanteras Nya typer tillkommer aldrig Kan välja att ha en klass Avvägning: Vilket blir mest läsbart, modulärt? Inte separata klasser för vitt/svart alltför lika beteende

Om du bara har en hammare, ser alla problem ut som spikar Men vi har flera verktyg än ärvning!

Skapa inte klasser för klassernas skull

Onödiga klasser 1.1 53 Subklasser ska ha eget beteende: Nya eller ändrade metoder! Här skiljer sig bara konstruktorn Inget beteende, bara data (värden) Dålig lösning: Onödiga klasser Kan anropa med parametrar slipper två klasser fördelar i flexibilitet

Onödiga klasser 1.2: Fabriksmetoder 54 Om man ändå vill ge namn för att förenkla: Använd fabriksmetoder Behöver inte alltid en egen "fabriksklass" Anropas * bara från? Då kanske de ska ligga i istället

Onödiga klasser 2.1 55 Här finns metoder med olika kod Men den enda skillnaden är i värden! Ska inte ha olika klasser

Onödiga klasser 2.2: Lösning 56 Bra, generell lösning: Kan lätt ange godtycklig hopplängd Kan hitta på hopplängder under programmets körning (ingen ny klass krävs) Använd inte klasser när värden räcker

Att vara eller icke vara 58 Är den, eller har den? Gör vi så här, ärver Circle funktionalitet från Point Trevligt! Gratismetoder! Är en cirkel en sorts punkt? Nej!

Att vara eller icke vara (2) 59 En cirkel har en punkt mittpunkten Vill vi erbjuda liknande metoder? Delegera!

Att vara eller icke vara (3) 60 Är den, eller har den? Gör vi så här, ärver Queue funktionalitet från ArrayList Trevligt! Gratismetoder! Är en kö en sorts lista? Nej! Listor kan stoppa in element var som helst, ta bort var som helst, En kö kan ha en lista (se labbar)

Om du bara har en hammare, ser alla problem ut som spikar Använd komposition när det passar!

Typkontroll: Operatorn instanceof 63 Vilken typ har ett visst objekt? Exakt typ: Subtyp: Allt är!

Typkontroll: Operatorn instanceof (2) 64 Kan användas för att göra olika saker beroende på typ För alla Thing-objekt t i samlingen thingsonscreen

Typkontroll: Operatorn instanceof (3) 65 Kan användas för att göra olika saker beroende på typ Göra olika beroende på typ? Det är ju detta subtypspolymorfism är till för! UNDVIK! Polymorfism är oftast bättre! Från Effective C++, av Scott Meyers : "Anytime you find yourself writing code of the form if the object is of type T1, then do something, but if it's of type T2, then do something else, slap yourself. "

Vad är problemet? 66 Single Responsibility Principle: Kollisionshanteraren borde inte bestämma hur alla saker på skärmen interagerar med spelaren! Centraliserat: Lägger man till en ny sorts Thing, måste denna metod också ändras! Bräckligt, inte modulärt!

Varför är polymorfism (oftast) bättre? 67 1. Be saken hantera detta 2. Thing lovar att alla Thing-klasser kan hantera kollision 4. Polymorfism och dynamisk bindning rätt implementation väljs! 3. Alla Thing-klasser har sin egen implementation, bestämmer sitt beteende

Icke-lösningar på problemet 68 Ingen instanceof, men samma problem Problemet är typkontrollen, inte instanceof Be objektet använd polymorfism

jonas.kvarnstrom@liu.se 2017 En kodlukt: Upprepning Diskuteras i labb 4

Kodlukt 70 Kodlukt / code smell: Inte nödvändigtvis en bugg i sig Något man kan se "på ytan" på koden, som ofta indikerar att det finns ett djupare problem Fixas ofta genom refactoring: Kod skrivs om, men gör exakt samma sak

Redundans och upprepning

Redundans? 72 I vissa sammanhang kan redundans ha sina poänger This parrot is no more. It has ceased to be. It's expired and gone to meet its maker. This is a late parrot. It's a stiff. Bereft of life, it rests in peace. If you hadn't nailed it to the perch, it would be pushing up the daisies. It's rung down the curtain and joined the choir invisible. This is an ex-parrot.

Undvik redundans 73 I programmering ska redundans och upprepning undvikas! Gör det svårare att förstå koden Mer att läsa Måste se om upprepningen är exakt lika eller skiljer sig på något sätt Mer kod att underhålla Risk att inte all kod uppdateras på samma sätt DRY-principen: Don t RepeatYourself! DIE: Duplication Is Evil WET: Write Everything Twice WET: We Enjoy Typing

Onödigt många metoder

Onödigt många metoder 75 Kod ska skrivas effektivt exempel:

Onödig upprepning av kodmönster

Extrahera en hjälpmetod!

Upprepning av kodmönster (2) 78 Extrahera upprepade uttryck till namngivna variabler Snabbare kod Namnet ger en förklaring till deluttrycket Lättare att se att delarna är medvetet identiska IDEA kan hjälpa till: Refactor Extract Variable

Upprepning i konstruktorer 79 Många konstruktorer upprepad kod? En konstruktor kan anropa en annan en "kedja" Specialsyntax: this(args) som första sats i en konstruktor vidarekopplar till en annan konstruktor

Att hitta upprepad kod 80 IDEA kan hitta vissa former av uppenbar repetition Analyze Locate Duplicates Ni gör resten alltför ineffektiv kod ger komplettering!

Kan även hitta duplicerad kod on the fly