Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
de
Diseo
Orientado
a
Objetos
PRINCIPIOS
DE
DISEO
DE
CLASES
PRINCIPIO
ABIERTO-CERRADO
(OCP):
Un
mdulo
debe
ser
abierto
para
extensin
pero
cerrado
para
modicacin.
Wikipidia:
La
nocin
de
que
las
en?dades
de
so@ware
deben
estar
abiertas
para
su
extensin,
pero
cerradas
para
su
modicacin.
Principio
Abierto-Cerrado:
Abierto
a
extensiones
Cerrado
a
modicaciones
de
cdigo
existente
debido
a
extensiones
PRINCIPIOS
DE
DISEO
DE
CLASES
El
Principio
Open/Closed
(Open/Closed
Principle,
OCP)
fue
acuado
por
el
Dr.
Bertrand
Meyer
en
su
libro
"Object
Oriented
So@ware
Construc?on"
y
bsicamente
lo
que
nos
dice
este
principio
es
que
"las
en?dades
de
so@ware
(clases,
mdulos,
funciones)
deben
estar
abiertas
para
extenderse,
pero
cerradas
para
modicacin".
Qu
signica
esto?:
Que
una
en?dad
?ene
que
ser
extendida
sin
necesidad
de
ser
modicada
internamente.
Por
ejemplo,
deberamos
poder
ampliar
la
funcionalidad
de
una
clase
va
herencia
sin
necesidad
de
tener
que
modicar
su
comportamiento
interno.
Principio
abierto/cerrado
Finalidad
Anlisis
Ambigedad
Clase
A
Clase
B
La
dependencia
uno
a
uno
se
transforma
en
una
dependencia
de
uno
a
muchos
Diseo
cerrado/cerrado
Ventajas
Clase
A
Abstracta
B
Clase
Evita
que
cambios
en
un
mdulo
afecten
a
otros
mdulos
Clase
B
1
Clase
B2
Diseo
abierto/cerrado
Principio
abierto/cerrado
Anlisis
Estn
abiertos
para
su
extensin
Clase
A
Abstracta
B
Clase
requisitos
de
la
aplicacin
cambien.
Estn
cerrados
para
su
modicacin
Clase
B
1
Clase
B2
El
cdigo
fuente
del
mdulo
es
inalterable.
No
se
permite
realizar
Diseo
abierto/cerrado
cambios
al
cdigo
fuente.
EJEMPLO:
NO
cumple
el
Principio
abierto/cerrado
VER
<EPD0.CPP>
EJEMPLO:
S
cumple
el
Principio
abierto/cerrado
Rectngulo Cuadrado
Rectngulo
Propiedades alto lado
ancho
ES
UN
?
Operaciones SetAlto(x) SetLado(z)
SetAncho(y) GetLado()
GetAlto() Cuadrado
GetAncho()
Propiedades
y
mtodos
Principio
de
sus?tucin
de
Liskov
Anlisis
Ambigedad:
S
es
sub?po
de
T
Los
programas
no
saben
si
trabajan
con
objetos
de
T
Obj-1
es
un
objeto
de
S
super?pos
o
de
sub?pos
Obj-2
es
un
objeto
de
T
Ventajas
S
El
enunciado
de
Mar?n
es
Para
todo
programa
P
(
T
)
confuso:
comportamiento
P(Obj-1)
=
comportamiento
P(Obj-2)
Los
sub7pos
deben
ser
sus7tuibles
Cuando
Obj-1
es
sus?tuido
por
Obj-2
por
los
super7pos,
pero
la
denicin
ERROR
Versin
que
S
respeta
el
principio
de
sus?tucin
de
Liskov
Versin
que
S
respeta
el
principio
de
sus?tucin
de
Liskov
Ejercicio
2:
Tarea
8
Agregue
a
la
Jerarqua
de
clases
del
programa
EDP1.CPP
dos
nuevas
Figuras:
Rectngulo3D
denido
mediante
alto,
ancho
y
largo
y
Cuadrado3D
en
el
que
alto=ancho=largo
incluyendo
los
mtodos:
void
EstableceAlto()
void
EstableceAncho()
void
EstableceLargo()
Principio
de
responsabilidad
nica
Principio
de
nica
Responsabilidad
(Single
responsibility
principle)
La
nocin
de
que
un
objeto
solo
debera
tener
una
nica
responsabilidad
El
Principio
de
responsabilidad
nica
(Single
Responsability
Principle
-
SRP)
fue
acuado
por
Robert
C.
Mar7n
en
un
arwculo
del
mismo
wtulo
y
popularizado
a
travs
de
su
conocido
libro
[patrones
Gof]
"Cada
objeto
en
el
sistema
deben
tener
una
simple
responsabilidad,
y
todos
los
servicios
de
los
objetos
deben
cumplir
con
esa
simple
responsabilidad"
En
trminos
prc?cos,
este
principio
establece
que:
"Una
clase
debe
tener
una
y
solo
una
nica
causa
por
la
cual
puede
ser
modicada.
"Cada
clase
debe
ser
responsable
de
realizar
una
ac?vidad
del
sistema
Principio
de
responsabilidad
nica
Principio
de
nica
Responsabilidad
(Single
responsibility
principle)
La
nocin
de
que
un
objeto
solo
debera
tener
una
nica
responsabilidad
Clase
X
Finalidad
Elementos
asociados
Cliente
P
Evitar
que
el
cambio
de
una
a
la
responsabilidad
A
responsabilidad
en
una
clase
pueda
provocar
fallos
en
las
dems
Cliente
Q
Elementos
asociados
responsabilidades
de
la
clase
a
la
responsabilidad
B
Evitar
que
los
clientes
de
una
clase
carguen
con
elementos
que
no
u?lizan
Diseo
con
una
sola
clase
(incorrecto)
Principio
de
responsabilidad
nica
Diseo
con
una
sola
clase
Diseo
con
dos
clases
(no
adecuado)
Clase
XA
Clase
X
Cliente
P
Elementos
asociados
Cliente
P
Elementos
asociados
a
la
responsabilidad
A
a
la
responsabilidad
A
Anlisis
Clase
X
Cliente
P
Responsabilidad
A
Realidad
del
principio:
Cliente
Q
Responsabilidad
B
Divisin
salomnica
puntual
Ambigedad:
Diseo
con
una
clase
Aumenta
entre
los
elementos
de
responsabilidades
separadas
Clase
XA
Aumenta
entre
la
clase
cliente
hacia
las
Cliente
P
Responsabilidad
A
clases
separadas
que
no
u?lizan
Disminuye
entre
la
clase
cliente
hacia
las
Clase
XB
clases
separadas
que
u?lizan
Cliente
Q
Responsabilidad
B
Diseo
con
dos
clases
Principio
de
inversin
de
dependencias
Finalidad:
Diseo
tradicional
Conseguir
que
los
cambios
en
los
mdulos
de
bajo
Nivel
Pol?ca
nivel
no
afecten
a
los
mdulos
de
alto
nivel
Nivel
Mecanismo
Facilitar
la
reu?lizacin
de
los
mdulos
de
alto
nivel
Nivel
U?lidad
Principio
de
inversin
de
dependencias
Pol?ca
Nivel
Interfaz
Nivel
Pol?ca
Pol?ca
Pol?ca
Mecanismo
Nivel
Mecanismo
Nivel
Interfaz
Mecanismo
Mecanismo
Nivel
U?lidad
U?lidad
Nivel
U?lidad
Ejemplo
que
NO
cumple
Principio
de
inversin
de
dependencias
Como ejemplo se va a tomar un programa sumamente simple, el cual
va a tener la misin de mandar los caracteres que se introduzcan por
el teclado a un archivo en disco. El diagrama de estructura que se
correspondera con dicho programa se muestra en la Figura siguiente.
Ejemplo
que
NO
cumple
Principio
de
inversin
de
dependencias
Ver <EPD2.CPP>
En este ejemplo las dos funciones de ms bajo nivel
LeerTeclado y GuardarArchivo son reutilizables, se pueden
utilizar en otros programas para acceder al teclado y para
guardar caracteres en un fichero de texto.
Anlisis
Interfaz
Z
Cliente
C
Mtodos
cliente
C
Extensin
del
principio
de
Cliente
D
Mtodos
cliente
D
responsabilidad
nica
Ambigedad
Diseo
con
una
interfaz
Aumenta
entre
los
mtodos
de
interfaces
separadas
Interfaz
ZC
Aumenta
entre
la
clase
cliente
hacia
los
Cliente
C
Mtodos
cliente
C
mtodos
de
las
interfaces
no
u?liza
Interfaz
ZD
Cliente
D
Mtodos
cliente
D
Diseo
con
dos
interfaces
Ejemplo
que
NO
cumple
Principio
de
separacin
de
la
interfaz
Supngase
que
se
est
desarrollando
un
sistema
de
seguridad,
en
el
que
existe
una
clase
que
es
Puerta.
Considrese
ahora
una
puerta
que
cuando
lleve
abierta
un
determinado
?empo
haga
sonar
una
alarma,
y
cuya
clase
va
a
denominarse
PuertaConAlarma.
Para
conseguir
este
obje?vo,
los
objetos
de
la
clase
PuertaConAlarma
deben
comunicarse
con
los
objetos
de
la
clase
Temporizador
que
lleva
el
control
del
?empo.
Ejemplo
que
NO
cumple
Principio
de
separacin
de
la
interfaz
Ejemplo
que
NO
cumple
Principio
de
separacin
de
la
interfaz
Se
ha
forzado
a
la
clase
Puerta,
y
por
tanto
a
la
clase
PuertaConAlarma,
a
heredar
de
ClienteTemporizador.
Esta
solucin
es
problem?ca,
debido
a
que
ahora
Puerta
depende
de
ClienteTemporizador,
y
no
todas
las
puertas
necesitan
de
este
control
de
?empo,
de
hecho
la
abstraccin
original
de
Puerta
no
contemplaba
en
absoluto
el
?empo.
Segn
este
diseo,
todas
las
puertas
que
se
deriven
de
Puerta
heredan
innecesariamente
de
la
clase
ClienteTemporizador.
Ejemplo
que
S
cumple
Principio
de
separacin
de
la
interfaz
La
solucin
a
este
problema
es
aplicar
el
principio
de
separacin
de
la
interfaz
en
el
diseo,
como
se
puede
apreciar
en
la.
Aqu
se
ha
hecho
uso
de
la
herencia
ml?ple,
de
forma
que
la
clase
PuertaConAlarma
herede
de
la
clase
Puerta
y
de
la
clase
ClienteTemporizador,
de
esta
forma
los
clientes
de
las
dos
clases
bases
podrn
recibir
objetos
de
PuertaConAlarma,
u?lizando
el
mismo
objeto
a
travs
de
interfaces
separadas.
Ejemplo
que
S
cumple
Principio
de
separacin
de
la
interfaz
Ley
de
Demter