SlideShare una empresa de Scribd logo
1 de 26
Encadenamiento de 
Refactorings 
Hernán Wilkinson 
agile software development & services 
www.10pines.com 
Twitter: @HernanWilkinson 
Blog: objectmodels.blogspot.com 
www.10pines.com
Mantenimiento
Hacer TDD en código existente 
 Problemas 
Tengo que arreglar un error … 
… pero no puedo modificar código sin 
escribir un test primero… 
… pero no puedo escribir el test porque hay 
muchas dependencias que me lo impoden… 
… y debo romper esas dependencias para 
poder tester … 
… pero no puedo modificar código sin 
escribir un test primero… 
…
Hacer TDD en código existente 
 Problemas 
Tengo que agregar funcionalidad … 
… pero no puedo modificar código sin 
escribir un test primero… 
… pero no puedo escribir el test porque el 
código es muy complicado, no lo entiendo… 
… y debo modificarlo para entenderlo … 
… pero no puedo modificar código sin 
escribir un test primero… 
…
Hacer TDD en código existente 
 Problema: Mal diseño 
Código no entendible (malos nombres, 
mala distribución de responsabilidades, 
poca cohesión, etc). 
Mucho acoplamiento (referencia a recursos 
externos, mala descomposición funcional, 
etc) 
 Solución 
Refactoring, objetos simuladores, romper 
dependencias
Ejemplo 
 Customer Import 
El sistema importa desde archivo clientes y 
sus direcciones. 
Formato de archivo: 
C,Pepe,Sanchez,D,22333444 
A,San Martin,3322,Olivos,1636,BsAs 
A,Maipu,888,Florida,1122,Buenos Aires 
C,Juan,Perez,C,23-25666777-9 
A,Alem,1122,CABA,1001,CABA 
Clientes 
Direcciones 
del Cliente
Ejemplo 
 Customer Import 
Hay un main que prueba que funciona! 
Pero… ¿Funciona bien?
Refactorings 
 Rename 
Renombra el elemento seleccionado y 
todas las referencias 
 Extract method 
Crea un nuevo método con el código 
seleccionado y lo reemplaza por un envío 
de mensaje a ese método 
Algunas herramientas reemplazan todas las 
repeticiones de la selección
Refactorings 
 Move method 
Mueve el método seleccionado a una clase 
que debe estar visible desde el contexto en 
que se mueve. Modifica todas las 
referencias al método movido 
 Convert local to field - Introduce 
Field 
Convierte una variable local en variable de 
instancia 
Puede mover la inicialización de la variable
Refactorings 
 Extract to Local - Introduce Variable 
Extrae el código seleccionado en una 
variable local inicializada con dicho código 
 Introduce parameter 
Reemplaza el código seleccionado con una 
referencia a un parámetro, modifica todos 
los senders agregando dicho parámetro 
que será el código reemplazado
Refactorings 
 Change Method signature - Change 
Signature 
Permite modificar los elementos que 
definen un método como tipo de retorno, 
parametros, etc. 
Modifica todos los senders para quedar de 
acuerdo a la nueva definición 
Cuando se agregan parámetros se puede 
indicar con qué código usado en los 
senders
Refactorings 
 Generalize Declared Type - Use base 
type where possible 
Permite reemplazar el tipo de una variable 
por algún supertipo
Refactorings 
 Inline 
Copia el código representado por el método 
o variable a los lugares donde ser 
referencia dicho método o variable 
 Extract to Local + Extract Method + 
Inline 
Se los suele utilizar para extraer código 
que se encuentra separado
Refactorings 
 Encapsulate Field 
Referencias a variables de instancia se 
reemplazan por getter y setters 
 Encapsulate Field + Move 
Permite mover variables de instancia a 
otras clases
Refactorings 
 Extract Interface 
Permite crear una interface a partir de 
parte del protocolo definido en una clase 
 Extract Interface + Generalize Declared 
Type 
Sirve para crear jerarquías polimórficas
Refactorings 
 Extract Parameter Object - Extract 
Class from Parameters 
Permite crear una abstracción nueva a 
partir de un conjunto de parámetros de un 
método 
Reemplaza todos los senders por la 
instanciación de la nueva abstracción
Refactorings 
 Extract Parameter Object + Move 
Permite crear nuevas abstracciones a partir 
de código existente 
 Extract Parameter Object + Generalize 
Declared Type 
Permite usar la misma abstracción 
extrayéndola de métodos distintos
Refactorings 
 Extract Superclass 
Idem Extract Interface pero con clase 
 Extract Class 
Permite encapsular variables de instancia 
en una clase
Refactorings 
 Pull Up 
Mueve variables de instancia y/o métodos 
a la superclase o declara el método como 
abstracto en la superclase 
 Push Down 
Mueve un conjunto de variables de 
instancia y/o métodos a las subclases
Conclusiones
Recordar 
 Lo más importante: Feedback 
inmediato para poder reflexionar 
 No preocuparme por nombres de tests al 
principio 
 No preocuparme por organización de los 
tests al principio 
 Recordar que es iterativo incremental
Recordar 
 Usar la computadora como 
soporte/medio de aprendizaje 
 No correr el sistema en nuestra cabeza! 
 Hacerle caso a nuestro instinto 
 El código nos habla 
 No ser derrotista 
 Es test no es el fin, es un medio 
 Un programador no es buen 
programador si no es buen tester
Recordar 
 TDD ayuda a generar diseños menos 
acoplados 
 TDD NO IMPLICA BUEN DISEÑO!! 
 TDD nos da confianza para realizar 
cambios cuando el modelo así lo 
requiera 
 Debido al punto anterior, el sistema no 
se convierte en Legacy
Bibliografía y referencias
Bibliografía recomendada 
Test Driven 
Development By 
Example. 
Kent Beck, 2002. 
xUnit Test Patterns: 
Refactoring Test Code 
Gerard Meszaros, 2007. 
Working Effectively with 
Legacy Code 
Michael Feacthers
Bibliografía adicional 
▶ S. Freeman, N. Pryce – Growing Object Oriented Software 
with Tests, 2009 
▶ K.Beck, M.Fowler – Planning Extreme Programming. 2000 
▶ L.Crispin, J.Gregory - Agile Testing: A Practical Guide for 
Testers and Agile Teams. 2009 
▶ L.Koskela - Test Driven: TDD and Acceptance TDD for Java 
Developers. 2007 
▶ T.Mackinnon, S.Freeman, P.Crai - Endo-Testing: Unit 
Testing with Mock Objects. 2000 
http://www.mockobjects.com/files/endotesting.pdf 
▶ M.Fowler - Mocks Aren't Stubs. 
http://martinfowler.com/articles/mocksArentStubs.html

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

Desarrollo Guiado Por Pruebas
Desarrollo Guiado Por PruebasDesarrollo Guiado Por Pruebas
Desarrollo Guiado Por Pruebas
 
TDD Course (Spanish)
TDD Course (Spanish)TDD Course (Spanish)
TDD Course (Spanish)
 
Introducción a TDD
Introducción a TDDIntroducción a TDD
Introducción a TDD
 
Pruebas Unitarias
Pruebas UnitariasPruebas Unitarias
Pruebas Unitarias
 
Stop the agile micro-management
Stop the agile micro-managementStop the agile micro-management
Stop the agile micro-management
 
No debuggearás - Introducción al Unit Testing y TDD
No debuggearás - Introducción al Unit Testing y TDDNo debuggearás - Introducción al Unit Testing y TDD
No debuggearás - Introducción al Unit Testing y TDD
 
Conceptos básicos de Unit Test
Conceptos básicos de Unit Test Conceptos básicos de Unit Test
Conceptos básicos de Unit Test
 
TDD (Test-Driven Development)
TDD (Test-Driven Development)TDD (Test-Driven Development)
TDD (Test-Driven Development)
 
Taller SOLID Refactor
Taller SOLID RefactorTaller SOLID Refactor
Taller SOLID Refactor
 
Test driven development
Test driven developmentTest driven development
Test driven development
 
Pruebas Unitarias
Pruebas Unitarias Pruebas Unitarias
Pruebas Unitarias
 
ATDD - Desarrollo Dirigido por Test de Aceptación
ATDD - Desarrollo Dirigido por Test de AceptaciónATDD - Desarrollo Dirigido por Test de Aceptación
ATDD - Desarrollo Dirigido por Test de Aceptación
 
Charla evento TestingUY 2017 - Automatización en gran escala
Charla evento TestingUY 2017 - Automatización en gran escalaCharla evento TestingUY 2017 - Automatización en gran escala
Charla evento TestingUY 2017 - Automatización en gran escala
 
Charla evento TestingUY 2017 - El mokeo como herramienta para pruebas de Soft...
Charla evento TestingUY 2017 - El mokeo como herramienta para pruebas de Soft...Charla evento TestingUY 2017 - El mokeo como herramienta para pruebas de Soft...
Charla evento TestingUY 2017 - El mokeo como herramienta para pruebas de Soft...
 
Plantilla implementacion proyecto final
Plantilla implementacion  proyecto finalPlantilla implementacion  proyecto final
Plantilla implementacion proyecto final
 
Fases de dasorrollo de un software Mapa Conceptual
Fases de dasorrollo de un software Mapa ConceptualFases de dasorrollo de un software Mapa Conceptual
Fases de dasorrollo de un software Mapa Conceptual
 
Unit Testing en iOS
Unit Testing en iOSUnit Testing en iOS
Unit Testing en iOS
 
Lima agile day tdd con visual studio 2010
Lima agile day   tdd con visual studio 2010Lima agile day   tdd con visual studio 2010
Lima agile day tdd con visual studio 2010
 
Taller evento TestingUY 2015 - Gestión de Casos de Prueba con TESTLINK
Taller evento TestingUY 2015 - Gestión de Casos de Prueba con TESTLINKTaller evento TestingUY 2015 - Gestión de Casos de Prueba con TESTLINK
Taller evento TestingUY 2015 - Gestión de Casos de Prueba con TESTLINK
 
Refactoring: improving the desing of existing code Cap 1
Refactoring: improving the desing of existing code Cap 1Refactoring: improving the desing of existing code Cap 1
Refactoring: improving the desing of existing code Cap 1
 

Destacado

Refactoring a Company - 2nd Presentation
Refactoring a Company - 2nd PresentationRefactoring a Company - 2nd Presentation
Refactoring a Company - 2nd Presentation
Hernan Wilkinson
 
The ten commandments of TDD
The ten commandments of TDDThe ten commandments of TDD
The ten commandments of TDD
Hernan Wilkinson
 
Técnicas y herramientas para que la computadora haga más y el programador m...
Técnicas y herramientas para que la computadora haga más y el programador m...Técnicas y herramientas para que la computadora haga más y el programador m...
Técnicas y herramientas para que la computadora haga más y el programador m...
Hernan Wilkinson
 
Introducción a Agile y Scrum
Introducción a Agile y ScrumIntroducción a Agile y Scrum
Introducción a Agile y Scrum
Johnny Ordóñez
 

Destacado (20)

Refactoring a Company - 2nd Presentation
Refactoring a Company - 2nd PresentationRefactoring a Company - 2nd Presentation
Refactoring a Company - 2nd Presentation
 
Tdd con Angular y jasmine
Tdd con Angular y jasmineTdd con Angular y jasmine
Tdd con Angular y jasmine
 
Cómo Java afecta nuestros Diseños
Cómo Java afecta nuestros DiseñosCómo Java afecta nuestros Diseños
Cómo Java afecta nuestros Diseños
 
Arithmetic with measures on dynamically typed object oriented languages
Arithmetic with measures on dynamically typed object oriented languagesArithmetic with measures on dynamically typed object oriented languages
Arithmetic with measures on dynamically typed object oriented languages
 
Confianza+Participación+Transparencia= Refactorizando la empresa
Confianza+Participación+Transparencia= Refactorizando la empresaConfianza+Participación+Transparencia= Refactorizando la empresa
Confianza+Participación+Transparencia= Refactorizando la empresa
 
The ten commandments of TDD
The ten commandments of TDDThe ten commandments of TDD
The ten commandments of TDD
 
Objects: The Misunderstood Paradigm
Objects: The Misunderstood ParadigmObjects: The Misunderstood Paradigm
Objects: The Misunderstood Paradigm
 
Growing an open participative horizontal and based on trust company
Growing an open participative horizontal and based on trust companyGrowing an open participative horizontal and based on trust company
Growing an open participative horizontal and based on trust company
 
Programming Language Technical debt and their influence in Thinking and Desgin
Programming Language Technical debt and their influence in Thinking and DesginProgramming Language Technical debt and their influence in Thinking and Desgin
Programming Language Technical debt and their influence in Thinking and Desgin
 
A new object oriented model of the gregorian calendar
A new object oriented model of the gregorian calendarA new object oriented model of the gregorian calendar
A new object oriented model of the gregorian calendar
 
Obejct Oriented SCM - OOSCM
Obejct Oriented SCM - OOSCMObejct Oriented SCM - OOSCM
Obejct Oriented SCM - OOSCM
 
Augmenting Smalltalk Syntax
Augmenting Smalltalk SyntaxAugmenting Smalltalk Syntax
Augmenting Smalltalk Syntax
 
Técnicas y herramientas para que la computadora haga más y el programador m...
Técnicas y herramientas para que la computadora haga más y el programador m...Técnicas y herramientas para que la computadora haga más y el programador m...
Técnicas y herramientas para que la computadora haga más y el programador m...
 
Facilitadores asombrosos: logrando mejores conversaciones e interacciones
Facilitadores asombrosos: logrando mejores conversaciones e interaccionesFacilitadores asombrosos: logrando mejores conversaciones e interacciones
Facilitadores asombrosos: logrando mejores conversaciones e interacciones
 
Metaprogramacion
MetaprogramacionMetaprogramacion
Metaprogramacion
 
Desarrollando sistemas con metodologías y técnicas agiles
Desarrollando sistemas con metodologías y técnicas agilesDesarrollando sistemas con metodologías y técnicas agiles
Desarrollando sistemas con metodologías y técnicas agiles
 
Introducción a Agile y Scrum
Introducción a Agile y ScrumIntroducción a Agile y Scrum
Introducción a Agile y Scrum
 
Los diez mandamientos de TDD
Los diez mandamientos de TDDLos diez mandamientos de TDD
Los diez mandamientos de TDD
 
Programming Languages and their influence in Thinking
Programming Languages and their influence in ThinkingProgramming Languages and their influence in Thinking
Programming Languages and their influence in Thinking
 
Opening smalltalks 2013
Opening smalltalks 2013Opening smalltalks 2013
Opening smalltalks 2013
 

Similar a Encadenamiento de refactorings para generar cambios Agiles de Diseño

Funciones subrutinas y procedimientos
Funciones subrutinas y procedimientosFunciones subrutinas y procedimientos
Funciones subrutinas y procedimientos
jnarchie
 
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
jaircazarin
 

Similar a Encadenamiento de refactorings para generar cambios Agiles de Diseño (20)

Eclipse
EclipseEclipse
Eclipse
 
05 Creando Clases
05   Creando Clases05   Creando Clases
05 Creando Clases
 
Funciones subrutinas y procedimientos
Funciones subrutinas y procedimientosFunciones subrutinas y procedimientos
Funciones subrutinas y procedimientos
 
Workshop iOS 3: Testing, protocolos y extensiones
Workshop iOS 3: Testing, protocolos y extensionesWorkshop iOS 3: Testing, protocolos y extensiones
Workshop iOS 3: Testing, protocolos y extensiones
 
Fundamentos de la Refactorización
Fundamentos de la RefactorizaciónFundamentos de la Refactorización
Fundamentos de la Refactorización
 
Estandares de Codigo (Emanuel)
Estandares de Codigo (Emanuel)Estandares de Codigo (Emanuel)
Estandares de Codigo (Emanuel)
 
Working effectively with legacy code
Working effectively with legacy codeWorking effectively with legacy code
Working effectively with legacy code
 
Unidad ii. tdd
Unidad ii. tddUnidad ii. tdd
Unidad ii. tdd
 
Refactoring code smelss
Refactoring   code smelssRefactoring   code smelss
Refactoring code smelss
 
Portafolio de evidencias
Portafolio de evidenciasPortafolio de evidencias
Portafolio de evidencias
 
Cuida tu código: Clean Code
Cuida tu código: Clean CodeCuida tu código: Clean Code
Cuida tu código: Clean Code
 
Portafolio de evidencias
Portafolio de evidenciasPortafolio de evidencias
Portafolio de evidencias
 
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
Rompiendo dependencias contenidas en ensamblados .NET mediante la refactoriza...
 
Clase viii
Clase viiiClase viii
Clase viii
 
Intro Java
Intro JavaIntro Java
Intro Java
 
Funciones lenguaje c modulo4
Funciones lenguaje c modulo4Funciones lenguaje c modulo4
Funciones lenguaje c modulo4
 
Doble o nada
Doble o nadaDoble o nada
Doble o nada
 
Tutorial Eclipse
Tutorial Eclipse Tutorial Eclipse
Tutorial Eclipse
 
FUNCIONES EN LENGUAJE C
FUNCIONES EN LENGUAJE CFUNCIONES EN LENGUAJE C
FUNCIONES EN LENGUAJE C
 
Metodologías Aágiles: TDD (Test Driven development)
Metodologías Aágiles: TDD (Test Driven development)Metodologías Aágiles: TDD (Test Driven development)
Metodologías Aágiles: TDD (Test Driven development)
 

Más de Hernan Wilkinson

Más de Hernan Wilkinson (17)

Hacia una síntesis de diseño a partir de entender qué es modelar con software
Hacia una síntesis de diseño a partir de entender qué es modelar con softwareHacia una síntesis de diseño a partir de entender qué es modelar con software
Hacia una síntesis de diseño a partir de entender qué es modelar con software
 
Live Typing - California Smalltalkers
Live Typing - California SmalltalkersLive Typing - California Smalltalkers
Live Typing - California Smalltalkers
 
Buenos Aires vs. (London vs. Chicago) Agiles 2020
Buenos Aires vs. (London vs. Chicago) Agiles 2020Buenos Aires vs. (London vs. Chicago) Agiles 2020
Buenos Aires vs. (London vs. Chicago) Agiles 2020
 
LiveTyping - Anotación automática de tipos para lenguajes dinámicos
LiveTyping - Anotación automática de tipos para lenguajes dinámicosLiveTyping - Anotación automática de tipos para lenguajes dinámicos
LiveTyping - Anotación automática de tipos para lenguajes dinámicos
 
LiveTyping: Update and What is next
LiveTyping: Update and What is nextLiveTyping: Update and What is next
LiveTyping: Update and What is next
 
Cuis smalltalk past present and future
Cuis smalltalk past present and futureCuis smalltalk past present and future
Cuis smalltalk past present and future
 
Live Typing - Automatic Type Annotation that improves the Programming eXperie...
Live Typing- Automatic Type Annotation that improves the Programming eXperie...Live Typing- Automatic Type Annotation that improves the Programming eXperie...
Live Typing - Automatic Type Annotation that improves the Programming eXperie...
 
El Desarrollo de Software como debería Ser - PyConAr 2018
El Desarrollo de Software como debería Ser - PyConAr 2018El Desarrollo de Software como debería Ser - PyConAr 2018
El Desarrollo de Software como debería Ser - PyConAr 2018
 
Lessons Learned Implementing Refactorings
Lessons Learned Implementing RefactoringsLessons Learned Implementing Refactorings
Lessons Learned Implementing Refactorings
 
Dynamic Type Information
Dynamic Type InformationDynamic Type Information
Dynamic Type Information
 
El Desarrollo de Software como debería Ser - Nerdear.la 2018
El Desarrollo de Software como debería Ser - Nerdear.la 2018El Desarrollo de Software como debería Ser - Nerdear.la 2018
El Desarrollo de Software como debería Ser - Nerdear.la 2018
 
El Desarrollo de Software como debería Ser
El Desarrollo de Software como debería SerEl Desarrollo de Software como debería Ser
El Desarrollo de Software como debería Ser
 
TDD & Refactoring
TDD & RefactoringTDD & Refactoring
TDD & Refactoring
 
Go/Ruby/Java: What's next?
Go/Ruby/Java: What's next?Go/Ruby/Java: What's next?
Go/Ruby/Java: What's next?
 
Exceptions: Why, When, How and Where!
Exceptions: Why, When, How and Where!Exceptions: Why, When, How and Where!
Exceptions: Why, When, How and Where!
 
CuisUniversity
CuisUniversityCuisUniversity
CuisUniversity
 
Oop is not Dead
Oop is not DeadOop is not Dead
Oop is not Dead
 

Encadenamiento de refactorings para generar cambios Agiles de Diseño

  • 1. Encadenamiento de Refactorings Hernán Wilkinson agile software development & services www.10pines.com Twitter: @HernanWilkinson Blog: objectmodels.blogspot.com www.10pines.com
  • 3. Hacer TDD en código existente  Problemas Tengo que arreglar un error … … pero no puedo modificar código sin escribir un test primero… … pero no puedo escribir el test porque hay muchas dependencias que me lo impoden… … y debo romper esas dependencias para poder tester … … pero no puedo modificar código sin escribir un test primero… …
  • 4. Hacer TDD en código existente  Problemas Tengo que agregar funcionalidad … … pero no puedo modificar código sin escribir un test primero… … pero no puedo escribir el test porque el código es muy complicado, no lo entiendo… … y debo modificarlo para entenderlo … … pero no puedo modificar código sin escribir un test primero… …
  • 5. Hacer TDD en código existente  Problema: Mal diseño Código no entendible (malos nombres, mala distribución de responsabilidades, poca cohesión, etc). Mucho acoplamiento (referencia a recursos externos, mala descomposición funcional, etc)  Solución Refactoring, objetos simuladores, romper dependencias
  • 6. Ejemplo  Customer Import El sistema importa desde archivo clientes y sus direcciones. Formato de archivo: C,Pepe,Sanchez,D,22333444 A,San Martin,3322,Olivos,1636,BsAs A,Maipu,888,Florida,1122,Buenos Aires C,Juan,Perez,C,23-25666777-9 A,Alem,1122,CABA,1001,CABA Clientes Direcciones del Cliente
  • 7. Ejemplo  Customer Import Hay un main que prueba que funciona! Pero… ¿Funciona bien?
  • 8. Refactorings  Rename Renombra el elemento seleccionado y todas las referencias  Extract method Crea un nuevo método con el código seleccionado y lo reemplaza por un envío de mensaje a ese método Algunas herramientas reemplazan todas las repeticiones de la selección
  • 9. Refactorings  Move method Mueve el método seleccionado a una clase que debe estar visible desde el contexto en que se mueve. Modifica todas las referencias al método movido  Convert local to field - Introduce Field Convierte una variable local en variable de instancia Puede mover la inicialización de la variable
  • 10. Refactorings  Extract to Local - Introduce Variable Extrae el código seleccionado en una variable local inicializada con dicho código  Introduce parameter Reemplaza el código seleccionado con una referencia a un parámetro, modifica todos los senders agregando dicho parámetro que será el código reemplazado
  • 11. Refactorings  Change Method signature - Change Signature Permite modificar los elementos que definen un método como tipo de retorno, parametros, etc. Modifica todos los senders para quedar de acuerdo a la nueva definición Cuando se agregan parámetros se puede indicar con qué código usado en los senders
  • 12. Refactorings  Generalize Declared Type - Use base type where possible Permite reemplazar el tipo de una variable por algún supertipo
  • 13. Refactorings  Inline Copia el código representado por el método o variable a los lugares donde ser referencia dicho método o variable  Extract to Local + Extract Method + Inline Se los suele utilizar para extraer código que se encuentra separado
  • 14. Refactorings  Encapsulate Field Referencias a variables de instancia se reemplazan por getter y setters  Encapsulate Field + Move Permite mover variables de instancia a otras clases
  • 15. Refactorings  Extract Interface Permite crear una interface a partir de parte del protocolo definido en una clase  Extract Interface + Generalize Declared Type Sirve para crear jerarquías polimórficas
  • 16. Refactorings  Extract Parameter Object - Extract Class from Parameters Permite crear una abstracción nueva a partir de un conjunto de parámetros de un método Reemplaza todos los senders por la instanciación de la nueva abstracción
  • 17. Refactorings  Extract Parameter Object + Move Permite crear nuevas abstracciones a partir de código existente  Extract Parameter Object + Generalize Declared Type Permite usar la misma abstracción extrayéndola de métodos distintos
  • 18. Refactorings  Extract Superclass Idem Extract Interface pero con clase  Extract Class Permite encapsular variables de instancia en una clase
  • 19. Refactorings  Pull Up Mueve variables de instancia y/o métodos a la superclase o declara el método como abstracto en la superclase  Push Down Mueve un conjunto de variables de instancia y/o métodos a las subclases
  • 21. Recordar  Lo más importante: Feedback inmediato para poder reflexionar  No preocuparme por nombres de tests al principio  No preocuparme por organización de los tests al principio  Recordar que es iterativo incremental
  • 22. Recordar  Usar la computadora como soporte/medio de aprendizaje  No correr el sistema en nuestra cabeza!  Hacerle caso a nuestro instinto  El código nos habla  No ser derrotista  Es test no es el fin, es un medio  Un programador no es buen programador si no es buen tester
  • 23. Recordar  TDD ayuda a generar diseños menos acoplados  TDD NO IMPLICA BUEN DISEÑO!!  TDD nos da confianza para realizar cambios cuando el modelo así lo requiera  Debido al punto anterior, el sistema no se convierte en Legacy
  • 25. Bibliografía recomendada Test Driven Development By Example. Kent Beck, 2002. xUnit Test Patterns: Refactoring Test Code Gerard Meszaros, 2007. Working Effectively with Legacy Code Michael Feacthers
  • 26. Bibliografía adicional ▶ S. Freeman, N. Pryce – Growing Object Oriented Software with Tests, 2009 ▶ K.Beck, M.Fowler – Planning Extreme Programming. 2000 ▶ L.Crispin, J.Gregory - Agile Testing: A Practical Guide for Testers and Agile Teams. 2009 ▶ L.Koskela - Test Driven: TDD and Acceptance TDD for Java Developers. 2007 ▶ T.Mackinnon, S.Freeman, P.Crai - Endo-Testing: Unit Testing with Mock Objects. 2000 http://www.mockobjects.com/files/endotesting.pdf ▶ M.Fowler - Mocks Aren't Stubs. http://martinfowler.com/articles/mocksArentStubs.html