Apuntes Calidad
Apuntes Calidad
Apuntes Calidad
El modelo tiene una arquitectura por etapas para la mejora del proceso de testing.
A principios de los 80 Lehman formuló las que se conocen como leyes de la evolución del
software, que escribió desde su observación de la evolución del OS/360 (desde el que
curiosamente Brooks también desarrollo sus trabajos sobre gestión de proyectos).
Tres tipos:
Cambio Continuo. Un programa tipo E que se usa debe ser continuamente adaptado, si no,
progresivamente, será menos satisfactorio.
Calidad decreciente. Se percibirá que un programa de tipo E pierde calidad a menos que se
mantenga de manera rigurosa y se adapte al entorno operacional.
Sistema de realimentación. El proceso de programación de un programa tipo E constituye un
sistema de realimentación multinivel (no es estático) y debe ser tratado como tal para tener
éxito en su modificación o mejora.
Esto sería un desarrollo lineal, en una única línea del control de versiones. Todos los
desarrolladores van subiendo las tareas que han terminado a la misma línea del control de
versiones.
Uno de los principales problemas que tiene este enfoque, es que los errores se propagan más
fácilmente. Además, por este motivo, puede que los desarrolladores no suban su código al
control de versiones muy a menudo, hasta que no sea estable, por temor a introducir errores y
que se propaguen a los otros desarrolladores. Con ello, incumplimos la recomendación de que
todo el código esté en el control de versiones e integrar frecuentemente.
Un enfoque para la integración continua aquí podría ser que cuando un desarrollador intente
subir su código a esta única línea principal, el servidor de integración continua intente
compilar su código con el que ya hay en la línea principal y ejecutar los tests. Si todo es un
éxito, el código se subirá correctamente al control de versiones, y si no, el desarrollador tendrá
que solucionar los errores.
¿Qué pasa con este enfoque? Además de los problemas mencionados antes, ¿dónde se queda
el código mientras que el servidor de integración continua está compilándolo y pasando los
tests? Hasta que el servidor no termina, no se sube al control de versiones, por lo que puede
que pasemos un tiempo sin hacer nada hasta recibir si todo ha sido un éxito o no.
Por ello, un enfoque que podría funcionar mejor es…
Podemos cambiar el desarrollo lineal por un enfoque de una historia de usuario o tarea por
rama, es decir, creamos una rama cada vez que vamos a desarrollar una tarea, una historia de
usuario o solucionar un error.
Cuando terminemos de implementar dicha tarea, el código esté probado y sea estable,
procederemos a integrarlo en la rama principal o línea de desarrollo principal.
Estas ramas tienen que tener nombres descriptivos, como por ejemplo el nombre de la tarea,
historia de usuario o el id del bug. Así mejoramos la trazabilidad del código, y se establece
claramente qué propósito tiene cada rama.
Pero también tiene más ventajas:
En este enfoque, una alternativa es que el servidor de integración continua sea el que cuando
terminemos una tarea o historia de usuario, combine la rama de esa tarea con la rama
principal, y compruebe que pasan los tests.
Complejidad ciclomática
Fue en 1976 cuando Thomas McCabe publicó un artículo en el que argumentaba como la
complejidad del código puede obtenerse desde su flujo de control.
Se basa en calcular el número de rutas linealmente independientes del código (se mide en los
algoritmos, por ello es aplicable a orientación a objetos, Php, PLs, etc., cualquier cosa con
algoritmo).
Principios SOLID
Te contamos brevemente sobre S.O.L.I.D, es un acrónimo creado por Tío Bob (Robert C. Martin)
bajo el que se engloban cuatro principios que todo Diseño Orientado a Objetos debería seguir.
– OCP (“The Open Closed Principle ”- Principio de Abierto-Cerrado). “Deberías ser capaz de
extender el comportamiento de una clase, sin modificarla.”
– LSP (“The Liskov Substitution Principle” – Principio de sustitución de Liskov). “Las clases
derivadas deben poder sustituirse por sus clases base”
CODE SMELLS
1. Comentarios
Exceso de comentarios
Comentarios excesivos que explican cosas obvias o que no son útiles, lo que puede dificultar la
Poner en comentarios información sobre el sistema o sobre usuarios. Los comentarios deben
Código comentado
2. Nombres misteriosos
Una de las partes más importantes de un código claro son los buenos nombres, así que
pensamos mucho en nombrar funciones, módulos, variables, clases, para que comuniquen
claramente lo que hacen y cómo usarlos.
3. Código duplicado
Tener la misma estructura de código en más de un sitio. Duplicación significa que cada vez que
leas estas copias, tienes que leerlas cuidadosamente para ver si hay alguna diferencia. Si
necesitas cambiar el código duplicado, tienes que encontrar y cambiar cada duplicación.
4. Funciones largas
Los programas que tienen una vida mejor y durante más tiempo son los que tienen funciones
cortas. Este tipo de código a menudo da la sensación de que no se realiza ningún cálculo, de
que el programa es una secuencia interminable de delegaciones.
Las largas listas de parámetros suelen ser confusas por sí mismas. Las clases son una buena
forma de reducir el tamaño de las listas de parámetros. Son especialmente útiles cuando
varias funciones comparten varios valores de parámetros.
6. Datos globales
La forma más obvia de datos globales son las variables globales, pero también vemos este
problema con variables de clase y de patrones singletons.
Uso excesivo de condicionales, como if-else, que pueden hacer que el código sea difícil de leer
y entender.
9. Dependencias circulares
Se pueden dar situaciones en las que dos o más clases dependen mutuamente, lo que puede
hacer que el código sea difícil de mantener.
Nombres de clases o métodos que no describen claramente lo que hacen o que son confusos.
Cuando dos o más partes del código están estrechamente relacionadas, lo que hace que sea
difícil modificar una sin afectar la otras.
CODE SMELLS 2
1. Cohesión débil
La Cohesión débil se refiere a una clase o módulo que tiene muchas responsabilidades o
funcionalidades que no están relacionadas entre sí.
2. Efecto secundario
El Efecto secundario se refiere a una función o método que modifica variables o estados fuera
de su alcance local, es decir, variables que están fuera del ámbito de la función o método.
3. Speculative generality
Cuando una clase o método tiene varias responsabilidades diferentes, lo que hace que sea
difícil de entender y mantener.
5. Lazy class
Lazy class ocurre cuando una clase no hace lo suficiente y tiene poco valor en el sistema. En
otras palabras, la clase no tiene una responsabilidad clara y no realiza tareas significativas.
6. Shotgun surgery
El shotgun surgery es un code smell que ocurre cuando un cambio en un requisito o una
funcionalidad afecta a múltiples partes del código.
7. Feature envy
El Feature envy es un code smell que ocurre cuando un método o función accede
repetidamente a los datos o métodos de otra clase en lugar de usar los de su propia clase.
8. Data clumps
Data Clumps es un code smell que se produce cuando se encuentran grupos de datos
relacionados que aparecen repetidamente en todo el código.
9. Middle Man
El Middle man es un code smell que se produce cuando una clase o método actúa como un
intermediario entre otras clases o métodos sin agregar ningún valor adicional.
Divergent change ocurre cuando un cambio en una clase o módulo requiere muchos cambios
Clean Architecture
- Independencia de frameworks: la arquitectura debe ser independiente de cualquier
framework o tecnología específica. De esta manera, se evita que el código dependa de
tecnologías que puedan cambiar en el futuro.
- Separación de capas: la arquitectura debe estar dividida en capas lógicas, donde cada
capa tiene una responsabilidad específica y comunica con capas adyacentes a través de
interfaces bien definidas.
- Modularidad: la arquitectura debe ser modular, lo que significa que los componentes
del sistema deben ser independientes y reutilizables en diferentes partes del sistema.
- Mantenibilidad: la arquitectura debe estar diseñada para facilitar el mantenimiento
del código a largo plazo.