Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Cualidades de Diseño - V2
Cualidades de Diseño - V2
Cualidades
de
Diseo
Versin 2.0
Abril 2014
1 de 13
Cualidades de Diseo
ndice
2 de 13
Cualidades de Diseo
1Sobreestetexto
1.1Versiones
1.2Brevereseahistrica
Este apunte constituye la segunda gran versin del apunte de cualidades de diseo, que se
viene desarrollando desde el ao 2004, integrado con el apunte de Cualidades de Software.
Es decir, si bien se trata de una completa reescritura del mismo, es en definitiva apunte con
ms de 10 aos de trabajo.
Porque, como vern, cualidades de diseo se trata no de recitar un catlogo de recetas, sino
de pensar, imaginar y aplicar criterio.
2Introduccin
2.1Cualidadesdediseovscualidadesdesoftware
3 de 13
Cualidades de Diseo
2.2Qusonlascualidadesde
diseo?
Esto nos da una intuicin de qu es la calidad del diseo. Lo que buscaremos ahora es
justamente refinar esta idea1, formar criterios ms sofisticados sobre qu diferencia a un buen
diseo de uno deficitario, que conoceremos como cualidades de diseo. Puesto en otros
trminos, nos ayudar a poder responder la pregunta: es el diseo A mejor que B?
2.3Paraqusirvenlascualidadesdediseo?
Como adelantamos, las cualidades de diseo nos servirn para comparar diseos y tomar
decisiones de diseo.
Y de qu forma nos ayudarn en estas tareas? Por un lado, expandirn nuestra mente y nos
recordarn varios aspectos a tener en cuenta antes de tomar una decisin de diseo. Y por
1
Dira Paenza: la intuicin es un msculo que se ejercita
4 de 13
Cualidades de Diseo
otro lado nos darn un vocabulario ms rico que nos permitir justificar mejor nuestras
opiniones y decisiones.
Y en general tambin deberemos tener en cuenta un contexto: por ejemplo, un diseo para
un componente no es ms flexible que otro, sino ms flexible ante un cierto escenario de
cambio.
2.4Tensionesentrelascualidades
Como veremos ms adelante, muchas veces nos encontramos con que favorecer una
cualidad de diseo en una solucin perjudica a otra. O por el contrario, una mejora en una
significa una mejora en otra.
Es decir, algunas cualidades tienen correlacin positiva, como por ejemplo cohesin y
abstraccin, o desacoplamiento y testeabilidad.
Estos casos son ms interesantes, porque tenemos que elegir a cual cualidad le daremos
preponderancia3. Y no slo con conocimiento tcnico sino tambin con conocimiento del
negocio y del contexto humano del desarrollo.
Algunos ejemplos:
si estamos construyendo un sistema provisorio cuyo tiempo de vida estimado es de 6
meses, no necesito pensar en la mantenibilidad.
2
Didcticamente es inevitable la metfora de la roca: la puedo ver como slida, robusta, y como algo
rgido, difcil de malear
3
Diria un popular y soez cantautor, tenes que elegir mi amor, todo no se puede tener
5 de 13
Cualidades de Diseo
2.5Unejemploreal
3Cualidadesquesepuedenestudiarconciertaindependencia
tecnolgica
Las primeras cualidades que atacaremos son aquellas que podramos estudiar al comparar
dos diseos con tan slo un un nivel superficial o intermedio la tecnologa sobre la que vamos
a implementarlos.
3.1Simplicidad
Dado que la idea de simplicidad es muy amplia, vamos a tomar la interpretacin de KISS
(Keep it simple, stupid) y YAGNI (You arent gonna need it): no sobredisear, focalizndonos
en las necesidades conocidas del sistema.
KISS Muchas veces hay abstracciones que no son fundamentales, no surgen del negocio
o su presencia no aporta a la solucin. Lo que nos propone KISS es que cualquier
complejidad innecesaria debera ser evitada.
6 de 13
Cualidades de Diseo
YAGNI Los requerimientos del hoy rara vez van a coincidir con los del maana. Lo que nos
propone YAGNI es no agregar funcionalidad nueva que no apunte a la problemtica actual,
es decir, no disear pensando en requerimientos en futuros hipotticos, sino focalizarnos en
las necesidades conocidas.
3.2Robustez
La robustez nos dice que ante un uso inadecuado por parte del usuario, sistemas externos o
ante fallas internas:
El sistema no debe generar informacin o comportamiento inconsistente/errtico.
El sistema debe reportar los errores y volver a un estado consistente.
El sistema debe facilitar tanto como sea posible la deteccin de la causa del problema.
Es decir, la robustez no se trata de evitar que un sistema falle, sino de la gracia con la que
lidia con la situacin excepcional.
Un principio que nos ayudar a mejorar esta cualidad en nuestras soluciones ser el de Fail
Fast (fallar rpido). Este nos propone que ante el indicio de un comportamiento incorrecto, el
sistema debe abortar de forma ordenada la ejecucin de su operatoria y reportar el error.
Esto contrasta con otra interpretacin de robustez: cunta tranquilidad le da al usuario el uso
de la aplicacin. Esto evidentemente no nos sirve para comparar tanto el diseo sino el
producto final, dado que en esa sensacin hay factores externos al mismo: calidad de la
implementacin, defectos en las tecnologas empleadas, el tiempo que se ha invertido en
probar el sistema, y los propios prejuicios del usuario. Por tanto, esta interpretacin no nos
ser de gran utilidad al disear.
7 de 13
Cualidades de Diseo
3.3Flexibilidad
3.3.1Extensibilidad
3.3.2Mantenibilidad
3.4(Des)acoplamiento
3.5Facilidaddeprueba(Testeabilidad)
3.6Cohesin
Un mdulo o componente cohesivo tiende a tener todos sus elementos abocados a resolver
el mismo problema. Puesto en otras palabras, la cohesin se trata de cuntas
responsabilidades tiene el componente: cuantas ms sean, menos cohesivo ser.
En el caso de objetos, podemos ver fcilmente cuando un objeto o clase tiene dos mtodos
que apuntan a resolver, cada uno, tareas diferentes.
8 de 13
Cualidades de Diseo
3.7Abstraccin
Podemos atacar a la idea de abstraccin en, al menos, dos ejes: su calidad y su cantidad.
Por un lado, construir buenas abstracciones que definan metforas consistentes y que
encajen con nuestros modelos mentales sobre la realidad. Dicho informalmente, que la
abstraccin cierre, no nos genere ruido
Ejemplo:
Nuestra abstraccin dejara de cerrar, no porque haya perdido cohesin (push e insert son
dos mtodos orientados a lo mismo: agregar elementos al contenedor) sino porque la
operacin de insercin en un una posicin arbitraria deja de encajar con la idea de una pila.
Parece un ejemplo tonto, pero miren como est modelada la clase Stack (deprecada en la
prctica) de Java desde sus primeras versiones (presten atencin a la herencia).
Por otro lado, podemos ver la cualidad de abstraccin segn cuntas de las abstracciones
presentes en el modelo de negocio tambin estn presentes en nuestra solucin. Lo que
vamos a buscar es que todas las abstracciones fundamentales del negocio que estamos
modelando estn presentes, es decir, no perder abstracciones en el camino del diseo y
construccin del sistema.
9 de 13
Cualidades de Diseo
3.8Consistencia
3.9Redundanciamnima
Puesto en otros trminos, no ser suficiente con crear buenas abstracciones y usarlas de
forma consistente siempre que corresponda, sino adems, deberemos evitar el solapamiento
entre las mismas: el conocimiento debe estar en un slo lugar.
3.10Mutacionescontroladas
10 de 13
Cualidades de Diseo
Por eso, un diseo que tiene ms control sobre las mutaciones (es decir, las circunscribe y
emplea slo cuando son necesarios) es mejor que aquel que no lo hace.
4Cualidadesqueslosepuedenestudiarconprofundo
conocimientodelatecnologa
4.1Seguridad
Un sistema seguro debe impedir que agentes (personas / sistemas) externos no autorizados
realicen acciones sobre el mismo, que agentes externos autorizados realicen acciones no
permitidas sobre el mismo.
4
Controlas las mutaciones se trata en realidad de una idea ms general: controlar los efectos (efectos
colaterales)
11 de 13
Cualidades de Diseo
4.2Escalabilidad
Facilidad con la que un sistema pensado para una determinada carga puede ser adaptado
para soportar una carga mayor.
4.3Eficiencia/Performance
Se trata de evaluar cun buen uso hace el sistema de los recursos disponibles, el sistema
tiene mejor eficiencia si requiere menos recursos para realizar una determinada tarea.
Podemos pensarlo en tres niveles:
5Conclusiones
Entonces, esta cualidades de diseo son slo algunas heursticas comnmente aceptadas.
Pero no son por nada del mundo reglas ni algoritmos que podamos seguir ciegamente. Nos
deben servir para expandir nuestra mente, no para cerrarla.
El resto de los criterios para decidir los pondrn ustedes, en base a la experiencia que
adquieran all afuera.
6Bibliografa
12 de 13
Cualidades de Diseo
13 de 13