Академический Документы
Профессиональный Документы
Культура Документы
Diseño de clases
Síntomas de un mal diseño
El principio de responsabilidad única
El principio abierto-cerrado
El principio de sustitución de Liskov
El principio de inversión de dependencias
Clases abstractas e interfaces
El principio de segregación de interfaces
Ejemplo: Banca electrónica
Diseño de paquetes
Granularidad
Estabilidad
Bibliografía
Robert C. Martin:
“Agile Software Development: Principles, Patterns, and Practices”.
Prentice Hall, 2003. ISBN 0-13-597444-5.
http://www.objectmentor.com/resources
Diseño de clases
¿Cómo sabemos si nuestro diseño es correcto?
Principio abierto-cerrado
Rigidez
El sistema es difícil de cambiar porque cualquier cambio,
por simple que sea, fuerza otros muchos cambios en cascada.
¿Por qué es un problema?
“Es más complicado de lo que pensé”
Cuando nos dicen que realicemos un cambio, puede que nos
encontremos con que hay que hacer más cosas de las que, en
principio, habíamos pensado que harían falta.
Fragilidad
Los cambios hacen que el sistema deje de funcionar
(incluso en lugares que, aparentemente,
no tienen nada que ver con lo que hemos tocado).
¿Por qué es un problema?
Porque la solución de un problema genera nuevos problemas…
Inmovilidad
La reutilización de componentes requiere demasiado esfuerzo.
Complejidad innecesaria
El diseño contiene infraestructura que no proporciona beneficios.
¿Por qué es un problema?
A veces se anticipan cambios que luego no se producen, lo
que conduce a más código (que hay que depurar y mantener)
La complejidad innecesaria
hace que el software sea más difícil de entender.
Repetición innecesaria
“Copiar y pegar” resulta perjudicial a la larga.
¿Por qué es un problema?
Porque el mantenimiento puede convertirse en una pesadilla.
Opacidad
Código enrevesado difícil de entender.
¿Por qué es un problema? Porque la “entropía” del código
tiende a aumentar si no se toman las medidas oportunas.
Por ejemplo, podemos crear una clase Partida para representar una
partida de bolos (que consta de 10 jugadas):
Ejemplo
public class Modem
{
public void marcar (String número) …
public void colgar () …
No obstante,
pese a que la abstracción y el polimorfismo lo hacen posible,
el principio abierto-cerrado
no se garantiza simplemente con utilizar
un lenguaje de programación orientado a objetos.
De la misma forma,
tampoco tenemos que crear abstracciones arbitrariamente:
Si S es un subtipo de T,
cualquier programa definido en función de T
debe comportarse de la misma forma con objetos de tipo S.
¿Por qué? Porque cuando se usa una clase base, sólo se conocen las
precondiciones y postcondiciones asociadas a la clase base.
La programación estructurada
tiende a crear estructuras jerárquicas en las que
Una interfaz no encapsula datos, sólo define cuáles son los métodos
que han de implementar los objetos de aquellas clases que
implementen la interfaz.
OOP – Principios de diseño: Java - 18 - © Fernando Berzal
public class Circulo implements Figura
{
private double radio;
Como consecuencia,
todas las puertas, necesiten o no temporizador,
dependen del interfaz que utilizan los clientes de Temporizador.
Contaminación de la interfaz:
Cuando se añade un método a una clase base
simplemente porque una de sus clases derivadas lo necesita.
La clave:
Los clientes de un objeto de tipo T
no necesitan una referencia al objeto de tipo T para acceder a él:
basta con una referencia a uno de sus tipos base, o bien
una referencia a un objeto auxiliar que delegue las llamadas
necesarias en el objeto original de tipo T.
Granularidad:
La cohesión de los paquetes
¿Cuándo se ponen dos clases en el mismo paquete?
Un paquete debe ser más estable cuanto más abstracto sea (un
paquete estable y concreto se vuelve rígido).
Cuando trabajamos
en la construcción de la interfaz,
hemos de disponer de ciertos servicios
proporcionados por la aplicación.
Material adaptado de
Red
Centro de Controlador de
operaciones y mantenimiento la red de radio
Estación base
Estación base
RNCs
OMC
CPU
de operación y
mantenimiento
CPUs
para el procesamiento
de llamadas
Estación base
RNC
Estación Estación
base base
CPU
1. En las jerarquías de clases que haya creado hasta ahora, analice detenidamente si
alguna de sus clases ha de ser abstracta. En particular, fíjese en la existencia de
métodos que no deberían implementarse en una clase base y habrían de
declararse, por tanto, como métodos abstractos. ¿Alguna de las clases que
obtiene es completamente abstracta y debería convertirse en una interfaz?
2. Al estudiar clases y objetos, vimos cómo diseñar una alarma que conectábamos
a un sensor y activaba un timbre: