Professional Documents
Culture Documents
Principios generales
En ocasiones, podemos encontrar una función existente que hace "casi" lo mismo
que queremos, pero necesitamos que haga algo extra o que no lo haga. Si te
encuentras en este caso, en lugar de duplicar la función, mejor añádele un
parámetro, y utiliza la información de ese parámetro para que la función haga el
trabajo que necesitas o crea una nueva función y en esa nueva función llama a la
existente y aplícale los nuevos cambios.
El código duplicado hace que nuestro código sea más difícil de mantener y
comprender además de generar posibles inconsistencias. Para ello, dependiendo
del caso concreto, la refactorización, la abstracción o el uso de patrones de diseño
pueden ser alternativas viables.
Debes intentar hacer que todo lo que escribes sea fácil de utilizar. Esto empieza por
hacer que tu código esté organizado y que sea intuitivo para los miembros de tu
equipo el navegar y encontrar lo que ya pudiera existir en el sistema.
Aplicar siempre las cosas cuando realmente los necesita, no cuando lo que prevén
que los necesita." - Ron Jeffries
Este principio nos viene a decir que una clase sólo debería tener una única razón
para cambiar. En términos prácticos, este principio establece que:
Una clase debe tener una y solo una única causa por la cual puede ser
modificada.
Cada clase debe ser responsable de realizar una actividad del sistema
Lo que trata de decirnos este principio es que debemos huir de aquellas clases
monolíticas que aglutinen varias responsabilidades. Pero, ¿qué es una
responsabilidad? Desde el punto de vista de SRP se podría decir que una
responsabilidad en una clase es una razón para cambiar esa clase. Es decir, si
encontramos que hay más de una razón por la que una clase pueda cambiar
entonces es que esa clase tiene más de una responsabilidad.
Esto significa que las clases que se diseñen y que posteriormente necesiten
cambiar un requisito, dicho cambio no afecte a la clase, se cree una nueva que
extienda de la existente. Las claves para la correcta aplicación de este principio son
la abstracción y el polimorfismo, como hemos podido ver en el ejemplo.
Una solución a este problema es dividir un poco las cosas y crear, por ejemplo, una
interfaz que tenga definida las cuestiones propias de los procesos manuales:
A. Las clases de alto nivel no deberían depender de las clases de bajo nivel. Ambas
deberían depender de las abstracciones. B. Las abstracciones no deberían depender
de los detalles. Los detalles deberían depender de las abstracciones.
DIP dice que si una clase depende de otras clases, ésta relación debería ser de
dependencia de interfaces en lugar de dependencia de implementaciones
concretas. La idea es aislar nuestra clase detrás de un muro de abstracciones de las
que depender. Si los detalles tras las abstracciones cambian nuestra clase se
encuentra a salvo. Esto ayuda a mantener un acoplamiento bajo y hace que nuestro
diseño sea más fácil de cambiar.
Cohesión
Estos 3 principios de diseño de paquetes indican que debe contener cada paquete
para obtener una alta cohesión.
Este principio evoca por una agrupación de clases reutilizables que se puedan
administrar y controlar cuando una nueva versión se genere.
Este principio se basa en que las clases que cambian juntas, pertenecen al mismo
grupo. Un proyecto de desarrollo está subdividido en una extensa red de paquetes
interrelacionados. Es nuestra responsabilidad agrupar todas las clases que creemos
que deben cambiar juntas. El objetivo de este principio es minimizar el impacto de
un cambio para afectar la menor cantidad de paquetes posibles, si existen clases
que tienen un alto acoplamiento estas se deben empaquetar juntas
Acoplamiento
Estos 3 principios de diseño de paquetes hablan acerca de las métricas que evalúan
la estructura de un sistema con la finalidad de conseguir un bajo acoplamiento.
No todos los paquetes deben ser estables. Si todos los paquetes de un sistema
fueran estables no se podrían hacer cambios. En la estructura de paquetes que
diseñemos algunos paquetes deben ser estables y otros inestables. Los paquetes
estables deben mantener partes que no cambian, como el diseño de alto nivel del
sistema (core), y los paquetes inestables deben mantener las partes cambiantes,
como las implementaciones (infraestructura).
Ref: https://code2read.com/2015/04/27/object-oriented-design-csharp-principios-
diseno-paquetes/ https://jummp.wordpress.com/2010/06/26/acoplamiento-
aferente-acoplamiento-eferente-inestabilidad-y-abstraccion-i/
Rigidez
Código difícil de cambiar, incluso para pequeños cambios. Cada modificación
requiere cambios en cascada que pueden llevar largos periodos de tiempo en
aplicarse. Ni el propio desarrollador autor de dicho código tiene ni idea de lo que
sucederá o de lo que tendrá que ser cambiado cuando necesite cambiar cualquier
otro punto. Esto conduce a una reticencia y miedo al cambio y todo junto hace que
el código sea muy difícil de mantener.
Fragilidad
La ruptura del software se produce de manera inesperada con cada cambio. Esto es
un problema relacionado con la rigidez, pero es diferente, ya que, no hay una
secuencia de modificaciones continuas mas allá de una hora. Las funcionalidad
nuevas funcionan pero otra parte está rota. Cada solución son en realidad dos
nuevos problemas.
No portable