Aprendre plegats
divendres, de març 04, 2005
 
ES2(40) La llei de Demeter i l'acoblament
Considereu l'exemple següent
Diagrama de classes
amb les operacions:
context Persona::onVius():String
body: llocDeResidència.dónaNom()

context Persona::onTreballes():String
body: empresa.onSituada().dónaNom()

context Població::dónaNom():String
body: nom

context Empresa::onSituada():Població
body: població

Les preguntes són:
1. Alguna d'aquestes operacions vulnera la llei de Demeter?.
2. Si és així, quines modificacions caldria fer per evitar-ho?.
3. (Si hi ha hagut modificacions) El disseny resultant té menys acoblament que l'original?

Comments:
1.
L'operació de Persona onTreballes() vulnera la Llei de Demeter.

context Persona::onTreballes():String
body: empresa.onSituada().dónaNom()

En el disseny d'aquesta operació podem apreciar que es crida l'operació onSituada() que retorna una Població i per obtindre el nom es crida dónaNom() d'aquesta Població retornada.
La idea bàsica de la Llei de Demeter és evitar invocar mètodes d'un atribut que ens està tornant un altre objecte, per no assumir coneixements estructurals dels objectes.
Per tant, onTreballes() vulnera aquest principi.

2.
Sent així, el que s'hauria de fer per evitar-ho és que l'operació onTreballes invoqui una operació de Empresa i sigui aquesta qui propagui la petició a Població.

Modificacions:

context Persona::onTreballes():String
body: empresa.onSituadaNom()

context Empresa::onSituadaNom():String
body: població.dónaNom()

3.
L'acoblament no és menor en el disseny resultant ja que la relació Viu, navegable de Persona a Població manté l'acoblament entre aquestes dues classes.
 
Estic d'acord amb el que diu l'Alex, menys en el punt 1, no l'acabo d'entendre. Jo simplement diria que es vulnera la llei de Demeter perquè l'objecte self invoca un objecte del tipus Població amb el que no esta directament associat.
Tinc un dubte però, en el cas concret que una persona visqui i treballi a la mateixa població no es vulneraria la llei no?
 
Bones,
potser sí que no em vaig acabar d'explicar bé en el primer punt...
El que volia dir és que Persona invoca un mètode (dónaNom()) d'un objecte que és "extrany" (Població) ja que és un objecte retornat per una altra classe, i que per això es vulnera la Llei de Demeter.

Pel dubte
"en el cas concret que una persona visqui i treballi a la mateixa població no es vulneraria la llei no?"
jo crec que en dir si una operació vulnera o no aquesta llei, no es pot parlar de casos concrets, sinó que s'ha de mirar com es fan les invocacions dels mètodes en el disseny de les operacions.

salut
 
Publica un comentari a l'entrada

<< Home

Powered by Blogger