Upload
hallvard
View
222
Download
0
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