81
[email protected] – 2017 TDDD78 Objektorientering i Java, del 3 Ärvning av implementation, inklusive abstrakta klasser Hur ska vi ärva? När ska vi ärva?

Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

[email protected] – 2017

TDDD78Objektorientering i Java, del 3

Ärvning av implementation, inklusive abstrakta klasser

Hur ska vi ärva?

När ska vi ärva?

Page 2: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av
Page 3: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

3

jonk

v@id

ajo

nkv@

ida

3Implementationsarv 1: Klassnivåer Nu kan vi ha godtyckligt antal nivåer…

…men bara en

klassnivå.

Vill vi ha mer? Varför?

Page 4: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

4

jonk

v@id

ajo

nkv@

ida

4

Vissa ska vara ”grafiska”

Outlinefärg

Fyllfärg

Ritmetod

Implementationsarv 2: Nya medlemmar 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

Utökad version!

Page 5: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

5

jonk

v@id

ajo

nkv@

ida

5Implementationsarv 3: Nya medlemmar

GraphicCircle utökar eller ärver från Circle

GraphicCircle är en subklass till Circle

Circle är en superklass till GraphicCircle

Ärver

Adderar

Ärver

Adderar

Page 6: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

6

jonk

v@id

ajo

nkv@

ida

6Implementationsarv 4: Visualisering▪

getAreagetCircum

…code……code…

setRadius …code…

getAreagetCircum

…code……code…

setRadius …code…draw …code…

Page 7: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

7

jonk

v@id

ajo

nkv@

ida

7Implementationsarv 5: Overriding Anledning 2: Ändra eller utöka nedärvd funktionalitet

Kan override:a

("ersätta") metoder:

Ge dem en ny

implementation

Kräver identiska

parametertyper –

annars blir det

overloading

Fråga superklassen

vad den tycker…

Page 8: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

8

jonk

v@id

ajo

nkv@

ida

8Implementationsarv 6: super() Modellering med super()

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

2. Om vi istället skrev här:

if (r < 0) return false; …

3. …skulle vi inte ”få med”

framtida ändringar i Circle:s

isValid()!

Page 9: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

9

jonk

v@id

ajo

nkv@

ida

9UML-klassdiagram: Generalisering Klassrelation: Generalisering (ärvning)

Som för gränssnitt…

Page 10: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

10

jonk

v@id

ajo

nkv@

ida

10Annoteringar vid overriding 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!

Page 11: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

11

jonk

v@id

ajo

nkv@

ida

11Multipel ärvning? Multipel ärvning i vissa språk: Utöka flera klasser

Användbart och förvirrande

Förbjudet i Java

Om båda superklasserhar implementerat …

Vilken implementationska ärva?

Page 12: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

12

jonk

v@id

ajo

nkv@

ida

12

Java: Allt går tillbaka till Object!

Rötter i klasshierarkin I vissa språk har klasshierarkin flera rötter

Vissa klasser är relaterade via ärvning, andra fristående

Page 13: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

13

jonk

v@id

ajo

nkv@

ida

13Enkelrotad klasshierarkiUtan ”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

Page 14: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av
Page 15: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

15

jonk

v@id

ajo

nkv@

ida

15Konstruktorer och arv 1

Först: minnesallokering, defaultvärden, för alla fält

Ingen får komma åt "gammalt skräp"

I vilken ordning?

Sedan släpps konstruktorer in:

-delen "konstruerar sig"

-delen "konstruerar sig"

”Superklassen först”

▪ Ingen får komma åt -fälten (x,y,r) innan initialiserat dem

▪ Inte ens dess egen subklass!

Kryss = null

(pekar ingenstans)

Page 16: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

16

jonk

v@id

ajo

nkv@

ida

16Konstruktorer och arv 2 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

Strunta i super(…) kompilatorn

stoppar in super() utan argument

Men Circle() finns inte: Kompileringsfel!

Sedan får vi objektet från konstruktorn,

och kan titta på det

Page 17: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

17

jonk

v@id

ajo

nkv@

ida

17Konstruktorer: Skicka vidare! Glöm inte att skicka vidare parametrar!

Ibland ser vi följande:

Anropar tom Circle-konstruktor

Petar själv in värden i Circle-delen

Tom Circle-konstruktor

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

Page 18: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

18

jonk

v@id

ajo

nkv@

ida

18Konstruktorer: Försvara klassen! 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

Page 19: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av
Page 20: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

20

jonk

v@id

ajo

nkv@

ida

20Motivation Klasshierarkin ska oftast grundas i begrepp, klassificering

Naturligt att prata om listor i allmänhet ge flera implementationer

Naturligt att prata om grafiska komponenter i allmänhet

▪ Vissa komponenter är knappar

▪ Vissa komponenter är textfält

▪ …

”X är en speciell sorts Y,

som…”

Men ibland vill vi helt enkelt undvika redundant kod!

(Vanligt ”problem” i projekt…)

Page 21: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

21

jonk

v@id

ajo

nkv@

ida

21Motivation 2: Duplicerad kod 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

Page 22: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

22

jonk

v@id

ajo

nkv@

ida

22Försök 1: Återanvända med konkret klass?Bra försök,

men skulle behöva

implementera !

Page 23: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

23

jonk

v@id

ajo

nkv@

ida

23Försök 2: Dummy-implementation?Bra försök, men skulle

inte uppfylla kraven på :

get ska returnera rätt element!

Page 24: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

24

jonk

v@id

ajo

nkv@

ida

24Abstract 1: Intro 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!

Page 25: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

25

jonk

v@id

ajo

nkv@

ida

25Abstract 2: För återanvändning!

Ärver löften från List

Saknar ändå get(), add, set()

Ärv

er

löft

en/k

od frå

n G

eneri

cLis

t

Imple

mente

rar

det

som

sak

nas

Page 26: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

26

jonk

v@id

ajo

nkv@

ida

26Abstract 3: Gå hela vägen!

Relaterat problem i projekt:

Ärvningen finns där,

men medlemmar repeteras ändå!

Flytta till superklassen!

Page 27: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

27

jonk

v@id

ajo

nkv@

ida

27Abstract 4: Varning för upprepning

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å!

Page 28: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

28

jonk

v@id

ajo

nkv@

ida

28Abstract 5: Instansiering

Kan inte instansierasmed ” ”

Kan bara skapa konkreta objekt

Men vi kan skapa” ”,

vilket ger en sorts

GenericList!

Page 29: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

29

jonk

v@id

ajo

nkv@

ida

29Abstract 6: Konstruktorer Ä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

Page 30: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

30

jonk

v@id

ajo

nkv@

ida

30Abstract 7: Begrepp? 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

Page 31: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av
Page 32: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

32

jonk

v@id

ajo

nkv@

ida

32Abstrakt klass eller gränssnitt? (1)Gränssnitt

Ingen kod, bara löften / kontrakt

Alla som implementerar

måste ha kod för alla metoder

Kan implementera flera

Kan vara både List och Queue

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

Page 33: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

33

jonk

v@id

ajo

nkv@

ida

33Abstrakt klass eller gränssnitt? (2)Abstrakta klasser

Kan bara utöka en

Ingen klass kan vara Reader

och InputStream

Ger löften och kod

Klasser tillhandahåller kod

som alla subklasser använder

Subklasser till och

ärver användbar kod…

Page 34: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

34

jonk

v@id

ajo

nkv@

ida

34Abstrakt klass eller gränssnitt? (3) Javas I/O-klasser har suboptimal design…

"Basen" i dessa hierarkier är abstrakta klasser, inte gränssnitt

I/O-kod deklarerar parametrar, fält, variablerav 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!

Page 35: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

35

jonk

v@id

ajo

nkv@

ida

35Abstrakt klass eller gränssnitt? (4) 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…

Page 36: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

36

jonk

v@id

ajo

nkv@

ida

36Abstrakt klass eller gränssnitt? (5)

…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

Page 37: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av
Page 38: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

38

jonk

v@id

ajo

nkv@

ida

38Sammanfattning: Klasshierarkier

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

2. Ett gränssnitt kan

ärva från och utöka

(löftena som gavs av)

ett annat gränssnitt

Page 39: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

39

jonk

v@id

ajo

nkv@

ida

39Sammanfattning: Klasshierarkier (2)

1. Klasser kan implementera

gränssnitt

måste uppfylla deras

kontrakt

2. En metod kan ta

”godtycklig List” som parameter.

Kan vara en SkipList eller

CheckedList – spelar ingen roll!

3. En metod kan ta

"godtycklig Collection"

som parameter

4. En klass kan implementera

flera gränssnitt.

Ingen tvetydighet,

eftersom ingen kod ärvs.

Page 40: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

40

jonk

v@id

ajo

nkv@

ida

40Sammanfattning: Klasshierarkier (3)

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

Page 41: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

41

jonk

v@id

ajo

nkv@

ida

41Sammanfattning: Klasshierarkier (4)

En del klasser, som MyList,

implementerar

inga gränssnitt alls

Page 42: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

42

jonk

v@id

ajo

nkv@

ida

42Sammanfattning: Klasshierarkier (5)

…men alla klasser utökar

(direkt eller indirekt)

java.lang.Object!

Page 43: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

[email protected] – 2017

Att använda ärvning –eller inte

Page 44: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av
Page 45: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

45

jonk

v@id

ajo

nkv@

ida

45Personer 1: Klasser 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

Page 46: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

46

jonk

v@id

ajo

nkv@

ida

46Personer 2: Gränssnitt OK, vi använder gränssnitt – multipel ärvning!

Problem: Hur byter man typ?

Page 47: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

47

jonk

v@id

ajo

nkv@

ida

47Personer 3: Byta typ 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!

Page 48: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

48

jonk

v@id

ajo

nkv@

ida

48Personer 4: Alternativ klassificering 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?

Page 49: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

49

jonk

v@id

ajo

nkv@

ida

49Personer 4: Annan lösning 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

Page 50: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

50

jonk

v@id

ajo

nkv@

ida

50Schack: En kontrast 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

Page 51: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

Om du bara har en hammare, ser alla problem ut som spikar

Men vi har flera verktyg än ärvning!

Page 52: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

Skapa inte klasser för klassernas skull

Page 53: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

53

jonk

v@id

ajo

nkv@

ida

53Onödiga klasser 1.1

Subklasser ska ha eget beteende:

Nya eller ändrade metoder!

Här skiljer sig bara konstruktorn

Dålig lösning:

Onödiga klasser

Kan anropa

med parametrar

slipper två klasser

fördelar i flexibilitet

Inget beteende,

bara data (värden)

Page 54: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

54

jonk

v@id

ajo

nkv@

ida

54Onödiga klasser 1.2: Fabriksmetoder 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

Page 55: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

55

jonk

v@id

ajo

nkv@

ida

55Onödiga klasser 2.1

Här finns metoder med olika kod

Men den enda skillnaden är i värden!

Ska inte ha olika klasser

Page 56: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

56

jonk

v@id

ajo

nkv@

ida

56Onödiga klasser 2.2: Lösning

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

Page 57: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av
Page 58: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

58

jonk

v@id

ajo

nkv@

ida

58Att vara eller icke vara Är den, eller har den?

Gör vi så här, ärver Circle funktionalitet från Point…

Trevligt! Gratismetoder!

Nej!

Är en cirkel en sorts punkt?

Page 59: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

59

jonk

v@id

ajo

nkv@

ida

59Att vara eller icke vara (2) En cirkel har en punkt – mittpunkten

Vill vi erbjuda liknande metoder? Delegera!

Page 60: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

60

jonk

v@id

ajo

nkv@

ida

60Att vara eller icke vara (3) Är den, eller har den?

Gör vi så här, ärver Queue funktionalitet från ArrayList…

Trevligt! Gratismetoder!

Nej!

Är en kö en sorts lista?

Listor kan stoppa in element var som helst,

ta bort var som helst, …

En kö kan ha en lista (se labbar)

Page 61: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

Om du bara har en hammare, ser alla problem ut som spikar

Använd komposition när det passar!

Page 62: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av
Page 63: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

63

jonk

v@id

ajo

nkv@

ida

63Typkontroll: Operatorn instanceof Vilken typ har ett visst objekt?

Exakt typ:

Subtyp:

Allt är !

Page 64: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

64

jonk

v@id

ajo

nkv@

ida

64Typkontroll: Operatorn instanceof (2) Kan användas för att göra olika saker beroende på typ…

”För alla Thing-objekt t

i samlingen thingsOnScreen”

Page 65: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

65

jonk

v@id

ajo

nkv@

ida

65Typkontroll: Operatorn instanceof (3) Kan användas för att göra olika saker beroende på typ…

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. "

Göra olika

beroende på typ…?

Det är ju detta

subtypspolymorfism

är till för!

Page 66: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

66

jonk

v@id

ajo

nkv@

ida

66Vad är problemet?

Centraliserat: Lägger man

till en ny sorts Thing, måste

denna metod också ändras!

Bräckligt, inte modulärt!

Single Responsibility Principle:

Kollisionshanteraren

borde inte bestämma

hur alla saker på skärmen

interagerar med spelaren!

Page 67: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

67

jonk

v@id

ajo

nkv@

ida

67Varför är polymorfism (oftast) bättre?

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

Page 68: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

68

jonk

v@id

ajo

nkv@

ida

68Icke-lösningar på problemet Ingen instanceof, men samma problem

Problemet är typkontrollen, inte instanceof

Be objektet använd polymorfism

Page 69: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

[email protected] – 2017

En kodlukt:Upprepning

Diskuteras i labb 4

Page 70: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

70

jonk

v@id

ajo

nkv@

ida

70Kodlukt 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

Page 71: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

Redundans och upprepning

Page 72: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

72

jonk

v@id

ajo

nkv@

ida

72Redundans? 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.

Page 73: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

73

jonk

v@id

ajo

nkv@

ida

73Undvik redundans 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

WET: Write Everything Twice

WET: We EnjoyTyping…

DRY-principen: Don’t RepeatYourself!

DIE: Duplication Is Evil

Page 74: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

Onödigt många metoder

Page 75: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

75

jonk

v@id

ajo

nkv@

ida

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

Page 76: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

Onödig upprepningav kodmönster

Page 77: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

Extrahera en hjälpmetod!

Page 78: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

78

jonk

v@id

ajo

nkv@

ida

78Upprepning av kodmönster (2) Extrahera upprepade uttryck till namngivna variabler

IDEA kan hjälpa till: Refactor | Extract | Variable

Lättare att se att delarna är medvetet identiska

Namnet ger en förklaring till deluttrycket

Snabbare kod

Page 79: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

79

jonk

v@id

ajo

nkv@

ida

79Upprepning i konstruktorer 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

Page 80: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

80

jonk

v@id

ajo

nkv@

ida

80Att hitta upprepad kod IDEA kan hitta vissa former av uppenbar repetition

Analyze | Locate Duplicates

Ni gör resten – alltför ineffektiv kod ger komplettering!

Page 81: Java and OOP - IDATDDD78/pdf/2017/TDDD78-2017-07... · 2017-02-08 · Java: Kan ange "extra information om koden" via annoteringar Exempel: @override kan stoppas in automatiskt av

Kan även hitta duplicerad kod ”on the fly”