You are on page 1of 43

SOLID y GRASP

Buenas prcticas hacia el xito en el


desarrollo de software

Juan Garca Carmona
d.jgc.it@gmail.com
15 de noviembre de 2012



!ste docu"ento contiene la prctica totalidad de lo expuesto por el autor durante el
si"posio cele#rado el d$a %& de 'o(ie"#re en la )scuela *cnica Superior de
In+enier$a Infor"tica de la ,ni(ersidad de Se(illa or+ani-ado por el +rupo de
in(esti+aci.n de In+enier$a /e# y *estin+ *e"prano 0I/*12 )n l se anali-an estos
dos acr.ni"os3 4SOLID5 y 4GRASP53 y se (en y ponen en prctica al+unos de los
principios #sicos del dise6o y la pro+ra"aci.n orientada a o#7etos con el o#7eti(o de
to"ar conciencia de di(ersas #uenas prcticas 8ue harn 8ue los siste"as 8ue
dise6e"os y los productos de software 8ue desarrolle"os sean de la "as alta
calidad
SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
1

Con#enido
9R)A*I:) 9O;;O'S Attri#ution<'on9o""ercial<'oDeri(s =% ,nported ...................... 3
SOLID y GRASP ............................................................................................................................. 5
Buenas prcticas hacia el xito en el desarrollo de software ...................................... 5
PRI'9IPIOS SOLID ................................................................................................................ 5
S SRP Sin+le Responsi#ility Principle ............................................................................ 6
Principio de >nica responsa#ilidad ...................................................................................... 6
)7e"plo ? ............................................................................................................................. 6
Soluci.n@ .............................................................................................................................. 7
O O9P Open A 9losed Principle ...................................................................................... 8
Principio a#iertoAcerrado ..................................................................................................... 8
)7e"plo@ ............................................................................................................................... 8
Soluci.n@ ............................................................................................................................ 10
L LSP LisBo( Su#stitution Principle ............................................................................. 12
Principio de sustituci.n de LisBo( 0Br#ara LisBo(2 ....................................................... 12
)7e"plo = ........................................................................................................................... 12
Soluci.n@ ............................................................................................................................ 14
I ISP Interface Se+re+ation Principle .......................................................................... 16
Principio de Se+re+aci.n de Interfaces ............................................................................ 16
)7e"plo C ........................................................................................................................... 16
Soluci.n@ ............................................................................................................................ 18
D DIP Dependency In(ersion Principle ........................................................................ 19
Principio de In(ersi.n de Dependencias ........................................................................... 19
)7e"plo .............................................................................................................................. 19
Soluci.n@ ............................................................................................................................ 20
R)S,;)' ................................................................................................................................ 22
GRASP: Patrones generales de asignacin de resonsa!ilidades ............................................... 23
Alta cohesi.n y #a7o acopla"iento ....................................................................................... 23
Alta cohesi.n ......................................................................................................................... 24
Ba7o acopla"iento ............................................................................................................... 24
9ontrolador ................................................................................................................................ 27
9reador ....................................................................................................................................... 29
SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
2
)xperto en infor"aci.n ........................................................................................................... 32
Da#ricaci.n Pura ....................................................................................................................... 34
Indirecci.n ................................................................................................................................. 35
Poli"orfis"o ............................................................................................................................. 36
:ariaciones prote+idas ............................................................................................................ 39
Soluci.n@ ................................................................................................................................ 40
'O*AS DI'AL)S.......................................................................................................................... 41


















SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
3
CR1A.I21 CO33O0S A##ribu#ion4
0onCommercia%40oDeriv 5*0 +n!or#ed

!sta o#ra3 4SOLID y GRASP. Buenas prcticas hacia el xito en el desarrollo de
softare53 se distri#uye #a7o licencia 9reati(e 9o""ons Attri#ution<
'on9o""ercial<'oDeri(s =% ,nported 099 BE<'9<'D =%2 lo cul si+nifica 8ue

,sted es li#re de@
F Com!ar#ir &#e documen#o < copiar3 distri#uir y co"unicar p>#lica"ente la o#ra

Ba7o las condiciones si+uientes@
" A##ribu#ion G De#e reconocer la autor$a de la o#ra de la "is"a for"a en la
8ue se hace a8u$ y #a7o las "is"as condiciones 099 BE<'9<'D =%2
" 0oncommercia% < 'o puede utili-ar esta o#ra directa o indirecta"ente para
fines co"erciales o con ni"o de lucro
" 0o Deriva#ive -or6 < 'o se puede alterar3 transfor"ar o a"pliar este
tra#a7o

)ntendiendo 8ue@
Al+una de estas condiciones pueden no aplicarse si se o#tiene el per"iso
expl$cito del titular de los derechos de autor3 en ste caso Huan Garc$a
9ar"ona
9uando la o#ra o al+uno de sus ele"entos es de do"inio p>#lico se+>n la
le+islaci.n aplica#le3 co"o sucede por e7e"plo con los textos 8ue han sido
copiados directa"ente de /iBipedia3 esta situaci.n no es en a#soluto
afectada por la licencia y no est su7eto a las "is"as condiciones

*en+a en cuenta 8ue para cual8uier reutili-aci.n o distri#uci.n3 usted de#e de7ar
claro a los otros los tr"inos de la licencia de esta o#ra La "e7or "anera de hacer
esto es con un enlace a esta p+ina we# 0http@AAcreati(eco""onsor+AlicensesA#y<
nc<ndA=%A2 o incluyendo la licencia as$@


SOLID 7 GRASP8 Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are* by Juan
Garca Carmona i %icened under a Crea#ive Common Reconocimien#o40oComercia%4
SinObraDerivada 5*0 +n!or#ed Licene*
SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
4













SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
5
SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*
PRI0CIPIOS SOLID

Los principios SOLID son cinco principios enunciados por Ro#ert 9 ;artin alrededor
del a6o 1%%% enfocados a la ela#oraci.n de software de calidad ,na clara definici.n
de los principios SOLID la pode"os encontrar en /iBipedia@
)n in+enier$a de software3 SOLID 0Sin+le responsi#ility3 Open<closed3 LisBo(
su#stitution3 Interface se+re+ation and Dependency in(ersion2 es un acroni"o
"ne".nico introducido por Rober# C* 3ar#in a co"ien-os de la decada del
1%%% 8ue representa cinco principios #sicos de la !ro9ramaci:n orien#ada a
ob/e#o y el dise6o 9uando estos principios se aplican en con7unto es "s
pro#a#le 8ue un desarrollador cree un siste"a 8ue sea ("ci% de man#ener y
am!%iar en e% #iem!o Los principio SOLID son +u$as 8ue pueden ser aplicadas
en el desarrollo de software para e%iminar c:di9o ucio pro(ocando 8ue el
pro+ra"ador ten+a 8ue refactori-ar el c.di+o fuente hasta 8ue sea le+i#le y
extensi#le De#e ser utili-ado con el desarrollo +uiado por prue#as o .DD3 y
for"a parte de la e#ra#e9ia 9%oba% del desarrollo +il de software y
pro+ra"aci.n adaptati(a
!sta definici.n es perfecta"ente (lida y se podr$a resu"ir diciendo 8ue son cinco
principios 8ue hay 8ue tener sie"pre presentes si 8uere"os desarrollar un software
de calidad3 le+i#le3 entendi#le y fcil"ente testea#le
IPor 8u fcil"ente testea#leJ
Principal"ente por8ue nos (a a o#li+ar a sacar "uchas interfaces3 cosa 8ue
fa(orecer la utili-aci.n de ;ocBin+3 y har 8ue el tra#a7o de testear una clase sea
conciso3 ade"s fa(orece el *DD por8ue se prepara el c.di+o para los sucesi(os
ca"#ios propios del *DDK
9o"o #ien dice la definici.n de /iBipedia los cinco principios son@
SRP8 Sin9%e Re!onibi%i#y Princi!%e
OCP8 O!en;C%oed Princi!%e
LSP8 Li6ov Sub#i#u#ion Princi!%e
ISP8 In#er(a<e Se9re9a#ion Princi!%e
DIP8 De!endency Inverion Princi!%e
)n sta sesi.n de tra#a7o (ere"os3 uno por uno3 cada principio3 si+uiendo ste +uion
con cada uno de ellos
? Definici.n ori+inal3 en in+ls
1 *raducci.n literal
= Interpretaci.n
SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
6
C ,n e7e"plo 8ue no cu"ple el principio y una explicaci.n de por 8u no lo
cu"ple 8ue incluye dia+ra"as estticos ,;L y c.di+o 9L
M *ra#a7o en +rupo para arre+lar dicho e7e"plo aplicando el principio en
cuesti.n
As$ 8ue "anos a la o#raK
S SRP Sin9%e Re!onibi%i#y Princi!%e
Princi!io de =nica re!onabi%idad
1nunciado ori9ina%@ N!here should ne"er #e $ore than one reason for a class to
chan%e
.raducci:n %i#era%8 N'o de#er$a ha#er nunca "s de una ra-.n para ca"#iar una
claseN
In#er!re#aci:n8 ,na clase de#er$a concentrarse s.lo en hacer una cosa de tal for"a
8ue cuando ca"#ie al+>n re8uisito en "ayor o "enor "edida dicho ca"#io s.lo
afecte a dicha clase por una ra-.n
1/em!%o 1
Enunciado:
Supon+a"os 8ue tene"os un pa8uete de software para la +esti.n de correos
electr.nicos )n al+>n lu+ar de dicho pa8uete3 antes del en($o de los correos en s$3
8uere"os esta#lecer los distintos par"etros 8ue3 por ahora3 son@
1mior
Rece!#or
Con#enido
UML ORIGINAL:

De una for"a "uy sencilla la interpretaci.n de dicho enunciado podr$a ser sta@



SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
7
CDIGO ORIGINAL:

E la i"ple"entaci.n es sta@
pu#lic interface I9orreo)lectronico
O
(oid Set)"isor0Strin+ e"isor2P
(oid SetReceptor0Strin+ receptor2P
(oid Set9ontenido0Strin+ contenido2P
Q

pu#lic class 9orreo)lectronico @ I9orreo)lectronico
O
pu#lic (oid Set)"isor0Strin+ e"isor2
O
Q
pu#lic (oid SetReceptor0Strin+ receptor2
O
Q
pu#lic (oid Set9ontenido0Strin+ contenido2
O
Q
Q

Po !u" incum#l$ $l #inci#io d$ %nica $&#on&a'ilidad(

SRP nos dice 8ue s.lo de#er$a ha#er un "oti(o para ca"#iar una clase o una interfa-
y3 por ende3 las clases 8ue la i"ple"entan IRu "oti(os (eis 8ue puedan hacer 8ue
la clase ca"#ieJ )n ste caso la traducci.n literal es clara3 si ca"#iara el contenido
por8ue3 por e7e"plo3 ad"itiera "s tipos3 ha#r$a 8ue "odificar el c.di+o cada (e-
8ue a6ada"os al+>n tipo de contenido o si3 por e7e"plo3 ca"#iara el protocolo y
8uisira"os a6adir "s ca"pos ta"#in ha#r$a 8ue "odificar la clase e"ail Por
tanto hay "s de un "oti(o por el 8ue tendr$a"os 8ue "odificar sta clase :ea"os
otro e7e"plo 8ue no cu"ple con el SRP
So%uci:n8
UML

SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
8
CDIGO

interface I9orreo)lectronico
O
(oid Set)"isor0Strin+ e"isor2P
(oid SetReceptor0Strin+ receptor2P
(oid Set9ontenido0I9ontenido content2P
Q

interface I9ontenido
O
Strin+ Get9ontenidoSeriali-ado02P AA para seriali-ar el contenido
Q

class 9orreo)lectronico @ I9orreo)lectronico
O
pu#lic (oid Set)"isor0Strin+ sender2 O Q
pu#lic (oid SetReceptor0Strin+ recei(er2 O Q
pu#lic (oid Set9ontenido0I9ontenido content2 O Q
Q

Si en (e- de un contenido Strin+ utili-a"os una interfa- I9ontenido 8ue supon+a un
contrato para hacer (ia#le cual8uier tipo de contenido cada (e- 8ue nos pidan 8ue
a6ada"os un tipo de contenido s.lo tendre"os 8ue "odificar dicha interfa- yAo las
clases 8ue lo i"ple"enten3 a lo 8ue afecte el ca"#io3 y no ya a la clase de
9orreo)lectr.nico y a su interfa- IRu os pareceJ
O OCP O!en ; C%oed Princi!%e
Princi!io abier#o;cerrado
1nunciado ori9ina%@ NSoftware entities 0classes3 "odules3 functions3 etc2 should #e
open for extension3 #ut closed for "odificationN
.raducci:n %i#era%8 NLas entidades de software 0clases3 ".dulos3 funciones3 etctera2
de#er$an estar a#iertas a la extensi.n pero cerradas a la "odificaci.nN
In#er!re#aci:n8 9a"#ia el co"porta"iento de una clase "ediante herencia3
poli"orfis"o y co"posici.n
)sto es3 antic$pate al ca"#io3 prepara tu c.di+o para 8ue los posi#les ca"#ios en el
co"porta"iento de una clase se puedan i"ple"entar "ediante herencia y
co"posici.n
1/em!%o8
Enunciado:
Dise6ar un editor +rfico capa- de di#u7ar un c$rculo y un rectn+ulo
SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
9
UML ORIGINAL:


CDIGO ORIGINAL:

pu#lic interface IDor"a
O
int Get*ipo02P
Q

pu#lic class Rectan+ulo @ IDor"a
O
pu#lic int Get*ipo02
O
return ?P
Q
Q

pu#lic class 9irculo @ IDor"a
O
pu#lic int Get*ipo02
O
return 1P
Q
Q

pu#lic class )ditorGrafico

pu#lic (oid Di#u7arDor"a0IDor"a for"a2
O
switch 0for"aGet*ipo022
O
case ?@
Di#u7a,nRectan+ulo00Rectan+ulo2for"a2P
#reaBP
case 1@
Di#u7a,n9irculo009irculo2for"a2P
#reaBP
Q
Q

pri(ate (oid Di#u7a,n9irculo09irculo c2
OAApinta un c$rculo
SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
10
Q

pri(ate (oid Di#u7a,nRectan+ulo0Rectan+ulo r2
OAApinta un rectn+ulo
Q
Q

:a"os siendo profesionales y ya he"os (isto s.lo con leer los re8uisitos 8ue circulo y
rectn+ulo son for"as as$ 8ue extrae"os una interfa- IDor"a y en nuestro editor
tene"os un "todo Di#u7arDor"a el cual3 dependiendo del tipo de la for"a 8ue se le
pase co"o par"etro di#u7a una for"a u otra peroK

Po !u" incum#l$ $l #inci#io a'i$to ) c$ado(

Por "arias ra&ones' pri$ero' atendiendo a ste principio sta clase editor %rfico no
est a#ierta a la extensi(n' y si )uisira$os a*adir una nue"a fi%ura %eo$trica
para su pintado... ha#r+a )ue crear la nue"a clase y ha#r+a )ue $odificar el $todo
p,#lico y a*adir uno pri"ado para el pintado de dicha nue"a for$a... "ale' y ade$s
si nos fi-a$os en el pri$er principio a*adir una nue"a for$a ser+a un $oti"o para el
ca$#io y a*adir una nue"a funcionalidad co$o por e-e$plo Borrar.or$a'
/ditar.or$a o cual)uier otra cosa )ue )uera$os )ue ha%a nuestro editor %rfico'
entonces ya tene$os un se%undo $oti"o para el ca$#io... Por tanto ste e-e$plo
incu$ple los dos pri$eros principios 0y al%uno $s...1
Bueno' )ue no cunda el pnico... So$os o "a$os a ser analistas' ar)uitectos o
in%enieros de softare... Pense$os un poco. 2o a)u+ "eo )ue las distintas for$as
)ue ahora tene$os y pro#a#le$ente las )ue ten%a$os si nos piden )ue a*ada$os
al%una otra tendrn una responsa#ilidad' la de di#u-arse a s+ $is$as. Si
retorcira$os todo ste c(di%o y en "e& de una interfa& tu"ira$os una clase
a#stracta .or$a de la )ue heredaran las de$s e i$ple$entaran un $todo
a#stracto Di#u-ar nos )uitar+a$os de un plu$a&o el pro#le$a de la extensi(n y el
pro#le$a del $oti"o de ca$#io...

So%uci:n8

I9ul es la responsa#ilidad principal del )ditor GrficoJ IDe#er$a el )ditor conocer
c."o se di#u7a cada for"aJ ,na #uena pista ser$a@ 4A#straeros un poco5K



UML

SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
11


Lo 8ue #usca"os es esto3 "s si"ple3 "s sencillo3 "s ro#usto3 "s cerrado a las
"odificaciones pues un c$rculo sie"pre se pinta i+ual y un rectn+ulo lo "is"o pero
a la (e- a#ierto a la extensi.n por8ue pode"os a6adir las for"as 8ue 8uera"os sin
tener 8ue "odificar c.di+o anterior en el )ditorGrfico IOs +ustaJ Sie"pre 8ue
ten+is co"porta"ientos 8ue dependan del tipo pensad en si se puede i"ple"entar
con una clase a#stracta Say "uchos e7e"plos en distintos len+ua7es so#re ste
tipo de soluciones

CDIGO

pu#lic a#stract class Dor"a
O
pu#lic a#stract (oid Di#u7ar02P

protected (oid Di#u7ar9o"un02
O
AA Parte co">n en todos los "todos di#u7ar para todas las for"as
Q
Q

pu#lic class Rectan+ulo @ Dor"a
O
pu#lic o(erride (oid Di#u7ar02
O
AA ISay al+o co">n en todos los "todos di#u7arJ
Di#u7ar9o"un02P
AA Di#u7a un Rectan+ulo
Q
Q

pu#lic class 9irculo @ Dor"a
O
pu#lic o(erride (oid Di#u7ar02
SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
12
O
AA ISay al+o co">n en todos los "todos di#u7arJ
Di#u7ar9o"un02P
AA Di#u7a un c$rculo
Q
Q

pu#lic class )ditorGrafico
O
pu#lic (oid Di#u7arDor"a0Dor"a for"a2
O
for"aDi#u7ar02P
Q
Q

)l c.di+o de esto es real"ente si"ple Ade"s3 una de las (enta7as de las clases
a#stractas es 8ue pode"os colocar en ellas todo el c.di+o 8ue es co">n y nos
e(ita"os tener 8ue "antener #lo8ues i+uales de c.di+o en distintos sitios3 cosa 8ue
suele ser una autntica pesadilla3 a"n de lo 8ue supone esto si esta"os haciendo
*DD pues lo co">n se testea una (e- y lo particular ta"#in
I'o es +enialJ De una for"a ele+ante he"os +anado en si"plicidad3 s.lo he"os
utili-ado una clase a#stracta con un "todo a#stracto 8ue ser i"ple"entado por
cada clase hi7a :oy a insistir en "i propia traducci.n de ste principio3 si has de
ca"#iar una clase ha-lo usando herencia y poli"orfis"o 'o de#es te"er el uso de
clases a#stractas ni interfaces sino al re(s3 potenciarlo3 ya 8ue son una ayuda
contra el acopla"iento de tu software 8ue te prote+en frente a ca"#ios
L LSP Li6ov Sub#i#u#ion Princi!%e
Princi!io de u#i#uci:n de Li6ov >B"rbara Li6ov?
1nunciado ori9ina%@ NDunctions that use pointers or references to #ase classes "ust
#e a#le to use o#7ects of deri(ed classes without Bnowin+ itN
.raducci:n %i#era%8 NLas funciones 8ue utilicen punteros o referencias a clases #ase
de#en ser capaces de usar o#7etos de clases deri(adas de stas sin sa#erloN
In#er!re#aci:n8 Las su#classes de#en co"portarse adecuada"ente cuando sean
usadas en lu+ar de sus clases #ase
1/em!%o 5
Enunciado:
,n cuadrado es un rectn+ulo con la peculiaridad de 8ue sus lados "iden
exacta"ente lo "is"o3 al "enos eso es lo 8ue ha deducido el tan alta"ente
cualificado y esti"ado +rupo de anlisis 8ue nos proporciona los re8uisitos para ste
tan poco ori+inal e7e"plo y 8uien nos proporciona a su (e- el si+uiente dia+ra"a
esttico de clases@
SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
13
UML ORIGINAL:


CDIGO ORIGINAL:

'osotros3 desarrolladores #ien "andados3 cu"pli"os a ra7ata#la dicho dia+ra"a y
escri#i"os el si+uiente c.di+o@
pu#lic class Rectan+ulo
O
pu#lic int Alto O +etP setP Q

pu#lic int Ancho O +etP setP Q

pu#lic int GetArea02
O
return Alto T AnchoP
Q
Q
pu#lic class 9uadrado @ Rectan+ulo
O
pu#lic o(erride int Alto
O
+et O return #aseAltoP Q
set O #aseAlto U #aseAncho U (alueP Q
Q

pu#lic o(erride int Ancho
O
+et O return #aseAnchoP Q
set O #aseAncho U #aseAlto U (alueP Q
Q
Q

pu#lic class Prue#a
O
pri(ate static Rectan+ulo Get'ewRectan+ulo02
O
AA Podr$a ser cual8uier o#7eto 8ue ta"#in sea un rectn+ulo
AA por e7e"plo un cuadrado I'oJ
return new 9uadrado02P
Q

SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
14
pu#lic static (oid ;ain02
O
(ar r U Get'ewRectan+ulo02P

AA )l usuario 4sa#e5 8ue r es un rectn+ulo
AA y asu"e 8ue puede darle (alor al alto y al ancho
rAlto U 1P
rAncho U =P

9onsole/riteLine0rGetArea022P
AA E al (er la consola el usuario dice@ /*DV
Q
Q

POR *U+ INCUMPLE EL PRINCIPIO(

ISe ha co"portado adecuada"ente la su#clase en sustituci.n de la clase padreJ
Puede 8ue sea cierto 8ue un cuadrado es un caso particular de un rectn+ulo en
"uchos aspectos pero3 Ien el caso del rea no se co"portan i+ualJ

So%uci:n8

De#ido a 8ue el co"porta"iento de un cuadrado no es coherente con el del
rectn+ulo3 la "e7or soluci.n es no tener un cuadrado heredando de un rectn+ulo
sino crear una interfa- de la 8ue hereden tanto cuadrado co"o rectn+ulo
WBenditas interfacesV

UML



SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
15
CDIGO

pu#lic interface IRectan+ular
O
(oid SetAlto0int alto2P
(oid SetAncho0int ancho2P
int GetArea02P
Q

pu#lic class Rectan+ulo @ IRectan+ular
O
pri(ate int XaltoP
pri(ate int XanchoP

pu#lic (oid SetAlto0int alto2
O
Xalto U altoP
Q

pu#lic (oid SetAncho0int ancho2
O
Xancho U anchoP
Q

pu#lic int GetArea02
O
return Xalto T XanchoP
Q
Q

pu#lic class 9uadrado @ IRectan+ular
O
pri(ate int XladoP

pu#lic (oid SetAlto0int alto2
O
Xlado U altoP
Q

pu#lic (oid SetAncho0int ancho2
O
Xlado U anchoP
Q

pu#lic int GetArea02
O
return Xlado T XladoP
Q
Q




SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
16
I ISP In#er(ace Se9re9a#ion Princi!%e
Princi!io de Se9re9aci:n de In#er(ace
1nunciado ori9ina%@ N9lients should not #e forced to depend upon interfaces that
they do not useN
.raducci:n %i#era%8 NLos clientes no de#er$an ser for-ados a depender de interfaces
8ue no utili-anN
In#er!re#aci:n8 ;antn las interfaces pe8ue6as y cohesi(as3 8ue puedan coexistir
unas con otras
1/em!%o @
Enunciado:
Supon+a"os la si+uiente interfa-@
pu#lic interface I*ra#a7ador
O
(oid *ra#a7ar02P
(oid Descansar02P
(oid 9o"er02P
Q

I"a+ine"os las si+uientes i"ple"entaciones de dicha interfa-@
pu#lic class *ra#a7adorPlanta @ I*ra#a7ador
O
pu#lic (oid *ra#a7ar02
O
AA *ra#a7a "ucho
Q

pu#lic (oid Descansar02
O
AA Descansa poco
Q

pu#lic (oid 9o"er02
O
AA 'ada3 co"o en casa y a8u$ no se conte"pla 8ue un tra#a7ador de planta pueda co"erK
AA IPara 8uJ
Q
Q

pu#lic class Desarrollador @ I*ra#a7ador
O
pu#lic (oid *ra#a7ar02
O
AA Parece 8ue #astante
Q

pu#lic (oid Descansar02
O
AA 4K es 8ue estoy co"pilando el c.di+oK5
Q

SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
17
pu#lic (oid 9o"er02
O
AA y ta"#in #e#er caf
Q
Q

pu#lic class Ro#ot @ I*ra#a7ador
O
pu#lic (oid *ra#a7ar02
O
AA Soy el 8ue "as tra#a7o3 de eso no ca#e duda
Q

pu#lic (oid Descansar02
O
AA IDescansar yoJ
Q

pu#lic (oid 9o"er02
O
AA IJ
Q
Q

E para 4controlar5 a stas i"ple"entaciones I8u tene"osJ Pues unK

pu#lic class HefeDespota
O AA ste no fallaK
pri(ate I*ra#a7ador Xtra#a7adorP

pu#lic (oid )le+ir*ra#a7ador0I*ra#a7ador tra#a7ador2
O AA IE si "e eli+e a "$J
Xtra#a7ador U tra#a7adorP
Q

pu#lic (oid ;andar02
O AA WA (er 8u pide ahoraV
Xtra#a7ador*ra#a7ar02P
Q
Q

Po !u" incum#l$ $l #inci#io d$ &$g$gaci,n d$ int$-ac$&(

IRu si+nifica se+re+arJ Pues la RA) dice@

se+re+ar 0Del lat se%re%3re2
? tr Separar o apartar al+o de otra u otras cosas
1 tr Separar y "ar+inar a una persona o a un +rupo de personas por "oti(os
sociales3 pol$ticos o culturales
= tr Secretar3 excretar3 expeler
SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
18
IRu sucede con las i"ple"entaciones anterioresJ IPor 8u el ro#ot tiene 8ue
i"ple"entar Descansar y co"er si nunca (a a descansar y dudo "ucho 8ue co"a
nadaJ

So%uci:n8

'os 8ueda"os con la pri"era definici.n de la RA)3 pero Ic."o pode"os separar unas
cosas de otrasJ IOs suena por e7e"plo ISeriali-a#leJ Si+nifica 8ue cual8uier clase 8ue
i"ple"ente ISeriali-a#le ser seriali-a#le3 ha+a"os lo "is"o con *ra#a7ar3 9o"er y
Descansar3 pode"os crear (arias interfaces 8ue se lla"en I*ra#a7ar o I*ra#a7a#leK

CDIGO

pu#lic interface I*ra#a7ar
O
(oid *ra#a7ar02P
Q

interface IDescansar
O
(oid Descansar02P
Q

pu#lic interface I9o"er
O
(oid 9o"er02P
Q

pu#lic class *ra#a7adorHornada9o"pleta@I*ra#a7ar3 IDescansar3 I9o"er
O
pu#lic (oid *ra#a7ar02
O

Q

pu#lic (oid Descansar02
O

Q

pu#lic (oid 9o"er02
O

Q
Q

pu#lic class *ra#a7ador;ediaHornada @ I*ra#a7ar3 IDescansar
O
pu#lic (oid *ra#a7ar02
O

Q
SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
19

pu#lic (oid Descansar02
O

Q
Q

pu#lic class Ro#ot@I*ra#a7ar
O
pu#lic (oid *ra#a7ar02
O

Q
Q

D DIP De!endency Inverion Princi!%e
Princi!io de Inveri:n de De!endencia
1nunciado ori9ina%@ NA Si+h le(el "odules should not depend upon low le(el
"odules Both should depend upon a#stractions
B A#stractions should not depend upon details Details should depend upon
a#stractionsN
.raducci:n %i#era%8 NA ;.dulos de alto ni(el no de#er$an depender de ".dulos de
#a7o ni(el A"#os de#er$an depender de a#stracciones
B Las a#stracciones no de#er$an depender de los detalles Los detalles de#er$an
depender de las a#straccionesN
In#er!re#aci:n8 para conse+uir ro#uste- y flexi#ilidad y para posi#ilitar la
reutili-aci.n ha- 8ue tu c.di+o dependa de a#stracciones y no de concreciones3 esto
es3 utili-a "uchas interfaces y "uchas clases a#stractas y3 so#retodo3 exp.n3 por
constructor o por par"etros3 las dependencias 8ue una clase pueda tener
1/em!%o
Enunciado:

'uestro cliente nos da el si+uiente re8uisito@
44uiero )ue la casa ten%a puerta y "entana5
Los clientes SI);PR) son as$3 parece "uy si"ple y en realidad lo es3 hasta 8ue lue+o
te dicen@
4!a$#in )uiero )ue las puertas y las "entanas sean personali&a#les5K


SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
20
CDIGO ORIGINAL:

9odificar esto no tiene nin+una co"plicaci.n3 Ino es ciertoJ@
pu#lic class Door
O
Q

pu#lic class /indow
O
Q

pu#lic class Souse
O
pri(ate Door XdoorP
pri(ate /indow XwindowP

pu#lic Souse02
O
Xdoor U new Door02P
Xwindow U new /indow02P
Q
Q

Po !u" incum#l$ $l #inci#io d$ in.$&i,n d$ d$#$nd$ncia&(

)n este e7e"plo Souse depende de Door y de /indow3 es decir3 de clases concretas y
no de a#stracciones

So%uci:n8

Podr$a"os "e7orarlo as$@

pu#lic class Souse
O
pri(ate IDoor XdoorP
pri(ate I/indow XwindowP

pu#lic Souse02
O
Xdoor U new Door02P
Xwindow U new /indow02P
Q

pu#lic IDoor DoorP
pu#lic I/indow /indowP
Q

Pero sta soluci.n es "edio #uena3 ya 8ue aun8ue al exponer dos propiedades 8ue
son Interfaces esta"os dependiendo de a#stracciones en (e- de en concreciones en
SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
21
el constructor he"os concretado creando una nue(a puerta y una nue(a (entanaK
;e7ore"os esto a>n "s y ha+a"os lo 8ue se conoce co"o 4Inyecci.n de
dependencias5 o 4Dependency In7ection5 0DI2

pu#lic interface IDoor
O
strin+ Get9olor02P
(oid OnOpen02P
(oid On9lose02P
Q

pu#lic class BrownDoor @ IDoor
O
pu#lic (oid OnOpen02 O Q
pu#lic (oid On9lose02 O Q
pu#lic strin+ Get9olor02
O
return NSoy una puerta "arr.nNP
Q
Q

pu#lic interface I/indow
O
strin+ GetSi-e02P
(oid OnOpen02P
(oid On9lose02P
Q

pu#lic class Bi+/indow @ I/indow
O
pu#lic (oid OnOpen02 O Q
pu#lic (oid On9lose02 O Q
pu#lic strin+ GetSi-e02
O
return NSoy una (entana +randeNP
Q
Q
pu#lic class Souse
O
pri(ate IDoor XdoorP
pri(ate I/indow XwindowP

pu#lic Souse02OQ

pu#lic Souse0IDoor door3 I/indow window2
O
Xdoor U doorP
Xwindow U windowP
Q

pu#lic IDoor DoorP
pu#lic I/indow /indowP
Q

SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
22
UML

R1S+310

Antes de to"arnos un pe8ue6o y "erecido descanso
?Y )spero no ha#eros a#urrido de"asiado con cosas tan #sicasK Se+uro 8ue ya
sa#$ais todo esto
1Y )spero 8ue3 al "enos a +randes ras+os3 hayis entendido 8u es lo 8ue persi+ue
cada principio de SOLID y 8ue (eis las (enta7as 8ue conlle(an la aplicaci.n de estos
principios tanto en las fases de anlisis co"o durante el desarrolloK I9ules de stos
principios creis 8ue ayudan "s a un desarrollo +il practicando *DDJ Desde lue+o la
in(ersi.n 0e inyecci.n2 de dependencias es ideal para hacer ;ocBin+ en tests
unitarios y el principio de >nica responsa#ilidad acota "ucho las clases de testeo3 el
principio a#iertoAcerrado3 LisBo( y la se+re+aci.n de interfaces ayudan "ucho a
dis"inuir el acopla"iento y en +eneral3 la su"a de todas estas prcticas nos
preparan frente a los ca"#iosK ;i resu"en total de SOLID es 8ue aplicar SOLID es
co"o tener una "alla de protecci.n a la hora de hacer un triple salto "ortal3 8ui-
sin protecci.n consi+a dar el salto pero con protecci.n3 co"o las pro#a#ilidades de
caer son altas3 si "e cai+o3 estoy se+uro Sin protecci.n3 si cai+o3 estoy "uerto ;i
experiencia "e dice 8ue3 hasta en desarrollos propios en los 8ue el cliente soy yo3 el
cliente SI);PR) 8uiere ca"#ios y3 por tanto3 el ca"#io de#e ser #ien(enido
=Y Rue despus de este rolla-o estis dispuestos a se+uir con otro te"a parecido@ los
patrones GRASP 0General Responsi#ility Assi+n"ent Software Patterns23 o patrones de
asi+naci.n de responsa#ilidades



)s el "o"ento de to"ar un descansoK
SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
23
GRASP: Patrones generales de asignacin de responsabilidades

)n el "undo an+losa7.n +ustan "ucho los 7ue+os de pala#ras )sto lo di+o por8ue3 de
i+ual for"a 8ue estoy se+uro de 8ue SOLID3 8ue si+nifica s.lido3 no fue ele+ido al
a-ar3 no creo 8ue sea casualidad 8ue se haya ele+ido el acr.ni"o GRASP para
desi+nar a los NGeneral Responsi#ility Assi+n"ent Software PatternsN3 o lo 8ue es lo
"is"o3 patrones +enerales de asi+naci.n de responsa#ilidades en software ya 8ue la
pala#ra Z+raspZ si+nifica co"prender3 entender o alcan-ar

GRASP son una serie de #uenas prcticas enfocadas a la calidad del software3 calidad
NestructuralN por lla"arla de al+una "anera3 ya 8ue no se ha centrado en prue#as
sino en la estructura y las responsa#ilidades de las clases 8ue co"ponen el software
8ue desarrolla"os GRASP hay 8ue considerarlo co"o una serie de #uenas prcticas3
unos pocos conse7os3 8ue hay 8ue se+uir si se 8uiere hacerlo #ien

GRASP son siete patrones o 4conse7os5@

? Alta cohesi.n y #a7o acopla"iento
1 9ontrolador
= 9reador
C )xperto en infor"aci.n
M Da#ricaci.n pura
[ Indirecci.n
\ Poli"orfis"o
] :ariaciones prote+idas

Al i+ual 8ue con SOLID (a"os a ir uno por uno (iendo pri"ero la definici.n3 (a"os a
entenderla y (a"os a aplicar cada patr.n de una "anera lo "s prctica posi#le )n
Internet pro#a#le"ente los encontris en otro orden3 en "i opini.n el orden
alfa#tico3 en castellano3 es tan #ueno co"o cual8uier otro :a"os a ello@
A%#a co$ei:n y ba/o aco!%amien#o

IRu si+nificaJ IRu es cohesi.n y acopla"ientoJ

1% 9rado de co$ei:n "ide la coherencia de una clase3 esto es3 lo coherente 8ue es
la infor"aci.n 8ue al"acena una clase con las responsa#ilidades y relaciones 8ue
sta tiene con otras clases

1% 9rado de aco!%amien#o indica lo (inculadas 8ue estn unas clases con otras3 es
decir3 lo 8ue afecta un ca"#io en una clase a las de"s y por tanto lo dependientes
8ue son unas clases de otras

9o"o se (e clara"ente3 los conceptos de cohesi.n y acopla"iento estn
$nti"a"ente relacionados ,n "ayor +rado de cohesi.n i"plica uno "enor de
acopla"iento ;axi"i-ar el ni(el de cohesi.n intra"odular en todo el siste"a resulta
en una "ini"i-aci.n del acopla"iento inter"odular

SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
24
A%#a co$ei:n

'os dice 8ue la infor"aci.n 8ue al"acena una clase de#e de ser coherente y de#e
estar3 en la "edida de lo posi#le3 relacionada con la clase Los puritanos y te.ricos
diferencian \ tipos de cohesi.n@
? Co$ei:n coinciden#e8 el ".dulo reali-a ">ltiples tareas pero sin nin+una
relaci.n entre ellas
1 Co$ei:n %:9ica8 el ".dulo reali-a ">ltiples tareas relacionadas pero en
tie"po de e7ecuci.n s.lo una de ellas ser lle(ada a ca#o
= Co$ei:n #em!ora%8 las tareas lle(adas a ca#o por un ".dulo tienen3 co"o
>nica relaci.n el de#er ser e7ecutadas al "is"o tie"po
C Co$ei:n de !rocedimien#o8 la >nica relaci.n 8ue +uardan las tareas de un
".dulo es 8ue corresponden a una secuencia de pasos propia del producto
M Co$ei:n de comunicaci:n8 las tareas corresponden a una secuencia de pasos
propia del producto y todas afectan a los "is"os datos
[ Co$ei:n de in(ormaci:n8 las tareas lle(adas a ca#o por un ".dulo tienen su
propio punto de arran8ue3 su codificaci.n independiente y tra#a7an so#re los
"is"os datos )l e7e"plo t$pico@ OBH)*OS
\ Co$ei:n (unciona%@ cuando el ".dulo e7ecuta una y s.lo una tarea3 teniendo
un >nico o#7eti(o a cu"plir
Ba/o aco!%amien#o

)s la idea de tener las clases lo "enos li+adas entre s$ 8ue se pueda3 de tal for"a
8ue3 en caso de producirse una "odificaci.n en al+una de ellas3 ten+a la "$ni"a
repercusi.n posi#le en el resto de clases3 potenciando la reutili-aci.n3 y
dis"inuyendo la dependencia entre las clases *a"#in hay (arios tipos de
acopla"iento

? Aco!%amien#o de con#enido8 cuando un ".dulo referencia directa"ente el
contenido de otro ".dulo 0hoy en d$a es dif$cil (erlo3 8ui- es "s fcil (erlo
en entornos de pro+ra"aci.n funcional2
1 Aco!%amien#o com=n8 cuando dos ".dulos acceden 0y afectan2 a un "is"o
(alor +lo#al
= Aco!%amien#o de con#ro%8 cuando un ".dulo le en($a a otro un ele"ento de
control 8ue deter"ina la l.+ica de e7ecuci.n del "is"o

Pero #asta de pala#rer$a3 pase"os a los e7e"plos Para ste pri"er principio ten+o
(arios e7e"plos "alos y uno #ueno

Sin conocer nada de 9L3

pu#lic class 9laseDeLo+icaDe'e+ocio
O
pu#lic (oid DoSo"ethin+02
O
AA 9o+e par"etros de confi+uraci.n
(ar u"#ral U intParse09onfi+uration;ana+erAppSettin+s^Nu"#ralN_2P
(ar connectionStrin+ U 9onfi+uration;ana+erAppSettin+s^NconnectionStrin+N_P

AA :a"os a por datos
(ar s8l U `Nselect T fro" cosas liBe para"etro a NP
s8l bU u"#ralP
SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
25

usin+ 0(ar connection U new S8l9onnection0connectionStrin+22
O
connectionOpen02P
(ar co""and U new S8l9o""and0s8l3 connection2P
usin+ 0(ar reader U co""and)xecuteReader022
O
while 0readerRead022
O
(ar no"#re U reader^N'o"#reN_*oStrin+02P
(ar destino U reader^NDetinoN_*oStrin+02P

AA Sa- al+o "s de l.+ica de ne+ocio por otro lado
Sacer;asLo+icaDe'e+ocio0no"#re3 destino3 connection2P
Q
Q
Q
Q
pu#lic (oid Sacer;asLo+icaDe'e+ocio0strin+ no"#re3 strin+ destino3 S8l9onnection conexion2
O
Q
Q

I'o huele un poco "al ste c.di+oJ Aun8ue ste c.di+o podr$a ha#erlo escrito yo3 cosas
peores he escrito3 leo esto y ten+o 8ue soltar un tre"endo /*DV IRuin tiene 8ue arre+lar
estoJ 'adie nace sa#iendoK

Otro e7e"plo3 i"a+ina 8ue tene"os la clase "ensa7e@

class ;ensa7e
O
pri(ate strin+ XparaP
pri(ate strin+ XasuntoP
pri(ate strin+ X"ensa7eP

pu#lic ;ensa7e0strin+ to3 strin+ su#7ect3 strin+ "essa+e2
O
Xpara U toP
Xasunto U su#7ectP
X"ensa7e U "essa+eP
Q
pu#lic (oid )n(iar02
O
AA en(ia el "ensa7e
Q
Q

I"a+ina 8ue despus al+uien pide 8ue se ha+a lo+in antes del en($o y el desarrollador hace lo
si+uiente@

class ;ensa7e:ersion1
O
pri(ate strin+ XparaP
pri(ate strin+ XasuntoP
pri(ate strin+ X"ensa7eP
pri(ate strin+ Xno"#re,suarioP

pu#lic ;ensa7e:ersion10strin+ to3 strin+ su#7ect3 strin+ "essa+e2
O
Xpara U toP
Xasunto U su#7ectP
SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
26
X"ensa7e U "essa+eP
Q

pu#lic (oid )n(iar02
O
AA en(ia el "ensa7e
Q

pu#lic (oid Lo+in0strin+ no"#re,suario3 strin+ contrase6a2
O
Xno"#re,suario U no"#re,suarioP
AA code to lo+in
Q
Q

De nue(o@ /*DV
IRuin ha tirado ste c.di+oJ I9untos principios SOLID incu"pleJ ISe ha hecho
"ediante *DDJ 0lo dudo "ucho2 IRuin lo (a a "antenerJ )spero 8ue no "e to8ue a
"$ por8ue tendr 8ue refactori-arlo y darle la (uelta del todo para 8ue sea
"anteni#leK I9."o lo ha+oJ
,na #uena soluci.n podr$a ser la in(ersi.n de dependencias3 la D de SOLID as$@
pu#lic interface ISer(icio)"ail
O
(oid )n(iar0strin+ asunto3 strin+ "ensa7e2P
Q
pu#lic interface ISer(icioLo+in
O
(oid Lo+in0strin+ no"#re,suario3 strin+ contrase6a2P
Q

pu#lic interface I,ser9ontroller
O
(oid Re+istrar02P
Q

pu#lic class ,ser9ontroller @ I,ser9ontroller
O
pri(ate readonly ISer(icio)"ail Xser(icio)"ailP
pri(ate readonly ISer(icioLo+in Xser(icioLo+inP

pu#lic ,ser9ontroller0ISer(icio)"ail ser(icio)"ail3 ISer(icioLo+in ser(icioLo+in2
O
AA Se har$an las de#idas co"pro#aciones y despus@
Xser(icio)"ail U ser(icio)"ailP
Xser(icioLo+in U ser(icioLo+inP
Q

pu#lic (oid Re+istrar02
O AA Autenticar y en(iar@
Xser(icioLo+inLo+in0NusuarioN3 Ncontrase6aN2P
Xser(icio)"ail)n(iar0NasuntoN3 N"ensa7eN2P
Q
AA )tcteraK
Q

SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
27
*u" #inci#io& /OLID &$ .$n $n "&t$ c,digo(

S@ cada claseAinterfa- cu"ple un >nico co"etido
O@ ,ser9ontroller est a#ierto a la extensi.n pero cerrada al ca"#io 0O23 lo cul no
si+nifica 8ue por re8uisitos ten+a 8ue crecerK
L@ se puede #uscar 8ue la 7erar8u$a de las i"ple"entaciones de los ser(icios cu"pla
con el principio de sustituci.n de LisBo( 0L2 y sie"pre puedas sustituir un ser(icio por
su clase padre
I@ hay se+re+aci.n de interfaces 0I2 y por eso se consi+uen otros principios
D@ ta"#in hay in(ersi.n 0inyecci.n2 de dependencias 0D2
Al hacerlo #ien he"os aplicado todos los principios SOLID y tene"os un c.di+o "uy
cohesi(o3 es decir3 la infor"aci.n de cada clase es coherente con ella "is"a3 y "uy
desacoplado3 esto es3 las clases estn "uy desli+adas unas de otras ha#iendo
potenciado esto "ediante el uso de interfaces y de"sK
Con#ro%ador

)l patr.n controlador es un patr.n 8ue sir(e co"o inter"ediario entre una
deter"inada interfa- y el al+orit"o 8ue la i"ple"enta3 de tal for"a 8ue es el
controlador 8uien reci#e los datos del usuario y 8uien los en($a a las distintas clases
se+>n el "todo lla"ado )ste patr.n su+iere 8ue la l.+ica de ne+ocio de#e estar
separada de la capa de presentaci.n3 lo 8ue au"enta la reutili-aci.n de c.di+o y
per"ite a la (e- tener un "ayor control Say "uchas ar8uitecturas de aplicaci.n 8ue
se #asan en esto3 desde el fa"oso ;:9 8ue ya (i estudiando la carrera hasta la
ar8uitectura ;::; tan utili-ada >lti"a"ente en aplicaciones de escritorio y la
>lti"a 8ue he practicado profesional"ente3 ;::;P3 8ue no es "s 8ue un
refina"iento sutil de la anterior


Se reco"ienda di(idir los e(entos del siste"a en el "ayor n>"ero de controladores
para poder au"entar as$ la cohesi.n y dis"inuir el acopla"iento

SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
28
,n 9ontrolador@
De#er$a ser el pri"er o#7eto lla"ado despus de un ca"#io en la interfa- de
usuario
9ontrolaAe7ecuta un caso de uso 'o hace de"asiado por si solo3 controla3
coordina
Pertenece a la capa de aplicaci.n o a la de ser(icios
!ste e7e"plo se centra en 8ue el controlador de#e ser el pri"er o#7eto lla"ado por
o#7etos de la ,I@
pu#lic class Al#u":iew
O
Q

pu#lic class Al#u"Presenter
O
Al#u":iew X(istaP
Al#u"9ontroller XcontroladorP

pu#lic (oid )ti8uetaAdded0strin+ eti8ueta2
O
Xcontrolador)ti8uetarDoto0eti8ueta2P
Q
Q

pu#lic class Al#u"9ontroller
O
pu#lic (oid )ti8uetarDoto0strin+ new*a+2
O
Q
Q

)ste otro e7e"plo se centra en 8ue el controlador no de#er$a hacer de"asiado3 tan
s.lo coordinar@
pu#lic class Al#u":iew
O
Q

pu#lic class Al#u"Presenter
O
Al#u":iew X(istaP
Al#u"9ontroller XcontroladorP

pu#lic (oid )ti8uetaAdded0strin+ eti8ueta2
O
Xcontrolador)ti8uetarDoto0eti8ueta2P
Q
Q

pu#lic class Al#u"9ontroller
O
pri(ate RepositorioDeDotos XrepositoryP

pu#lic (oid )ti8uetarDoto0strin+ nue(a)ti8ueta2
O
(ar foto U XrepositoryReadDoto02P
fotoAdd)ti8ueta0nue(a)ti8ueta2P
SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
29
Xrepository,pdateDoto0foto2P
Q
Q

pu#lic class RepositorioDeDotos
O
AA Operaciones 9R,D
pu#lic Doto ReadDoto02
O
return new Doto02P
Q

pu#lic (oid ,pdateDoto0Doto foto2
O
Q
Q

pu#lic class Doto
O
pu#lic (oid Add)ti8ueta0strin+ ta+2
O
Q
Q
Creador

La creaci.n de instancias es una de las acti(idades "s co"unes en un siste"a
orientado a o#7etos )n consecuencia es >til contar con un principio +eneral para la
asi+naci.n de las responsa#ilidades de creaci.n Si se asi+nan #ien el dise6o puede
soportar un #a7o acopla"iento3 "ayor claridad3 encapsula"iento y reutili-aci.n
)l patr.n creador nos ayuda a identificar 8uin de#e ser el responsa#le de la
creaci.n o instanciaci.n de nue(os o#7etos o clases !ste patr.n nos dice 8ue la
nue(a instancia podr ser creada por una clase si@
9ontiene o a+re+a la clase
Al"acena la instancia en al+>n sitio 0por e7e"plo una #ase de datos2
*iene la infor"aci.n necesaria para reali-ar la creaci.n del o#7eto 0es
Z)xpertaZ2
,sa directa"ente las instancias creadas del o#7eto
,na de las consecuencias de usar este patr.n es la (isi#ilidad entre la clase creada y
la clase creadora ,na (enta7a es el #a7o acopla"iento3 lo cual supone facilidad de
"anteni"iento y reutili-aci.n
:ea"os3 con una serie de e7e"plos de c."o aplicar ste patr.n correcta"ente #a7o
distintas circunstancias
)7e"plo #ase@
pu#lic class ListaDe9lientesPresenter
O
9liente XclientesP

pu#lic (oid AddButton9licBed02
SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
30
O
Q
Q

pu#lic class 9liente
O
ListcPedidoa XpedidosP
Q

pu#lic sealed class Pedido
O
Q

Donde 8uiera 8ue se lla"e al "todo AddButton9licBed se +enerar un nue(o pedido
y se lo Ndare"osN a una instancia de un cliente3 pero I8uin de#er$a crear ese pedidoJ
Lo 8ue nos dice ste principio es 8ue esa responsa#ilidad de#er$a recaer en 9liente
ya 8ue contiene Pedidos

)7e"plo 1@
pu#lic class ListaDe9lientesPresenter
O
9liente XclienteP

pu#lic (oid AddButton9licBed02
O
XclienteAddPedido02P
Q
Q

AA )n ste caso contiene o a+re+a la clase y ade"s "ane7a (arias instancias
pu#lic class 9liente
O
ListcPedidoa XpedidosP

pu#lic (oid AddPedido02
O
(ar nue(oPedido U new Pedido02P
XpedidosAdd0nue(oPedido2P
Q
Q

pu#lic sealed class Pedido
O
Q
AA Pero hay "s posi#ilidades

)7e"plo =@
AA Si la clase +uarda 0persiste2 la clase creada
AA Lo "s fcil es i"ple"entar un repositorio@

pu#lic class ListaDe9lientesPresenter
O
pri(ate RepositorioDePedidos repositorioDePedidosP

pu#lic (oid AddButton9licBed02
O
SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
31
Q
Q

pu#lic class 9liente
O
ListcPedidoa XpedidosP
Q

pu#lic class RepositorioDePedidos
O
Strea" Xpedidosd"lP

pu#lic Pedido LoadOrders02
O
AA 9ar+o el pedido y lo de(uel(o
return pedidoP
Q
Q

pu#lic sealed class Pedido
O
strin+ XidP

pu#lic Pedido0strin+ id2
O
Xid U idP
Q
Q

)7e"plo C@
AA La clase tiene la infor"aci.n necesaria para crear la nue(a clase
AA Por e7e"plo si 8uere"os 8ue Pedido ten+a el Id de cliente
pu#lic class ListaDe9lientesPresenter
O
9liente XclienteP
pu#lic (oid AddButton9licBed02
O
XclienteAddPedido02P
Q
Q

pu#lic class 9liente
O
ListcPedidoa XpedidosP
int XidP

pu#lic (oid AddPedido02
O
(ar nue(oPedido U new Pedido0Xid2P
XpedidosAdd0nue(oPedido2P
Q
Q

pu#lic sealed class Pedido
O
pri(ate int XclienteIdP
pu#lic Pedido0int clienteId2
O
XclienteId U clienteIdP
Q
Q
SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
32
)7e"plo M@
AA La clase usa directa"ente la clase creada
AA Por e7e"plo si 8uere"os 8ue el 9liente +estione PedidoAs
pu#lic class ListaDe9lientesPresenter
O
9liente XclienteP

pu#lic (oid AddButton9licBed02
O
Q
Q

pu#lic class 9liente
O
Pedido XpedidoP

AA La responsa#ilidad de crear esta clase 8ue l "is"o "ane7a tantas (eces recae so#re l a8u$
o en cual8uier otro lu+ar

pu#lic 9liente02
O
Xpedido U new Pedido02P
Q

pu#lic (oid DeleteOrder02
O
XpedidoBorar02P
Q

pu#lic (oid Rena"eOrder0strin+ new'a"e2
O
Xpedido;odificar02P
Q
Q

pu#lic sealed class Pedido
O
pu#lic (oid Borar02OQ
pu#lic (oid ;odificar02OQ
Q

De nue(o no hay "ucho "s 8ue decir so#re ste patr.n3 tan solo 8ue hay 8ue tener
en cuenta esos cuatro puntos a la hora de instanciar un o#7eto y pre+untarse si el
lu+ar en el 8ue se est reali-ando es el id.neo o no Darse cuenta de 8ue no se est
cu"pliendo con el patr.n creador es un #uen "oti(o para refactori-ar nuestro
c.di+o
1'!er#o en in(ormaci:n

!ste es el principio #sico de asi+naci.n de responsa#ilidades3 la S de SOLID3 y para
"$ es de los "s i"portantes de los patrones o principios GRASP
)xperto en infor"aci.n nos dice 8ue la responsa#ilidad de la creaci.n de un o#7eto o
la i"ple"entaci.n de un "todo3 de#e recaer so#re la clase 8ue conoce toda la
infor"aci.n necesaria para crearlo o e7ecutarlo3 de este "odo o#tendre"os un
SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
33
dise6o con "ayor cohesi.n y cuya infor"aci.n se "antiene encapsulada3 es decir3
dis"inuye el acopla"iento
pu#lic class Infor"e
O
pu#lic int^_ Parciales O +etP setP Q
Q
pu#lic class Infor"ePresenter
O
Infor"e Xinfor"eP

pu#lic (oid 9alculate*otalButton9licBed02
O
(ar total U %P
foreach 0(ar parcial in Xinfor"eParciales2
O
total U total b parcialP
Q

AA *IP@ ste #ucle lo pode"os con(ertir en un una expresi.n funcional usando Lin8@
AA (ar total U Xinfor"eParcialesA++re+ate0%3 0current3 parcial2 Ua current b parcial2P
Q
Q

De nue(o@ I8u falla a8u$J IPor 8u (iola ste principioJ
Por lo "is"o 8ue (iola la S de SOLID3 la responsa#ilidad de Infor"ePresenter es3
co"o su propio no"#re indica3 presentar un infor"e y en ste caso est calculando
el total W;alV )l total de#er$a drselo la clase Infor"e3 8ue es la 8ue tiene toda la
infor"aci.n al respecto3 ella es la experta y 8uien de#er$a calcularlo

pu#lic class Infor"e
O
pu#lic int^_ Parciales O +etP setP Q

pu#lic (oid 9alcular*otal02
O
(ar total U %P
foreach 0(ar parcial in Parciales2
O
total U total b parcialP
Q
Q
Q
pu#lic class Infor"ePresenter
O
pri(ate Infor"e Xinfor"eP

pu#lic (oid 9alculate*otalButton9licBed02
O
Xinfor"e9alcular*otal02P
Q
Q


SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
34
Re+la de oro@
!ste es el principio 8ue se de#er$a aplicar "s a "enudo3 el 8ue hay 8ue tener "s
en cuenta La su"a de N)xperto en infor"aci.nN y SRP es 8ue una clase s.lo de#er$a
tener un "oti(o para ca"#iar y de#er$a ser ella "is"a la encar+ada de crear los
o#7etos e i"ple"entar los "todos so#re los 8ue es experta
Aabricaci:n Pura

La fa#ricaci.n pura se da en las clases 8ue no representan un ente u o#7eto real del
do"inio del pro#le"a sino 8ue se han creado intencionada"ente para dis"inuir el
acopla"iento3 au"entar la cohesi.n yAo potenciar la reutili-aci.n del c.di+o
La fa#ricaci.n pura es la soluci.n 8ue sur+e cuando el dise6ador se encuentra con
una clase poco cohesi(a y 8ue no tiene otra clase en la 8ue i"ple"entar al+unos
"todos )s decir 8ue se crea una clase Nin(entadaN o 8ue no existe en el pro#le"a
co"o tal3 pero 8ue3 a6adindola3 lo+ra "e7orar estructural"ente el siste"a 9o"o
contraindicaci.n de#ere"os "encionar 8ue al a#usar de este patr.n suelen aparecer
clases funci.n o al+orit"o3 esto es3 clases 8ue tienen un solo "todo
,n e7e"plo de por8u tendr$a"os 8ue in(entarnos una clase fuera del do"inio del
pro#le"a3 i"a+ine"os 8ue esta"os pro+ra"ando el fa"oso An+ry Birds@
pu#lic class Pa7aro)nfadado
O
pu#lic (oid :olar02
O
Q

pu#lic (oid ;ostrar02
O
AA )n una interfa- de usuario
Q
Q

)l "todo ;ostrar NacoplaN al p7aro a la interfa- de usuario y co"o no 8uere"os
enfadarlo a>n "s har$a"os lo si+uiente@
pu#lic class Pa7aro)nfadado
O
pu#lic (oid :olar02
O
Q
Q

pu#lic class Pa7aro)nfadadoPresenter
O
pu#lic Pa7aro)nfadadoPresenter0Pa7aro)nfadado:iew (iew2
O
(iew;ostrar0new Pa7aro)nfadado022P
Q
Q

SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
35
pu#lic class Pa7aro)nfadado:iew
O
pu#lic (oid ;ostrar0Pa7aro)nfadado pa7aro)nfadado2
O
Q
Q

Ahora tene"os dos nue(as clases3 (iew y presenter )stas dos clases no existen en el
do"inio real del pro#le"a pero desacoplan enor"e"ente la i"ple"entaci.n del
p7aro de la interfa- de usuario E nos de7an 8ue la i"ple"entaci.n del p7aro
enfadado se centre en la l.+ica de ne+ocio y en nada "s3 una >nica
responsa#ilidad
I'o te suenaJ Se+uro 8ue si pero 8ui- nunca te ha#$as pre+untado el por8u de las
ar8uitecturas de n capas3 "e da i+ual 8ue sea ;:9 8ue ;:P3 8ue ;::; o ;::;P )s
una idea si"ple e intuiti(a a la 8ue ahora puedes ponerle un no"#re y decir 8ue se
#asa en el patr.n GRASP de NDa#ricaci.n puraN
Indirecci:n

:oy lle+ando al final de los patrones o principios GRASP3 ste3 la indirecci.n3 es
funda"ental y3 co"o #uenos profesionales3 de#er$a"os tenerlo "uy presente en
nuestros anlisis y decisiones ar8uitecturales
)l patr.n de indirecci.n nos per"ite "e7orar el #a7o acopla"iento entre dos clases
asi+nando la responsa#ilidad de la "ediaci.n entre ellos a una clase inter"edia
Prob%ema8 Id.nde de#o asi+nar responsa#ilidades para e(itar o reducir el
acopla"iento directo entre ele"entos y "e7orar la reutili-aci.nJ )s decir3 si sa#e"os
8ue un o#7eto utili-a otro 8ue "uy posi#le"ente (a a ca"#iar3 Ic."o prote+e"os a
un o#7eto frente a ca"#ios pre(isi#lesJ
So%uci:n8 asi+nar la responsa#ilidad a un o#7eto 8ue "edie entre los ele"entos para
prote+er al pri"er o#7eto de los posi#les ca"#ios del se+undo
I"a+ine"os 8ue esta"os desarrollando un co"ponente de software para hacer lo+s
dentro de una +ran ar8uitecturaK
pu#lic class 9ual8uierPresentador
O
Lo+C'et Xlo++erP

pu#lic (oid Al+oSaSucedido02
O
Xlo++erLo+0NAl+o ha sucedido y he"os tratado en el presentador dicho al+oN2P
Q
Q

pu#lic class Lo+C'et
O
pu#lic (oid Lo+0strin+ "essa+e2
O
SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
36
Q
Q

)n ste caso Lo+C'et podr$a ca"#iar3 de hecho espera"os 8ue ca"#ie por8ue lo
esta"os utili-ando3 si3 pero se nos 8ueda cortos I9."o aplica"os la indirecci.nJ
IRu tal si crea"os un ser(icio de lo++in inter"edioJ As$ el presentador utili-ar el
ser(icio y con un poco de suerte los ca"#ios en Lo+C'et no afectarn de"asiado al
resto del pro+ra"a
pu#lic class 9ual8uierPresentador
O
pri(ate Ser(icioLo+ Xlo++erP

pu#lic (oid Al+oSaSucedido02
O
Xlo++erLo+0NAl+o ha sucedido y he"os tratado en el presentador dicho al+oN2P
Q
Q

pu#lic class Ser(icioLo+
O
pri(ate Lo+C'et Xlo++erP

pu#lic (oid Lo+0strin+ "essa+e2
O
Xlo++erLo+0"essa+e2P
Q
Q

pu#lic class Lo+C'et
O
pu#lic (oid Lo+0strin+ "essa+e2
O
Q
Q

)ste patr.n es funda"ental para crear a#stracciones ya 8ue nos per"ite introducir
APIZs externas en la aplicaci.n sin 8ue ten+an de"asiada influencia en el c.di+o 8ue
tendr$a 8ue ca"#iar cuando ca"#iara la API Ade"s3 la pri"era clase podr$a
ca"#iarse fcil"ente para 8ue en (e- de sta API utili-ara cual8uier otra
Po%imor(imo

A lo lar+o de todos de sta sesi.n ha aparecido la pala#ra poli"orfis"o alrededor de
una decena de (eces y he dado por hecho 8ue todo el "undo sa#$a de 8u esta#a
ha#lando3 pero I8u es poli"orfis"oJ
Poli"orfis"o3 en pro+ra"aci.n orientada a o#7etos3 es un concepto "uy si"ple con
el 8ue la +ente a (eces se l$a3 poli"orfis"o es per"itir 8ue (arias clases se
co"porten de "anera distinta dependiendo del tipo 8ue sean
SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
37
Sie"pre 8ue se ten+a 8ue lle(ar a ca#o una responsa#ilidad 8ue dependa de un tipo3
se tiene 8ue hacer uso del poli"orfis"o3 es decir3 asi+nare"os el "is"o no"#re a
ser(icios i"ple"entados en diferentes o#7etos acordes con cada tipo
9o"o de costu"#re3 (ea"os esto con un e7e"plo N"aloN3 es decir3 "e7ora#le3 la
explicaci.n y un e7e"plo 8ue lo soluciona
pu#lic enu" *ipoDeLo+
O
De#u+3
)rror
Q

pu#lic class Lo+
O
Strea"/riter XficheroLo+P

pu#lic (oid Re+istrar0strin+ "ensa7e3 *ipoDeLo+ tipoDeLo+2
O
switch 0tipoDeLo+2
O
case *ipoDeLo+De#u+@
XficheroLo+/riteLine0N^D)B,G_PO%QN3 "ensa7e2P
#reaBP
case *ipoDeLo+)rror@
XficheroLo+/riteLine0N^)RROR_@O%QN3 "ensa7e2P
#reaBP
Q
Q
Q

pu#lic class 9ual8uierPresentador
O
Lo+ Xlo+P
pu#lic (oid Al+oSaSucedido02
O
Xlo+Re+istrar0NAl+o ha sucedido y 8uere"os de7ar constancia en un re+istroN3
*ipoDeLo+De#u+2P
Q
Q

IPor 8u est "alJ IPor 8u he"os de refactori-ar ste c.di+oJ
Se (e clara"ente la dependencia de la clase Lo+ y el "todo re+istrar con el
*ipoDeLo+ Pode"os e(itar esto creando una interfa- para el "ensa7e i"ple"entada
de dos for"as distintas3 una por cada tipo3 y s.lo tendre"os 8ue pedir a la clase Lo+
8ue re+istre un I;ensa7e E dependiendo de 8u "ensa7e 8uera"os re+istrar3 8uien
sepa de 8u tipo de#e ser re+istrado3 es decir3 el experto en infor"aci.n3 8ue cree
una instancia concreta y lla"e a Lo+Re+istrar

pu#lic interface I;ensa7eDelLo+
O
strin+ :alor O +etP Q
Q

pu#lic class ;ensa7eDe#u+ @ I;ensa7eDelLo+
SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
38
O
readonly strin+ X"ensa7eP

pu#lic ;ensa7eDe#u+0strin+ "ensa7e2
O
X"ensa7e U "ensa7eP
Q

pu#lic strin+ :alor
O
+et
O
return strin+Dor"at0N^D)B,G_PO%QN3 X"ensa7e2P
Q
Q
Q

pu#lic class ;ensa7e)rror @ I;ensa7eDelLo+
O
readonly strin+ X"ensa7eP

pu#lic ;ensa7e)rror0strin+ "ensa7e2
O
X"ensa7e U "ensa7eP
Q

pu#lic strin+ :alor
O
+et
O
return strin+Dor"at0N^)RROR_PO%QN3 X"ensa7e2P
Q
Q
Q

pu#lic class Lo+
O
Strea"/riter XficheroLo+P

pu#lic (oid Re+istrar0I;ensa7eDelLo+ "essa+e2
O
XficheroLo+/riteLine0"essa+e:alor2P
Q
Q

pu#lic class 9ual8uierPresentador
O
Lo+ Xlo+P

pu#lic (oid Al+oSaSucedidoERuere"osRe+istrar,n)rror02
O
Xlo+Re+istrar0new ;ensa7e)rror0NAl+o ha sucedido y 8uere"os de7ar constancia en un
re+istroN22P
Q

pu#lic (oid Al+oSaSucedidoERuere"osRe+istrarloParaDepurar02
OAA Por e7e"plo una excepci.n
Xlo+Re+istrar0new ;ensa7eDe#u+0NAl+o ha sucedido y 8uere"os de7ar constancia en un
re+istroN22P
Q
Q
SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
39
2ariacione !ro#e9ida

Sie"pre se ha dicho 8ue3 aplicando "etodolo+$as +iles al desarrollo de software3 el
ca"#io es #ien(enido3 ahora #ien3 el ca"#io es #ien(enido si lo espera"os I9untos
proyectos de software se ha#rn ido a pi8ue y cuantos profesionales ha#rn (isto su
reputaci.n por los suelos cuando el cliente ha pedido un pe8ue6o ca"#io cuyas
i"plicaciones o#li+aron a ar8uitectos y desarrolladores a e"pe-ar de ceroJ 'o s la
respuesta pero se+uro 8ue han sido de"asiados
)l ca"#io de#e ser #ien(enido3 claro3 por8ue los clientes sie"pre 8uieren ca"#ios y
les co#rare"os por desarrollarlos3 pero no de#en ser "oti(o de desesperaci.n
:ariaciones prote+idas3 es el principio funda"ental de prote+erse frente al ca"#io
)sto 8uiere decir 8ue lo 8ue (ea"os en un anlisis pre(io 8ue es suscepti#le de
"odificaciones lo en(ol(a"os en una interfa- y utilice"os el poli"orfis"o para crear
(arias i"ple"entaciones y posi#ilitar i"ple"entaciones futuras de "anera 8ue
8uede lo "enos li+ado posi#le a nuestro siste"a De sta for"a3 cuando se produ-ca
la (ariaci.n o el ca"#io 8ue espera"os3 dicho ca"#io nos repercuta lo "$ni"o)ste
principio est "uy relacionado con el poli"orfis"o y la indirecci.n
I"a+ine"os el si+uiente c.di+o@
pu#lic class I"a+enHpe+
O
pu#lic (oid Redi"ensionar0int nue(oAlto3 int nue(oAncho2
O
AA Resi-e
Q
Q

pu#lic class ;ostrarI"a+en9ontroller
O
pu#lic (oid BotonRedi"ensionar9licBed0I"a+enHpe+ i"a+e2
O
i"a+eRedi"ensionar0?%3 1%2P
Q
Q

IRu pro#le"as pueden sur+irJ IRu podr$a (ariarJ I9."o lo "e7ora"osJ
IRu pro#le"as pueden sur+irJ Si"ple3 puede suceder 8ue en (e- de una i"a+en 7pe+
nos "anden otro tipo de i"a+en IE c."o lo soluciona"osJ *a"#in si"ple si has
se+uido toda la serie de art$culos so#re GRASP y las distintas refactori-aciones 8ue
he"os hecho en cada caso3 #asta con a6adir una interfa- II"a+en con un "todo
Redi"ensionar3 de7ando el c.di+o as$@



SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
40
So%uci:n8

pu#lic interface II"a+en
O
(oid Redi"ensionar0int nue(oAlto3 int nue(oAncho2P
Q
pu#lic class I"a+enHpe+ @ II"a+en
O
pu#lic (oid Redi"ensionar0int nue(oAlto3 int nue(oAncho2
O
AA Resi-e
Q
Q

pu#lic class ;ostrarI"a+en9ontroller
O
pu#lic (oid BotonRedi"ensionar9licBed0II"a+en i"a+e2
O
i"a+eRedi"ensionar0?%3 1%2P
Q
Q

WGenialV Ea no nos tendr$a 8ue i"portar 8ue ca"#iara el tipo de i"a+en a
redi"ensionar3 al "enos a ste ni(el en nuestra aplicaci.n3 y ste e7e"plo es
extrapola#le a casi cual8uier situaci.n

Bueno3 a8u$ aca#a la sesi.n so#re SOLID y GRASP en los 8ue he"os ido (iendo las
"e7ores for"as de asi+nar responsa#ilidades a clases y "todos para +anar en
cohesi.n3 dis"inuir acopla"iento3 aplicar "e7or los principios SOLID3 prote+ernos
frente al ca"#io y3 en definiti(a3 ser "e7ores desarrolladores
De nue(o espero 8ue haya ser(ido de al+o3 8ue no os hayis a#urrido de "$ y "is
explicaciones y 8ue3 si creis 8ue todo esto es >til le deis al+o de di(ul+aci.n








SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
41
0O.AS AI0AL1S

;erece la pena co"entar@
IPor 8u SOLID y GRASP en unas charlas so#re *DDJ
o Beneficios de la extracci.n de interfaces y clases a#stractas para
;ocBin+ en *est unitarios
o 'o"enclatura /hen G ItShould en *ests unitarios refor-ada +racias a la
separacaci.n de responsa#ilidades y a la li"pie-a en nuestro c.di+o
Otros princios@
o DRE Donet Repeat Eourself
o fISS feep It Si"ple3 StupidV
o EAG'I Eou ainet +onna need it
;s infor"aci.n@
o Ro#ert 9 ;artin 04Dios5 cuando ha#la"os de POO3 autor a tener en
cuenta co"o referenciaK2
o Li#ros reco"endados@
9lean 9ode
Pra+"atic Pro+ra""er
















SOLID y GRASP
Buena !r"c#ica $acia e% &'i#o en e% dearro%%o de o(#)are*

+niveridad de Sevi%%a ,, I-.2 Do/o+S ,, Juan Garca Carmona ,, 0oviembre de 2012
42

You might also like