SlideShare una empresa de Scribd logo
Refactoring (Code Smells)
Software Architect
Net-Baires
http://germankuber.com.ar/
@germankuber
@NetBaires
¿Que vamos a ver?
Code Smells
Refactorizar
Regla de ORO
Code Smells
Escribir mejor Código
Conclusión
Preguntas
¿Que es
refactorizar?
Es modificar la estructura
interna del software para que
sea más fácil de entender y
más barato de manipular, sin
cambiar su comportamiento
observable.
Refactorizar
Duplicación de código
Exceso de acoplamiento
Soluciones rápidas
Hacks
Deuda técnica
Falta de cohesión
Mantenimiento preventivo
Mejorar nuestros diseños 01
02
03
04
¿Por qué deberíamos
refactorizar ?
Mejorar legibilidad
Encontrar defectos
Aumentar velocidad de
desarrollo
¿Cuando debería
refactorizar?
Principios de refactorización
Mantenlo simple
Hazlo expresivo
Siempre reduce la cantidad de código
Mantén las responsabilidades separadas
Mantén un nivel de abstracción apropiado
Regla de ORO
Deja el código
mejor de lo
que lo
encontraste
Code Smells
https://en.wikipedia.org/wiki/Code_smell
Code Smells
Agrupamiento
The
Bloaters The Object-
Orientation
Abusers
The
Change
Preventers The
Dispensables
The
Couplers
• Código que crece fuera de
control
• Código que se complejiza al ser
leído
• Decisiones que generan que
nuestros sistemas crezcan
The Bloaters
https://sourcemaking.com/refactoring/smells
Métodos largos
• Difíciles de leer
• Difíciles de mantener
• Difíciles de debuguear
Métodos largos
Tratamiento
Componer métodos
Introducir Objetos como parámetros
Remplazar métodos con objetos
Refactorizar métodos largos
Remplazar condicionales con clausulas de guardia
Remplazar lógica con Strategy
Remplazar acumulaciones con Visitor
https://sourcemaking.com/refactoring/smells/large-class
Clases Largas
• Violación del principio de Responsabilidad Única
• Demasiadas variables de instancia
• Demasiados métodos privados
• Baja cohesión
• Muchas líneas de código
Signos y síntomas
Clases Largas
Tratamiento
Extraer
clases
Colocar parte del
comportamiento en
una nueva clase
Extraer
Sub clases
Extraer
Interfaces
Utilizar
patrón State
Identificar
comportamiento
común en clases
padre
Identificar las
operaciones
comunes y
agruparlas en
interfaces
Remplazar grandes If
o Switch, mediante la
implantación del
patrón State
Obsesión de
primitivos
• Usar datos primitivos en
lugar de mejores
abstracciones
• Mas difícil de transmitir
intenciones
Obsesión de primitivos
Tratamiento
• Remplazar Data Value con Objetos
• Remplazar tipos con Clases
• Extraer clases
• Introducir Parameter Object
• Remplazar Listas con Objetos
• Remplazar lógica condicional con State
• Remplazar lógica con Stratety
Explosión de combinaciones
o GetAll
o GetAllByUserId(int userId)
o GetAllByPermissionId(id permissionId)
o GetAllByUserIdAndPermissionsId(int userId, id permissionId)
Ejemplo
• Utilizar interprete
En C# contamos IQueryable/LINQ, los predicados nos ofrecen
una manera limpia de evitar la duplicación
Refactorización
Aplicación incorrecta o
incompleta de los principios
de la programación
orientada a objetos
Object-Orientation
Abusers
https://sourcemaking.com/refactoring/smells
Abuso de la estructura Switch
Tratamiento
Remplazar flags por clases con
comportamiento
Aplica Strategy
Introducir Null Object
Repetición de código
Falta de encapsulamiento
Ausencia de polimorfismo
Extraer métodos
Reemplazar parámetro con métodos
explícitos
Síntomas
Clases alternativas con interfaces diferentes
Evitar
Renombrar Métodos
Parametrizar métodos
https://sourcemaking.com/refactoring/smells/large-class
Métodos que hacen lo mismo deberían tener la
misma interface
Obj1.Add()
Obj2.Inser()
Si necesita cambiar algo en
un lugar de su código,
también debe hacer
muchos cambios en otros
lugares.
Change preventers
https://sourcemaking.com/refactoring/smells
Cambios Divergentes
La clase normalmente debe de ser cambiada
en mas de un lugar
Extraer clases con métodos
Utilizar Strategy
Indicaciones de violación del principio
de Responsabilidad Única
https://sourcemaking.com/refactoring/smells
REFACTORING
Cirugía de escopeta
Pequeños cambios en muchas clases
Crear nuevas clases
Agrupar comportamiento
Difícil de encontrar algo
https://sourcemaking.com/refactoring/smells
REFACTORING
Sencillo de perder TODO
Herencia Paralela
Siempre que creamos una clase, necesitamos
crear subclases de otra clase
Prefijos usuales de estas clases
https://sourcemaking.com/refactoring/smells
• FooService
• FooStrategy
Caso especial de Cirugía de
escopeta
Inconsistencia en niveles de abstracción
Las interfaces deben exponer niveles de
abstracciones consistentes
Funciones
• Internamente deben usar mismo nivel
de abstracción
• Deben hacer llamadas de un solo nivel
de abstracción de profundidad
Caso especial de Cirugía de
escopeta
Lock Unlock
Acelerar
Subir cambio
Complejidad de condicionales
Fácil de detectar
Cyclomatic Complexity
Un dispensable es algo
inútil e innecesario cuya
ausencia haría el código
más limpio, más eficiente y
más fácil de entender.
Dispensables
https://sourcemaking.com/refactoring/smells
Clase perezosa
Toda clase tiene un costo por ser mantenida y
leída
Eliminar clases que no valen este costo
https://sourcemaking.com/refactoring/smells/lazy-class
Destruir herencias
REFACTORING
Clases en línea
Clases de datos
Contienen propiedades y campos. NO hacen
nada mas
Clases permitidas
• ViewModels
• DTOs
Extraer métodos
REFACTORING
Encapsular comportamiento
Eliminar clases
Código duplicado
Viola el principio de DRY
Resulta de hacer copy/paste de otra
clase
Extraer métodos
REFACTORING
Mover métodos
Extraer clases
Template Method https://refactoring.guru/smells/duplicate-code
Código muerto
Código que nunca se usa
Fácilmente detectable por cualquier
herramienta
https://refactoring.guru/smells/duplicate-code
Difícilmente borrado por
alguien
Generalidad especulativa
OH!! algún día podríamos necesitar ….
Dejar/mantener solo lo que usamos AHORA!!
Recordar YAGNI (You Aren't
Gonna Need It)
Comentarios
Generalmente los agregamos con las
mejores intenciones
El mejor comentario es un buen nombre
Consideramos que el código
no puede entenderse sin
comentarios
https://refactoring.guru/smells/comments
Contribuyen al
acoplamiento excesivo
entre las clases o muestran
lo que sucede si el
acoplamiento es
reemplazado por una
delegación excesiva.
Los acopladores
https://sourcemaking.com/refactoring/smells
Característica envidiada
Características que usan getters
Mantener junto todo lo que se usa junto
https://refactoring.guru/smells/duplicate-code
Algunos patrones pueden
romper este principio
• Strategy
• Visitor
Intimidad inapropiada
Clases que conocen mucho unas de otras
Mantener las clases honesta sobre lo que hacen, mediante
interfaces
https://refactoring.guru/smells/duplicate-code
Cuidado con
• Herencia
• Relaciones bidireccionales
REFACTORING
Eliminar asociaciones bidireccionales
Extraer clases
Generar interfaces claras
Ley de Demeter
• Cada unidad debe tener un limitado
conocimiento sobre otras unidades y solo
conocer aquellas unidades estrechamente
relacionadas a la unidad actual.
• Cada unidad debe hablar solo a sus amigos y
no hablar con extraños.
• Solo hablar con sus amigos inmediatos.
Principio del Menor Conocimiento
Ley de Demeter
Principio del Menor Conocimiento
métodos de O
Un método M del objeto O solo puede invocar a métodos de
Parámetros de M
Cualquier objeto creado con el método M
Propiedades y campos de O
Exposición indecente
Las clases poseen métodos públicos que no deberían
serlo
Violan la encapsulación
Intimidad inapropiada de las clases
REFACTORING
Encapsular clases con Factory
Convertir todo en privado, salvo las implementaciones de
interfaces
Cadena de mensajes
Cuando el cliente le pregunta a un
objeto sobre otro objeto
Violación de la Ley de Demeter
https://refactoring.guru/smells/message-chains
Se acopla el cliente a
objetos que ni conoce
Dependencia oculta
Toda clase debería declarar sus dependencias en el constructor
Si algo que una clase necesita para funcionar no es pasado vía constructor
o vía parámetro, es una DEPENDENCIA OCULTA
Remplazar variables por parámetros
REFACTORING
Utilizar Inyección de dependencia
Generalmente consta de
• Instanciaciones (new)
• Llamada a métodos estáticos
Algunos más
Code Smells
Tipo embebido en el nombre
• Evite colocar los nombres de los tipos en las firmas de métodos o
propiedades.
• Es redundante
• Obliga a cambiar el nombre si se le cambia el tipo.
Nombre con poco significado
El nombre del método describe lo que hace el método? Puede otro
desarrollador leer el nombre del método y entender lo que hace? Si no
es así, cambiar el nombre o reescribir el método.
Code Smells
Nombres inconsistentes
• Elegir una terminología normalizada y apegarse a ella para nombrar
los métodos.
• Si nuestra API tiene un Open(), debería tener Close().
Solución Oddball
• Sólo debe haber una manera de resolver el mismo problema.
• Si se encuentra mas de una solución, podría ser un caso de código
duplicado o una mala interpretación del problema.
Código mas limpio
Don't repeat yourself (DRY)
DRY principle
Relación con la normalización de la DB
Copiar y pegar siempre es sinónimo de
problemas de diseño
Generación de Bugs
Problemas de
mantenimiento
Keep it Simple Stupid (KISS)
Evitar complejidad innecesaria
Evitar sobre arquitecturar cualquier solución
Siempre la mejor solución es la
mas simple
You aren't gonna need it(YAGNI)
No invertir tiempo en funcionalidad que no son requeridas
Agregamos complejidad a la aplicación pero sin agregar
valor
Siempre la mejor solución es la
mas simple
Lo que hoy es una solución,
mañana seguramente no lo será
SOLID
Conclusiones
• Solucionar problemas no lo es todo
• Podemos mejorar nuestro código
• Debemos ser responsables a la hora de
escribir código
Reflexión
Always code as if the guy who ends up maintaining your
code will be a violent psychopath who knows where you
live.
Siempre escribe código como si quien tuviera que
mantenerlo fuera un psicópata violento, y supiera donde
vives.
https://groups.google.com/forum/#!msg/comp.lang.c++/rYCO5yn4lXw/oITtSkZOtoUJ
Preguntas ??
Recursos
https://sourcemaking.com/refactoring/smells
https://martinfowler.com/bliki/CodeSmell.html
Clean Code
• Robert C. Martin, ISBN-13: 978-0132350884
http://germankuber.com.ar/code-smells
Gracias!!
Germán Küber

Más contenido relacionado

PDF
Aula 2 - POO: Fundamentos da linguagem Java
PPTX
Coding conventions
PDF
Aula de Introdução - JAVA
DOCX
Code review guidelines
PPTX
Modelo de desarrollo concurrente
PDF
Metodología xp
PPTX
Code review
PPSX
Patrones de diseño(presentación 7)
Aula 2 - POO: Fundamentos da linguagem Java
Coding conventions
Aula de Introdução - JAVA
Code review guidelines
Modelo de desarrollo concurrente
Metodología xp
Code review
Patrones de diseño(presentación 7)

La actualidad más candente (20)

PDF
tipos de pruebas.
PDF
Patrones de diseño
PPT
Pruebas de usabilidad
PPTX
UML - Analisis de Sistemas
PPTX
PPTX
Java Rmi
DOCX
Cuestionario uml y objetos zuli
PPTX
Padrões de Projeto - Observer e Strategy
PDF
Qualidade de Software: Teste de software
PPT
Java modulo 01 - Introdução
PDF
Workshop Prototipação em ux - Como validar uma ideia sem construir o produto
PPTX
Code Review
PPSX
Coding standard
PPTX
INF-162 GRUPO 6 MODELOS DE PROCESO DE SOFTWARE
PPSX
Presentacion Patrones Creacionales
PDF
Aula 2 - Modelos de processos
PPTX
Let us understand design pattern
PDF
Wireframes para sites e dispositivos móveis
PDF
Arquitetura orientada a serviços (SOA)
PDF
POO - 22 - Tratamento de Exceções em Java
tipos de pruebas.
Patrones de diseño
Pruebas de usabilidad
UML - Analisis de Sistemas
Java Rmi
Cuestionario uml y objetos zuli
Padrões de Projeto - Observer e Strategy
Qualidade de Software: Teste de software
Java modulo 01 - Introdução
Workshop Prototipação em ux - Como validar uma ideia sem construir o produto
Code Review
Coding standard
INF-162 GRUPO 6 MODELOS DE PROCESO DE SOFTWARE
Presentacion Patrones Creacionales
Aula 2 - Modelos de processos
Let us understand design pattern
Wireframes para sites e dispositivos móveis
Arquitetura orientada a serviços (SOA)
POO - 22 - Tratamento de Exceções em Java
Publicidad

Similar a Refactoring code smelss (20)

PPTX
Cuida tu código: Clean Code
PPT
Volviendo a poner el “soft” en software
PDF
¿A qué huele tu código? Afinando nuestro olfato
PPTX
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
PDF
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
PPTX
Clean code cap 12 -emergence
ODP
Taller SOLID Refactor
PPT
Encadenamiento de refactorings para generar cambios Agiles de Diseño
PPTX
Buenas practicas desarrollando software
PPTX
PDF
Working effectively with legacy code
PDF
Programacion java
PPTX
Net-Baires: CleanCode 20190622
PDF
Patrones de Diseño de Software
PDF
Seminario SOLID-TDD
PPTX
Introducción al Clean Code usando php ppt
PPTX
Guía de buenas prácticas para desarrolladores web
PPT
patronesdiseño2009.ppt
PDF
Apuntes #XPweek
Cuida tu código: Clean Code
Volviendo a poner el “soft” en software
¿A qué huele tu código? Afinando nuestro olfato
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
Clean code cap 12 -emergence
Taller SOLID Refactor
Encadenamiento de refactorings para generar cambios Agiles de Diseño
Buenas practicas desarrollando software
Working effectively with legacy code
Programacion java
Net-Baires: CleanCode 20190622
Patrones de Diseño de Software
Seminario SOLID-TDD
Introducción al Clean Code usando php ppt
Guía de buenas prácticas para desarrolladores web
patronesdiseño2009.ppt
Apuntes #XPweek
Publicidad

Más de Germán Küber (20)

PPTX
Explorando el Diseño de la Memoria en Rust
PPTX
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
PPTX
Mev Rapido.pptx
PPTX
Que son los smart contracts.pptx
PPTX
De 0 a blockchain developer en 3 meses
PPTX
Patrones funcionales
PPTX
Patrones de diseño en solidity
PPTX
Vertical slice architecture
PPTX
De 0 a blockchain developer en 3 meses
PPTX
Diamon pattern presentation
PPTX
Patrones funcionales
PPTX
Defensive code
PPTX
Programación Funcional C#
PPTX
Unit testing consejos
PPTX
Defensive code C#
PPTX
Event sourcing
PPTX
C sharp 8
PPTX
Arquitectura en aplicaciones Angular y buenas practicas.
PPTX
Un mundo sin if. generics al rescate
PPTX
Azure 360º para Desarrolaldores
Explorando el Diseño de la Memoria en Rust
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
Mev Rapido.pptx
Que son los smart contracts.pptx
De 0 a blockchain developer en 3 meses
Patrones funcionales
Patrones de diseño en solidity
Vertical slice architecture
De 0 a blockchain developer en 3 meses
Diamon pattern presentation
Patrones funcionales
Defensive code
Programación Funcional C#
Unit testing consejos
Defensive code C#
Event sourcing
C sharp 8
Arquitectura en aplicaciones Angular y buenas practicas.
Un mundo sin if. generics al rescate
Azure 360º para Desarrolaldores

Último (20)

PDF
Estrategia de apoyo tecnología grado 9-3
PPT
Que son las redes de computadores y sus partes
PDF
SAP Transportation Management para LSP, TM140 Col18
PPTX
Propuesta BKP servidores con Acronis1.pptx
PDF
Estrategia de apoyo tecnología miguel angel solis
PDF
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
PDF
Plantilla para Diseño de Narrativas Transmedia.pdf
PDF
Maste clas de estructura metálica y arquitectura
PDF
Calidad desde el Docente y la mejora continua .pdf
PDF
Influencia-del-uso-de-redes-sociales.pdf
PPTX
historia_web de la creacion de un navegador_presentacion.pptx
PPTX
COMO AYUDAN LAS TIC EN LA EDUCACION SUPERIOR.pptx
PDF
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
PDF
5.1 Pinch y Bijker en libro Actos, actores y artefactos de Bunch Thomas (coor...
PPTX
Presentación de Redes de Datos modelo osi
PDF
Diapositiva proyecto de vida, materia catedra
PDF
MANUAL TECNOLOGÍA SER MINISTERIO EDUCACIÓN
PPTX
REDES INFORMATICAS REDES INFORMATICAS.pptx
PPT
El-Gobierno-Electrónico-En-El-Estado-Bolivia
PPTX
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...
Estrategia de apoyo tecnología grado 9-3
Que son las redes de computadores y sus partes
SAP Transportation Management para LSP, TM140 Col18
Propuesta BKP servidores con Acronis1.pptx
Estrategia de apoyo tecnología miguel angel solis
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
Plantilla para Diseño de Narrativas Transmedia.pdf
Maste clas de estructura metálica y arquitectura
Calidad desde el Docente y la mejora continua .pdf
Influencia-del-uso-de-redes-sociales.pdf
historia_web de la creacion de un navegador_presentacion.pptx
COMO AYUDAN LAS TIC EN LA EDUCACION SUPERIOR.pptx
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
5.1 Pinch y Bijker en libro Actos, actores y artefactos de Bunch Thomas (coor...
Presentación de Redes de Datos modelo osi
Diapositiva proyecto de vida, materia catedra
MANUAL TECNOLOGÍA SER MINISTERIO EDUCACIÓN
REDES INFORMATICAS REDES INFORMATICAS.pptx
El-Gobierno-Electrónico-En-El-Estado-Bolivia
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...

Refactoring code smelss

  • 1. Refactoring (Code Smells) Software Architect Net-Baires http://germankuber.com.ar/ @germankuber @NetBaires
  • 2. ¿Que vamos a ver? Code Smells Refactorizar Regla de ORO Code Smells Escribir mejor Código Conclusión Preguntas
  • 3. ¿Que es refactorizar? Es modificar la estructura interna del software para que sea más fácil de entender y más barato de manipular, sin cambiar su comportamiento observable.
  • 4. Refactorizar Duplicación de código Exceso de acoplamiento Soluciones rápidas Hacks Deuda técnica Falta de cohesión Mantenimiento preventivo
  • 5. Mejorar nuestros diseños 01 02 03 04 ¿Por qué deberíamos refactorizar ? Mejorar legibilidad Encontrar defectos Aumentar velocidad de desarrollo
  • 7. Principios de refactorización Mantenlo simple Hazlo expresivo Siempre reduce la cantidad de código Mantén las responsabilidades separadas Mantén un nivel de abstracción apropiado
  • 8. Regla de ORO Deja el código mejor de lo que lo encontraste
  • 10. Code Smells Agrupamiento The Bloaters The Object- Orientation Abusers The Change Preventers The Dispensables The Couplers
  • 11. • Código que crece fuera de control • Código que se complejiza al ser leído • Decisiones que generan que nuestros sistemas crezcan The Bloaters https://sourcemaking.com/refactoring/smells
  • 12. Métodos largos • Difíciles de leer • Difíciles de mantener • Difíciles de debuguear
  • 13. Métodos largos Tratamiento Componer métodos Introducir Objetos como parámetros Remplazar métodos con objetos Refactorizar métodos largos Remplazar condicionales con clausulas de guardia Remplazar lógica con Strategy Remplazar acumulaciones con Visitor https://sourcemaking.com/refactoring/smells/large-class
  • 14. Clases Largas • Violación del principio de Responsabilidad Única • Demasiadas variables de instancia • Demasiados métodos privados • Baja cohesión • Muchas líneas de código Signos y síntomas
  • 15. Clases Largas Tratamiento Extraer clases Colocar parte del comportamiento en una nueva clase Extraer Sub clases Extraer Interfaces Utilizar patrón State Identificar comportamiento común en clases padre Identificar las operaciones comunes y agruparlas en interfaces Remplazar grandes If o Switch, mediante la implantación del patrón State
  • 16. Obsesión de primitivos • Usar datos primitivos en lugar de mejores abstracciones • Mas difícil de transmitir intenciones
  • 17. Obsesión de primitivos Tratamiento • Remplazar Data Value con Objetos • Remplazar tipos con Clases • Extraer clases • Introducir Parameter Object • Remplazar Listas con Objetos • Remplazar lógica condicional con State • Remplazar lógica con Stratety
  • 18. Explosión de combinaciones o GetAll o GetAllByUserId(int userId) o GetAllByPermissionId(id permissionId) o GetAllByUserIdAndPermissionsId(int userId, id permissionId) Ejemplo • Utilizar interprete En C# contamos IQueryable/LINQ, los predicados nos ofrecen una manera limpia de evitar la duplicación Refactorización
  • 19. Aplicación incorrecta o incompleta de los principios de la programación orientada a objetos Object-Orientation Abusers https://sourcemaking.com/refactoring/smells
  • 20. Abuso de la estructura Switch Tratamiento Remplazar flags por clases con comportamiento Aplica Strategy Introducir Null Object Repetición de código Falta de encapsulamiento Ausencia de polimorfismo Extraer métodos Reemplazar parámetro con métodos explícitos Síntomas
  • 21. Clases alternativas con interfaces diferentes Evitar Renombrar Métodos Parametrizar métodos https://sourcemaking.com/refactoring/smells/large-class Métodos que hacen lo mismo deberían tener la misma interface Obj1.Add() Obj2.Inser()
  • 22. Si necesita cambiar algo en un lugar de su código, también debe hacer muchos cambios en otros lugares. Change preventers https://sourcemaking.com/refactoring/smells
  • 23. Cambios Divergentes La clase normalmente debe de ser cambiada en mas de un lugar Extraer clases con métodos Utilizar Strategy Indicaciones de violación del principio de Responsabilidad Única https://sourcemaking.com/refactoring/smells REFACTORING
  • 24. Cirugía de escopeta Pequeños cambios en muchas clases Crear nuevas clases Agrupar comportamiento Difícil de encontrar algo https://sourcemaking.com/refactoring/smells REFACTORING Sencillo de perder TODO
  • 25. Herencia Paralela Siempre que creamos una clase, necesitamos crear subclases de otra clase Prefijos usuales de estas clases https://sourcemaking.com/refactoring/smells • FooService • FooStrategy Caso especial de Cirugía de escopeta
  • 26. Inconsistencia en niveles de abstracción Las interfaces deben exponer niveles de abstracciones consistentes Funciones • Internamente deben usar mismo nivel de abstracción • Deben hacer llamadas de un solo nivel de abstracción de profundidad Caso especial de Cirugía de escopeta Lock Unlock Acelerar Subir cambio
  • 27. Complejidad de condicionales Fácil de detectar Cyclomatic Complexity
  • 28. Un dispensable es algo inútil e innecesario cuya ausencia haría el código más limpio, más eficiente y más fácil de entender. Dispensables https://sourcemaking.com/refactoring/smells
  • 29. Clase perezosa Toda clase tiene un costo por ser mantenida y leída Eliminar clases que no valen este costo https://sourcemaking.com/refactoring/smells/lazy-class Destruir herencias REFACTORING Clases en línea
  • 30. Clases de datos Contienen propiedades y campos. NO hacen nada mas Clases permitidas • ViewModels • DTOs Extraer métodos REFACTORING Encapsular comportamiento Eliminar clases
  • 31. Código duplicado Viola el principio de DRY Resulta de hacer copy/paste de otra clase Extraer métodos REFACTORING Mover métodos Extraer clases Template Method https://refactoring.guru/smells/duplicate-code
  • 32. Código muerto Código que nunca se usa Fácilmente detectable por cualquier herramienta https://refactoring.guru/smells/duplicate-code Difícilmente borrado por alguien
  • 33. Generalidad especulativa OH!! algún día podríamos necesitar …. Dejar/mantener solo lo que usamos AHORA!! Recordar YAGNI (You Aren't Gonna Need It)
  • 34. Comentarios Generalmente los agregamos con las mejores intenciones El mejor comentario es un buen nombre Consideramos que el código no puede entenderse sin comentarios https://refactoring.guru/smells/comments
  • 35. Contribuyen al acoplamiento excesivo entre las clases o muestran lo que sucede si el acoplamiento es reemplazado por una delegación excesiva. Los acopladores https://sourcemaking.com/refactoring/smells
  • 36. Característica envidiada Características que usan getters Mantener junto todo lo que se usa junto https://refactoring.guru/smells/duplicate-code Algunos patrones pueden romper este principio • Strategy • Visitor
  • 37. Intimidad inapropiada Clases que conocen mucho unas de otras Mantener las clases honesta sobre lo que hacen, mediante interfaces https://refactoring.guru/smells/duplicate-code Cuidado con • Herencia • Relaciones bidireccionales REFACTORING Eliminar asociaciones bidireccionales Extraer clases Generar interfaces claras
  • 38. Ley de Demeter • Cada unidad debe tener un limitado conocimiento sobre otras unidades y solo conocer aquellas unidades estrechamente relacionadas a la unidad actual. • Cada unidad debe hablar solo a sus amigos y no hablar con extraños. • Solo hablar con sus amigos inmediatos. Principio del Menor Conocimiento
  • 39. Ley de Demeter Principio del Menor Conocimiento métodos de O Un método M del objeto O solo puede invocar a métodos de Parámetros de M Cualquier objeto creado con el método M Propiedades y campos de O
  • 40. Exposición indecente Las clases poseen métodos públicos que no deberían serlo Violan la encapsulación Intimidad inapropiada de las clases REFACTORING Encapsular clases con Factory Convertir todo en privado, salvo las implementaciones de interfaces
  • 41. Cadena de mensajes Cuando el cliente le pregunta a un objeto sobre otro objeto Violación de la Ley de Demeter https://refactoring.guru/smells/message-chains Se acopla el cliente a objetos que ni conoce
  • 42. Dependencia oculta Toda clase debería declarar sus dependencias en el constructor Si algo que una clase necesita para funcionar no es pasado vía constructor o vía parámetro, es una DEPENDENCIA OCULTA Remplazar variables por parámetros REFACTORING Utilizar Inyección de dependencia Generalmente consta de • Instanciaciones (new) • Llamada a métodos estáticos
  • 44. Code Smells Tipo embebido en el nombre • Evite colocar los nombres de los tipos en las firmas de métodos o propiedades. • Es redundante • Obliga a cambiar el nombre si se le cambia el tipo. Nombre con poco significado El nombre del método describe lo que hace el método? Puede otro desarrollador leer el nombre del método y entender lo que hace? Si no es así, cambiar el nombre o reescribir el método.
  • 45. Code Smells Nombres inconsistentes • Elegir una terminología normalizada y apegarse a ella para nombrar los métodos. • Si nuestra API tiene un Open(), debería tener Close(). Solución Oddball • Sólo debe haber una manera de resolver el mismo problema. • Si se encuentra mas de una solución, podría ser un caso de código duplicado o una mala interpretación del problema.
  • 47. Don't repeat yourself (DRY) DRY principle Relación con la normalización de la DB Copiar y pegar siempre es sinónimo de problemas de diseño Generación de Bugs Problemas de mantenimiento
  • 48. Keep it Simple Stupid (KISS) Evitar complejidad innecesaria Evitar sobre arquitecturar cualquier solución Siempre la mejor solución es la mas simple
  • 49. You aren't gonna need it(YAGNI) No invertir tiempo en funcionalidad que no son requeridas Agregamos complejidad a la aplicación pero sin agregar valor Siempre la mejor solución es la mas simple Lo que hoy es una solución, mañana seguramente no lo será
  • 50. SOLID
  • 51. Conclusiones • Solucionar problemas no lo es todo • Podemos mejorar nuestro código • Debemos ser responsables a la hora de escribir código
  • 52. Reflexión Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. Siempre escribe código como si quien tuviera que mantenerlo fuera un psicópata violento, y supiera donde vives. https://groups.google.com/forum/#!msg/comp.lang.c++/rYCO5yn4lXw/oITtSkZOtoUJ

Notas del editor

  • #10: El termino aumento su popularidad luego de la aparición del libro : Refactoring: Improving the Design of Existing Code de Martin Fowler
  • #34: You Aren't Gonna Need It == NO vas a necesitarlo
  • #35: You Aren't Gonna Need It == NO vas a necesitarlo