30
8/14/2019 mobabb-innkapslingseksempel http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 1/30  1 Læringsmål for forelesningen • OO innkapsling vha. tilgangsmetoder –håndtering av konsistensregler • Java fra attributter til tilgangsmetoder • Eclipse generering av tilgangsmetoder

mobabb-innkapslingseksempel

Embed Size (px)

Citation preview

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 1/30

 1

Læringsmål for forelesningen

• OO– innkapsling vha. tilgangsmetoder

– håndtering av konsistensregler

• Java– fra attributter til tilgangsmetoder

• Eclipse– generering av tilgangsmetoder

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 2/30

 2

Forskjellige typer objekter

• Dataorienterte objekter– primært laget for å lagre sammenhørende dataverdier eller

knytte objekter sammen

• ”Vanlige” objekter– til sammenhørende data hører operasjoner

(også kalt metoder) for å manipulere dataene

• Funksjonsorienterte objekter– brukes utelukkende for evnene til å gjøre noe, f.eks.

behandle data som ligger i andre objekter

data

funksjoner 

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 3/30

 3

Illustrasjon av innkapsling

fra (den forrige) boka

object

Methods

Data

Client

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 4/30

 4

Innkapsling

• Attributtene til et objekt representerer en kompleks tilstand– hvert attributt kan ha en rekke verdier

– attributtene kan endres på ulike måter vha. metodene

• Det finnes regler for hvilke tilstander som er logisk gyldige

• Ved å utelukkende å tilby metoder for å endre tilstanden,kan et objekt lettere beskytte seg mot gal bruk 

• Innkapsling av et objekt, vedå

definere et metode-grensesnitt som sikrer riktig bruk, er et sentral poeng innenobjektorientering

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 5/30

 5

Eksempel:

mobil-abonnement og samtaler• Et mobil-abonnement er knyttet til en person og et SIM-kort .

• Et SIM-kort er knyttet til en person og en operatør .

• Et abonnement har en logg av samtaler (som må lagres en

viss tid).• En samtale gjøres fra et SIM-kort til et annet SIM-kort og

har et start-tidspunkt og en varighet .

• Et abonnement faktureres jevnlig, og har knyttet til seg endato for siste faktura.

• Abonnementet definerer regler for hvordan samtalekostnaderberegnes

– prisen er summen av en oppstartspris og pris pr. sekund

– samtaler under en viss tid, koster ingenting

– det er ulike priser for samtaler innen samme operatør og på tvers

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 6/30

 6

Hva kan et mobil-abonnement?

• Et mobil-abonnement gir deg tilgang til en rekke statiske data– en person

– et SIM-kort 

– en operatør 

• En må

kunne legge en samtale til loggen• En må kunne lese og endre pris-parametre innen/på tvers av operatør

• En må kunne beregne påløpte kostnader siden siste fakturering

SIM

String person

String operator 

MobAbb

Date lastInvoice

sim1

Conversation

SIM from, to

Date startint duration

1 logg1 n

Pricing

int startUp, prSek, timeLimit

internal external

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 7/30

 7

Hva forteller klassediagrammet?

• Hvordan datastrukturen skal settes opp

• Hvordan en skal navigere for å f å tak inødvendig informasjon

• Klassediagrammet er en grovoppskrift på 

hvordan klassen skal kodes!

SIM

String person

String operator 

MobAbb

Date lastInvoicesim1

Conversation

SIM from, to

Date start

int duration

1 logg1 n

Pricingint startUp, prSek, timeLimit

internal external

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 8/30

 8

La oss begynne å tenke kode...

SIM – stor sett statiske data

Samtale – stor sett statiske data

Pricing – stor sett statiske data

MobAbb – binder alt sammen

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 9/30

 9

SIM-klassen

• SIM-klassen innkapsler person og operatør• Det er ikke naturlig at disse kan endres, så derfor lager vi:

• en konstruktør med to parametre

 public SIM(String person, String operator) {this.person = person;

this.operator = operator;

}

• getter-metoder og ikke setter’e:

 public String getPerson() {return person;

}

 public String getOperator() {

return operator;

}

SIM

String person

String operator 

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 10/30

 10

Pricing-klassen

• Pricing-klassen innkapsler parametre for beregning avsamtalepris:– samtalen er gratis dersom samtalelengden er mindre enn timeLimit

– ellers er prisen startUp + samtalelengde * prSek

• For å endre prisinformasjon for et abonnement (altså medutgangspunkt i at en har en MobAbb-instans), har vi to

alternativer:

1. enten endre feltene i et av de to eksisterende Pricing-instanseneknyttet til en MobAbb-instans, eller

2. knytte MobAbb-instansen til en ny, ferdig innfylt Pricing-instans

Pricing

int startUp, prSek, timeLimit

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 11/30

 11

Pricing-klassen

• Alternativ 1 krever setter-metoder for hvert felt, meningen setter’e i MobAbb, for å bytte ut Pricing-instansene.

• I Pricing:

 public  void  setStartUp(int startUp) {

this.startUp = startUp;

}

 public  void  setPrSek(int prSek) {

this.prSek = prSek;

}

 public  void  setTimeLimit(int timeLimit) {

this.timeLimit = timeLimit;

}

Pricing

int startUp, prSek, timeLimit

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 12/30

 12

Pricing-klassen

• Alternativ 2 krever ingen setter-metoder i Pricing, mensetter’e i MobAbb, for å bytte ut Pricing-instansene.

• I Pricing:

 public Pricing(int startUp, int prSek, int timeLimit) {

this.startUp = startUp;

this.prSek = prSek;

this.timeLimit = timeLimit;}

• I MobAbb:

 public  void  setInternal(Pricing internal) {

this.internal = internal;

}

 public  void  setExternal(Pricing external) {

this.external = external;

}

• Vi velger alternativ 2

Pricing

int startUp, prSek, timeLimit

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 13/30

 13

Conversation-klassen

• Conversation-klassen innkapslerdata om en samtale:– hvem (SIM-instans) det ringes fra og til

– når samtalen startet og hvor lenge den varte

• I innkapslingen, dvs. valg av metoder, tar vi høyde for at

Conversation-instansene lages når samtalen kobles opp, slik at en må kunne sette lengden når samtalen avsluttes

 public Conversation(SIM from, SIM to, Date start) {

this.from = from;

this.to = to;

this.start = start;

}

 public  void  setDuration(int duration) {

// only allow setting to a positive value once

if (this.duration < 0) {

this.duration = duration;

}

}

Conversation

SIM from, to

Date start

int duration

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 14/30

 14

MobAbb-

klassen

• MobAbb-klassen syr det hele sammen

• En MobAbb-instans er knyttet til– én SIM-instans, gjennom sim-feltet

– to Pricing-instanser, gjennom internal og external-instansene

– et sett med Conversation-instanser, gjennom logg-feltet

• SIM-data må være tilgjengelig ved opprettelse av MobAbb: public MobAbb(SIM sim) {

this.sim = sim;

}

• Med innkapslingen bestemmer vi hvordan MobAbb-data blirtilgjengelig for andre klasser

MobAbb

Date lastInvoice

sim1 1 logg1 n

internal external

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 15/30

 15

MobAbb-

klassen

• SIM-kortet er ikke tilgjengelig, men SIM-data er: public String getPerson() {

return sim.getPerson();

}

 public String getOperator() {

return sim.getOperator();

}

• Pricing-data kan settes, men ikke leses: public  void  setInternal(Pricing internal) {

this.internal = internal;

}

 public  void  setExternal(Pricing external) {

this.external = external;

}

• Conversation-data kan legges til, men ikke leses: public  void  addConversation(Conversation conversation)

MobAbb

Date lastInvoice

sim1 1 logg1 n

internal external

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 16/30

 16

Hva er forskjellen på

• klasser og objekter

• klassediagram og objektdiagram

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 17/30

 17

Klasser vs. objekter/instanser

• Klasser– koden i en .java-fil

– beskriver hvordan datastruktureres i felt

– inneholder kode som operererpå dataene

– mal for opprettelse avobjekter/instanser med new-operatoren

– variabler (inkl. parametre/felt)

kan deklareres tilå

refereretil/peke på objekter

– metoder kan deklareres til å returnere objektreferanser

– vises i java-editoren

• Objekter/instanser– struktur av data som eksisterer

ved  kjøretid 

– inneholder struktur i form av

felt, med konkrete verdier– opprettes/lages dynamisk med

new-operatoren

– variabler (inkl. parametre/felt)kan referere til/peke på objekter

– objektreferanser kan overføressom argument til og returneresfra metoder

– vises i debug-modus (prøv!)

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 18/30

 18

Klassediagram

• Klasser (navn)

• Felt (type og navn)

• Assosiasjoner (navn og kardinalitet)

SIM

String person

String operator 

MobAbb

Date lastInvoicesim1

Conversation

SIM from, to

Date start

int duration

1 logg1 n

Pricing

int startUp, prSek, timeLimit

internal external

 Definerer (regler for) strukturen

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 19/30

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 20/30

 20

Objektdiagram

#1: SIM

String person =

String operator =

SIM sim1 = new SIM("Hallvard", "Telenor");

SIM sim2 = new SIM("Marit", "Telenor");

SIM sim3 = new SIM("Anton", "Netcom");

MobAbb abb = new MobAbb(sim1);

Conversation conversation1 = new Conversation(sim1, sim2, new Date());

Conversation conversation2 = new Conversation(sim1, sim2, new Date());

Conversation conversation3 = new Conversation(sim1, sim3, new Date());abb.addConversation(conversation1);

abb.addConversation(conversation2);

abb.addConversation(conversation3);

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 21/30

 21

Objektdiagram

#1: SIM

String person =

String operator =

SIM sim1 = new SIM("Hallvard", "Telenor");

SIM sim2 = new SIM("Marit", "Telenor");

SIM sim3 = new SIM("Anton", "Netcom");

MobAbb abb = new MobAbb(sim1);

Conversation conversation1 = new Conversation(sim1, sim2, new Date());

Conversation conversation2 = new Conversation(sim1, sim2, new Date());

Conversation conversation3 = new Conversation(sim1, sim3, new Date());abb.addConversation(conversation1);

abb.addConversation(conversation2);

abb.addConversation(conversation3);#2: SIM

String person =

String operator =

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 22/30

 22

Objektdiagram

#1: SIM

String person =

String operator =

SIM sim1 = new SIM("Hallvard", "Telenor");

SIM sim2 = new SIM("Marit", "Telenor");

SIM sim3 = new SIM("Anton", "Netcom");

MobAbb abb = new MobAbb(sim1);

Conversation conversation1 = new Conversation(sim1, sim2, new Date());

Conversation conversation2 = new Conversation(sim1, sim2, new Date());

Conversation conversation3 = new Conversation(sim1, sim3, new Date());abb.addConversation(conversation1);

abb.addConversation(conversation2);

abb.addConversation(conversation3);#2: SIM

String person =

String operator =#3: SIM

String person =

String operator =

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 23/30

 23

Objektdiagram

#1: SIM

String person =

String operator =

#4: MobAbb

Date lastInvoice =

sim

#6: Pricing

int startUp =, prSek =,

timeLimit =

internal external

#5: Pricing

int startUp =, prSek =,

timeLimit =

SIM sim1 = new SIM("Hallvard", "Telenor");

SIM sim2 = new SIM("Marit", "Telenor");

SIM sim3 = new SIM("Anton", "Netcom");

MobAbb abb = new MobAbb(sim1);

Conversation conversation1 = new Conversation(sim1, sim2, new Date());

Conversation conversation2 = new Conversation(sim1, sim2, new Date());

Conversation conversation3 = new Conversation(sim1, sim3, new Date());abb.addConversation(conversation1);

abb.addConversation(conversation2);

abb.addConversation(conversation3);#2: SIM

String person =

String operator =#3: SIM

String person =

String operator =

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 24/30

 24

Objektdiagram

#1: SIM

String person =

String operator =

#4: MobAbb

Date lastInvoice =

sim#7: Conversation

Date start =

int duration =

#6: Pricing

int startUp =, prSek =,

timeLimit =

internal external

#5: Pricing

int startUp =, prSek =,

timeLimit =

SIM sim1 = new SIM("Hallvard", "Telenor");

SIM sim2 = new SIM("Marit", "Telenor");

SIM sim3 = new SIM("Anton", "Netcom");

MobAbb abb = new MobAbb(sim1);

Conversation conversation1 = new Conversation(sim1, sim2, new Date());

Conversation conversation2 = new Conversation(sim1, sim2, new Date());

Conversation conversation3 = new Conversation(sim1, sim3, new Date());abb.addConversation(conversation1);

abb.addConversation(conversation2);

abb.addConversation(conversation3);

from

#2: SIM

String person =

String operator =#3: SIM

String person =

String operator =to

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 25/30

 25

Objektdiagram

#1: SIM

String person =

String operator =

#4: MobAbb

Date lastInvoice =

sim#7: Conversation

Date start =

int duration =

#6: Pricing

int startUp =, prSek =,

timeLimit =

internal external

#5: Pricing

int startUp =, prSek =,

timeLimit =

#8: Conversation

Date start =

int duration =

SIM sim1 = new SIM("Hallvard", "Telenor");

SIM sim2 = new SIM("Marit", "Telenor");

SIM sim3 = new SIM("Anton", "Netcom");

MobAbb abb = new MobAbb(sim1);

Conversation conversation1 = new Conversation(sim1, sim2, new Date());

Conversation conversation2 = new Conversation(sim1, sim2, new Date());

Conversation conversation3 = new Conversation(sim1, sim3, new Date());abb.addConversation(conversation1);

abb.addConversation(conversation2);

abb.addConversation(conversation3);

from

#2: SIM

String person =

String operator =#3: SIM

String person =

String operator =to

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 26/30

 26

Objektdiagram

#1: SIM

String person =

String operator =

#4: MobAbb

Date lastInvoice =

sim#7: Conversation

Date start =

int duration =

#6: Pricing

int startUp =, prSek =,

timeLimit =

internal external

#5: Pricing

int startUp =, prSek =,

timeLimit =

#8: Conversation

Date start =

int duration =#9: Conversation

Date start =

int duration =

SIM sim1 = new SIM("Hallvard", "Telenor");

SIM sim2 = new SIM("Marit", "Telenor");

SIM sim3 = new SIM("Anton", "Netcom");

MobAbb abb = new MobAbb(sim1);

Conversation conversation1 = new Conversation(sim1, sim2, new Date());

Conversation conversation2 = new Conversation(sim1, sim2, new Date());

Conversation conversation3 = new Conversation(sim1, sim3, new Date());abb.addConversation(conversation1);

abb.addConversation(conversation2);

abb.addConversation(conversation3);

from

#2: SIM

String person =

String operator =#3: SIM

String person =

String operator =

to

to

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 27/30

 27

Objektdiagram

#1: SIM

String person =

String operator =

#4: MobAbb

Date lastInvoice =

sim#7: Conversation

Date start =

int duration =

logg

#6: Pricing

int startUp =, prSek =,

timeLimit =

internal external

#5: Pricing

int startUp =, prSek =,

timeLimit =

#8: Conversation

Date start =

int duration =#9: Conversation

Date start =

int duration =

SIM sim1 = new SIM("Hallvard", "Telenor");

SIM sim2 = new SIM("Marit", "Telenor");

SIM sim3 = new SIM("Anton", "Netcom");

MobAbb abb = new MobAbb(sim1);

Conversation conversation1 = new Conversation(sim1, sim2, new Date());

Conversation conversation2 = new Conversation(sim1, sim2, new Date());

Conversation conversation3 = new Conversation(sim1, sim3, new Date());abb.addConversation(conversation1);

abb.addConversation(conversation2);

abb.addConversation(conversation3);

from

#2: SIM

String person =

String operator =#3: SIM

String person =

String operator =

to

to

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 28/30

 28

Objektdiagram

#1: SIM

String person =

String operator =

#4: MobAbb

Date lastInvoice =

sim#7: Conversation

Date start =

int duration =

logg

#6: Pricing

int startUp =, prSek =,

timeLimit =

internal external

#5: Pricing

int startUp =, prSek =,

timeLimit =

#8: Conversation

Date start =

int duration =#9: Conversation

Date start =

int duration =

SIM sim1 = new SIM("Hallvard", "Telenor");

SIM sim2 = new SIM("Marit", "Telenor");

SIM sim3 = new SIM("Anton", "Netcom");

MobAbb abb = new MobAbb(sim1);

Conversation conversation1 = new Conversation(sim1, sim2, new Date());

Conversation conversation2 = new Conversation(sim1, sim2, new Date());

Conversation conversation3 = new Conversation(sim1, sim3, new Date());abb.addConversation(conversation1);

abb.addConversation(conversation2);

abb.addConversation(conversation3);

from

#2: SIM

String person =

String operator =#3: SIM

String person =

String operator =

to

to

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 29/30

 29

Objektdiagram

#1: SIM

String person =

String operator =

#4: MobAbb

Date lastInvoice =

sim#7: Conversation

Date start =

int duration =

logg

#6: Pricing

int startUp =, prSek =,

timeLimit =

internal external

#5: Pricing

int startUp =, prSek =,

timeLimit =

#8: Conversation

Date start =

int duration =#9: Conversation

Date start =

int duration =

SIM sim1 = new SIM("Hallvard", "Telenor");

SIM sim2 = new SIM("Marit", "Telenor");

SIM sim3 = new SIM("Anton", "Netcom");

MobAbb abb = new MobAbb(sim1);

Conversation conversation1 = new Conversation(sim1, sim2, new Date());

Conversation conversation2 = new Conversation(sim1, sim2, new Date());

Conversation conversation3 = new Conversation(sim1, sim3, new Date());abb.addConversation(conversation1);

abb.addConversation(conversation2);

abb.addConversation(conversation3);

from

#2: SIM

String person =

String operator =#3: SIM

String person =

String operator =

to

to

8/14/2019 mobabb-innkapslingseksempel

http://slidepdf.com/reader/full/mobabb-innkapslingseksempel 30/30

30

Læringsmål for forelesningen

• OO– innkapsling vha. tilgangsmetoder

– håndtering av konsistensregler

• Java– fra attributter til tilgangsmetoder

• Eclipse– generering av tilgangsmetoder