OO Analyse in de praktijk

16
OO Analyse OO Analyse in de praktijk in de praktijk IV OO basisregels IV OO basisregels

description

OO Analyse in de praktijk. IV OO basisregels. Boeken/tutorials:. Object Oriented Software Construction, Bertrand Meyer. Waarom regels ?. Consistentie Als iedereen dezelfde regels gebruikt, dan zullen de verschillende onderdelen goed samenwerken. - PowerPoint PPT Presentation

Transcript of OO Analyse in de praktijk

Page 1: OO Analyse in de praktijk

OO AnalyseOO Analysein de praktijkin de praktijk

IV OO basisregelsIV OO basisregels

Page 2: OO Analyse in de praktijk

2OO Analyse, IV OO basisprincipes

Boeken/tutorials:Boeken/tutorials:

Object Oriented Software Object Oriented Software Construction, Bertrand MeyerConstruction, Bertrand Meyer

Page 3: OO Analyse in de praktijk

3OO Analyse, IV OO basisprincipes

Waarom regels ?Waarom regels ?

ConsistentieConsistentie Als iedereen dezelfde regels gebruikt,Als iedereen dezelfde regels gebruikt,

dan zullen de verschillende onderdelen dan zullen de verschillende onderdelen goed samenwerken.goed samenwerken.

dan begijpt elk teamlid de code/het design dan begijpt elk teamlid de code/het design van een ander betervan een ander beter

Minder manieren om eenzelfde Minder manieren om eenzelfde probleem op te lossenprobleem op te lossen Minder tijdverlies bij het tobben over Minder tijdverlies bij het tobben over

welke oplossing het beste is. welke oplossing het beste is.

Page 4: OO Analyse in de praktijk

4OO Analyse, IV OO basisprincipes

Waarom regels ? Waarom regels ? (vervolg)(vervolg)

Betere Code:Betere Code: = Makkelijker/goedkoper/sneller te = Makkelijker/goedkoper/sneller te

wijzigen systemen, …wijzigen systemen, …

Opmerking hierover:Opmerking hierover:

Het belangrijkste blijft het respect Het belangrijkste blijft het respect voorvoor

het project, de code, de methode, enz.het project, de code, de methode, enz.

Page 5: OO Analyse in de praktijk

5OO Analyse, IV OO basisprincipes

Verschil object-klasseVerschil object-klasse

•• Een object is één instantie van een Een object is één instantie van een klasse.klasse.

•• Een klasse beschrijft Een klasse beschrijft algemeenheden over zijn objecten.algemeenheden over zijn objecten.

Voorbeeld :Voorbeeld :

Als Antwerpen een object is, dan zou Stad Als Antwerpen een object is, dan zou Stad zijn klasse kunnen zijn.zijn klasse kunnen zijn.

Page 6: OO Analyse in de praktijk

6OO Analyse, IV OO basisprincipes

Verschil object-klasse Verschil object-klasse

OefeningOefening

Vul de ontbrekende cellen in:Vul de ontbrekende cellen in:

ObjectObject KlasseKlasse

Andre AgassiAndre Agassi ……

AutoAuto

Page 7: OO Analyse in de praktijk

7OO Analyse, IV OO basisprincipes

Complete klasseComplete klasse•• Een klasse bevat i.h.a. zowel Een klasse bevat i.h.a. zowel

attributen als niet triviale attributen als niet triviale methoden. methoden.

Waarom: attributen en methoden Waarom: attributen en methoden van een klasse wijzigen vaak samen van een klasse wijzigen vaak samen en horen dus samen.en horen dus samen.

Voorbeeld :Voorbeeld :

Bankrekening

+haalAf(bedrag: double)

-stand: double

+schrijfOver(bedrag: double, naar: Bankrekening)+double getStand()

+setStand(stand: double)

Page 8: OO Analyse in de praktijk

8OO Analyse, IV OO basisprincipes

Complete klasseComplete klasse

OefeningOefening

Wat is er eigenaardig bij dit Wat is er eigenaardig bij dit voorbeeld:voorbeeld:

Verrichtingen

+haalAf(van :BR, bedrag)

+schrijfOver(bedrag, van: BR, naar: BR)

BankRekening

+getStand()

+setStand(stand)

-stand

Page 9: OO Analyse in de praktijk

9OO Analyse, IV OO basisprincipes

Veranderlijke Veranderlijke eigenschappeneigenschappen

•• Een veranderlijke eigenschap wordt Een veranderlijke eigenschap wordt voorgesteld door een attribuut. voorgesteld door een attribuut.

•• Een onveranderlijke eigenschap kan Een onveranderlijke eigenschap kan leiden tot een extra subklasse als het leiden tot een extra subklasse als het aantal waarden beperkt is.aantal waarden beperkt is.

Waarom?Waarom? attributen zijn wijzigbaar maar een attributen zijn wijzigbaar maar een

object kan niet van klasse veranderenobject kan niet van klasse veranderen Vb:Vb:

Persoon

GehuwdeAlleenstaande

Persoon

+getBurgStaat()…

-burgStaat

Page 10: OO Analyse in de praktijk

10OO Analyse, IV OO basisprincipes

Veranderlijke Veranderlijke eigenschappeneigenschappen

Oefening 1Oefening 1Stel we willen modelleren dat sommige Stel we willen modelleren dat sommige

vogels tot een soort behoren die kan vogels tot een soort behoren die kan zwemmen, en andere niet.zwemmen, en andere niet.

Is dit goed ?Is dit goed ?

Vogel

+fladder()…

-kanZwemmen: bool…

Page 11: OO Analyse in de praktijk

11OO Analyse, IV OO basisprincipes

Veranderlijke Veranderlijke eigenschappeneigenschappen

Oefening 2Oefening 2

Is dit goed ?Is dit goed ?

Persoon

+getLeeftijd()+trouwMet(Persoon partner)…

-gebDatum…

Page 12: OO Analyse in de praktijk

12OO Analyse, IV OO basisprincipes

Gemeenschappelijke codeGemeenschappelijke code

•• Gemeenschappelijke code binnen Gemeenschappelijke code binnen een klasse moet ondergebracht een klasse moet ondergebracht worden in een aparte methode die worden in een aparte methode die dan meermaals wordt opgeroepen.dan meermaals wordt opgeroepen.

Waarom ?Waarom ? Wijzigingen moeten dan nog maar op 1 Wijzigingen moeten dan nog maar op 1

plaats gebeuren. -> vermijden van bugs.plaats gebeuren. -> vermijden van bugs. Voorbeeld: zie volgende slideVoorbeeld: zie volgende slide

Page 13: OO Analyse in de praktijk

13OO Analyse, IV OO basisprincipes

// TWIJFELACHTIG:// TWIJFELACHTIG:

public Class BesteldProdukt{public Class BesteldProdukt{

… …

public double getBTW(){public double getBTW(){

return return ((aant*prijs-kortingaant*prijs-korting)*)* BTWPERCBTWPERC;;

}}

public double getTotaal(){public double getTotaal(){

return return ((aant*prijs-kortingaant*prijs-korting) +) +

((aant*prijs-kortingaant*prijs-korting)*)*BTWPERCBTWPERC

}}

}}

// Probleem: Stel ik wil extra korting// Probleem: Stel ik wil extra korting

// toekennen -> 3 keer wijzigen// toekennen -> 3 keer wijzigen

// BETER:// BETER:

public Class BesteldProdukt{public Class BesteldProdukt{

……

public double getNetto(){public double getNetto(){

return return aant*prijs-kortingaant*prijs-korting;;

}}

public double getBTW(){public double getBTW(){

return return getNetto()getNetto()**BTWPERCBTWPERC;;

}}

public double getTotaal(){public double getTotaal(){

return return getNetto()getNetto()

+ + getBTW();getBTW();

}}

}}

Gemeenschappelijke codeGemeenschappelijke code VoorbeeldVoorbeeld

Page 14: OO Analyse in de praktijk

14OO Analyse, IV OO basisprincipes

public Class GeldAutomaat{public Class GeldAutomaat{

public void vraagRekeningStand(){public void vraagRekeningStand(){

drukAfOpScherm(“Geef pin”);drukAfOpScherm(“Geef pin”);

setPin(getLaatstIngelezenString());setPin(getLaatstIngelezenString());

if ( curPin().equals(curRek().getPin()) )if ( curPin().equals(curRek().getPin()) )

drukAfOpScherm(getRek().getStand());drukAfOpScherm(getRek().getStand());

}}

public void haalGeldAf(){public void haalGeldAf(){

double bedrag;double bedrag;

drukAfOpScherm(“Geef pin”);drukAfOpScherm(“Geef pin”);

setPin(getLaatstIngelezenString());setPin(getLaatstIngelezenString());

if ( curPin().equals(curRek().getPin()) ) {if ( curPin().equals(curRek().getPin()) ) {

... // af te halen geld opvragen... // af te halen geld opvragen

bedrag = …bedrag = …

getRek().haalAf(bedrag);getRek().haalAf(bedrag);

}}

}}

}}

// BETER:// BETER:

public Class GeldAutomaat{public Class GeldAutomaat{

private String curPin;private String curPin;

private String curRek; private String curRek;

public haalPin(){public haalPin(){

drukAfOpScherm(“Geef pin”);drukAfOpScherm(“Geef pin”);

setPin(getLaatstIngelezenString());setPin(getLaatstIngelezenString());

}}

public booleana pinOk(){public booleana pinOk(){

return curPin().equals(curRek().getPin())return curPin().equals(curRek().getPin())

}}

public void vraagRekeningStand(){public void vraagRekeningStand(){

haalPin();haalPin();

if ( pinOk()) {if ( pinOk()) {

drukAfOpScherm(getRek().getStand())drukAfOpScherm(getRek().getStand())

}}

}}

public void haalGeldAf(){public void haalGeldAf(){

double bedrag;double bedrag;

haalPin();haalPin();

if ( pinOk() ) {if ( pinOk() ) {

… … ... // af te halen geld opvragen... // af te halen geld opvragen

bedrag = …bedrag = …

getRek().haalAf(bedrag);getRek().haalAf(bedrag);

}}

}}

Gemeenschappelijke codeGemeenschappelijke code Oefening: Verbeter de code:Oefening: Verbeter de code:

Page 15: OO Analyse in de praktijk

15OO Analyse, IV OO basisprincipes

Command-QueryCommand-Query

•• 1. Een methode die een resultaat 1. Een methode die een resultaat teruggeeft, mag NIETS wijzigen. (query)teruggeeft, mag NIETS wijzigen. (query)

•• 2. Een methode die iets wijzigt, mag 2. Een methode die iets wijzigt, mag GEEN resultaat teruggeven. (command)GEEN resultaat teruggeven. (command)

Waarom ?Waarom ? Alg.: Een methode moet 1 duidelijk omlijnde Alg.: Een methode moet 1 duidelijk omlijnde

opdracht hebben.opdracht hebben. Je verwacht niet dat een query iets wijzigt (side Je verwacht niet dat een query iets wijzigt (side

effect).effect). Voorbeeld. Volgende slide.Voorbeeld. Volgende slide.

Page 16: OO Analyse in de praktijk

16OO Analyse, IV OO basisprincipes

Command-QueryCommand-Query// TWIJFELACHTIG:// TWIJFELACHTIG:

public class mijnRij{public class mijnRij{

private Object[20] rij;private Object[20] rij;

private int tel = -1;private int tel = -1;

public Object getNext(){public Object getNext(){

tel++; tel++;

if ( tel < rij.length )if ( tel < rij.length )

return rij[tel]; return rij[tel];

else{else{

tel--;tel--;

return null; return null;

}}

}}

public boolean hasNext(){public boolean hasNext(){

return tel < rij.length-1;return tel < rij.length-1;

}}

public void reset(){ tel=-1;}public void reset(){ tel=-1;}

}}

// BETER:// BETER:

public class mijnRij{public class mijnRij{

private Object[20] rij;private Object[20] rij;

private int tel = 0;private int tel = 0;

public Object getElement(){public Object getElement(){

if (tel < rij.length)if (tel < rij.length)

return rij[tel];return rij[tel];

}}

public void next(){public void next(){

if (tel < rij.length)if (tel < rij.length)

tel++;tel++;

}}

public boolean eof(){public boolean eof(){

return tel == rij.length;return tel == rij.length;

}}

public void reset(){ tel=0;}public void reset(){ tel=0;}

}}