SlideShare una empresa de Scribd logo
1 de 40
Descargar para leer sin conexión
Connascence
Apprentiship Program
2020
Laura Gonzalez Fernandez
www.lauragonzafer.com
● Culo inquieto por naturaleza
● Apasionada de los videojuegos
Laura Gonzalez Fernandez
Software Engineer in training at LifullConnect
Index of content
Introduction
¿Cual es nuestra Meta?
¿Como lo conseguimos?
Code Smells, Patterns, y demas
familia
Connascene
¿Que significa Connascene?
Que nos aporta
Propiedades
Como Aplicarla
Conclusion
Q&A
Contenidos
¿ Cual es nuestra meta ?
Un código limpio, fácil de entender y
sostenible
¿ Como lo conseguimos ?
Code Smells
Bloaters
● Long Method
● Large Class
● Primitive Obsession
● Long Parameter List
● Data Clumps
Object-Orientation Abusers
● Switch Statements
● Temporary Field
● Refused Bequest
● Alternative Classes with
Different Interfaces
Change Preventers
● Divergent Change
● Shotgun Surgery
● Parallel Inheritance
Hierarchies
Dispensable
● Comments
● Duplicate Code
● Lazy Class
● Data Class
● Dead Code
● Speculative Generality
Couplers
● Feature Envy
● Inappropriate Intimacy
● Message Chains
● Middle Man
● Incomplete Library Class
Design Patterns
Creational
● Abstract Factory
● Builder
● Factory Method
● Object Pool
● Prototype
● Singleton
Structural
● Adapter
● Bridge
● Composite
● Decorator
● Facade
● Flyweight
● Private Class Data
● Proxy
Behavioral
● Chain of Responsibility
● Command
● Interpreter
● Iterator
● Mediator
● Memento
● Null Object
● Observer
● State
● Strategy
● Template Method
● Visitor
¿Connascence es otro método más?
Connascence
¿Que significa Connascence?
Cuando teniendo dos elementos de software A y B cualquier
cambio en A va a requerir que B cambie o incluso que ambos
cambien juntos para seguir funcionando correctamente
Connascence == Brujula
¿Que es realmente Connascence?
Agile Technical Practices Distilled by Pedro Moreira Santos, Marco Consolaro y Alessandro Di Gioia
Propiedades
DEGREE
El impacto estimado que tendrá un cambio en nuestro
código. Cuanto más alto más difícil será realizar un cambio.
Propiedades
LOCALITY
La cercanía entre sí de nuestros elementos. Debemos
intentar mantenerlos lo más cerca posible
STRENGTH
Como de complejo será realizar esos cambios, es las
difícil y costosa de aplicar
Propiedades
Agile Technical Practices Distilled by Pedro Moreira Santos, Marco Consolaro y Alessandro Di Gioia
STATIC
Pueden verse en
tiempo de
compilación
Dynamic
Solo se ven en
tiempo de ejecución
Varios componentes de una aplicación deben ponerse de
acuerdo en el nombre de una entidad
Name
public class Time {
int _hour;
int _minute;
int _second;
public Time(int hour, int minute, int second){
_hour = hour;
_minute = minute;
_second = second;
}
public string Display(){
return _hour + ":" + _minute + ":" + _second + ":";
}
}
Varios componentes de una aplicación deben ponerse de
acuerdo en el tipo de una entidad
Type
public class Time {
int _hour;
int _minute;
int _second;
public Time(int hour, int minute, int second){
_hour = hour;
_minute = minute;
_second = second;
}
public string Display(){
return _hour + ":" + _minute + ":" + _second + ":";
}
}
Dos o más componentes tiene que tener un acuerdo en
el significado de su valor. Es decir que tiene que tener
un significado entendible.
Convention (Meaning)
private SetTransport(string
transport){
switch(transport){
case "1":
AddBike();
case "2":
AddCar();
case "3":
AddTrain();
case "4":
AddBus();
break;
}
}
private SetTransport(string
transport){
switch(transport){
case BIKE:
AddBike();
case CAR:
AddCar();
case TRAIN:
AddTrain();
case BUS:
AddBus();
break;
}
}
Dos o más componentes usan un mismo algoritmo de
manera individual, por qué lo si este cambia se debe
propagar en todos los componentes
Algorithm
public string AddChecksum(string
inputData){
var sum =
SumCharsOf(inputData);
var difference = sum % 10;
return inputData +
difference;
}
public bool Check(string
inputData){
var sum =
SumCharsOf(inputData);
return sum % 10 == 0;
}
public string AddChecksum(string
inputData){
return inputData +
Checksum(inputData);
}
public bool Check(string inputData){
return Checksum(inputData) == 0;
}
private int Checksum(string
inputData){
var sum = SumCharsOf(inputData);
return sum % 10;
}
Ocurre cuando en un método añadimos varios
componentes que deben ser adjuntados en un orden
concreto.TIP: Suele estar relacionada con Primitive
obsession
Position
public void SendEmail(String recipient, String sender, String message) {
Email email = new Email();
email.To(recipient);
email.From(sender);
email.Body(message);
_smtpService.SendEmail(email);
}
public void SendEmail(Recipient recipient, Sender sender, Message message) {
Email email = new Email();
email.To(recipient.Address);
email.From(sender.Address);
email.Body(message.body);
_smtpService.SendEmail(email);
}
La llamada a componentes de una aplicaciones debe tener
un orden concreto que no está registrado explícitamente.
Execution Order
public void SendReceipts(){
var receiptSender = new ReceiptSender();
var receiptId = NextUnsentReceiptId();
while(receiptId != null){
receiptSender.SendToCustomer(receiptId);
receiptSender.Archive(receiptId);
receiptId = NextUnsentReceiptID();
}
}
Dos o más llamadas depende del tiempo , es decir de
cuando deben ejecutarse.
Timing
[TestFixture]
public class
ServiceBusMessageHandler_Should{
var messageHandler = new
MessageHandler();
[Test]
public void
ReceiveMessages(){
var expectedMessage = new
TestMessage();
SendMessageToIntegrationTestBus(expect
edMessage);
Thread.Sleep(1000);
var receivedMessage =
messageHandler.ReadLastMessage();
Assert.That(receivedMessage,
Is.Equal(expectedMessage))
}
[TestFixture]
public class
ServiceBusMessageHandler_Should{
var messageHandler = new
MessageHandler();
[Test]
public void
ReceiveMessages(){
var expectedMessage = new
TestMessage();
SendMessageToIntegrationTestBus(expected
Message);
awaiter.WaitOne(1000);
var receivedMessage =
messageHandler.ReadLastMessage();
Assert.That(receivedMessage,
Is.Equal(expectedMessage))
}
Cuando dos o más componentes estar
interrelacionados o tienen un rango de validación que
no se expresa o deja constancia
Value
public class Time {
int _hour;
int _minute;
int _second;
public Time(int hour, int minute, int second){
hour = hour;
minute = minute;
second = second;
}
} private void Validate(){
if (_hour < 0 || _hour > 23)
throw new InvalidHourException();
if(_minute < 0 || _minute > 59)
throw new InvalidMinuteException();
if(_second < 0 || _second > 59)
throw new InvalidSecondException();
}
Cuando uno o más componentes hacen referencia al
exactamente la misma instancia de otra entidad.
Identity
public class GlobalCounter{
int count = 0;
public void Increment(){
count++;
}
public int CurrentCount(){
return count;
}
}
public class Controller{
GlobalCounter _counter;
public Controller(GlobalCounter counter){
_counter = counter;
}
public ActionResult Home(){
_counter.Increment();
}
}
Conclusiones
Concluºsione
s
Connascence puede ser la brújula que te
indique el camino hacia un mejor código
Laura Gonzalez Fernandez
www.lauragonzafer.com
Q & A
Muchas Gracias

Más contenido relacionado

Similar a Connascence: la brújula hacia un código más limpio

Proyecto
ProyectoProyecto
Proyectodani
 
Apuntes #XPweek
Apuntes #XPweekApuntes #XPweek
Apuntes #XPweekCarlos Ble
 
Node al limite con NestJS
Node al limite con NestJSNode al limite con NestJS
Node al limite con NestJSArturo Silvelo
 
CQRS .NET Conf Chile 2018
CQRS .NET Conf Chile 2018CQRS .NET Conf Chile 2018
CQRS .NET Conf Chile 2018Germán Küber
 
Estructuras basicas pseint
Estructuras basicas pseintEstructuras basicas pseint
Estructuras basicas pseintdeibytrochez1
 
Tutorial Nro 1 de Desarrollo de Aplicaciones Móviles con Android
Tutorial Nro 1 de Desarrollo de Aplicaciones Móviles con AndroidTutorial Nro 1 de Desarrollo de Aplicaciones Móviles con Android
Tutorial Nro 1 de Desarrollo de Aplicaciones Móviles con AndroidLuis Ernesto Castillo Alfaro
 
Angular 2 Campus Madrid Septiembre 2016
Angular 2 Campus Madrid Septiembre 2016Angular 2 Campus Madrid Septiembre 2016
Angular 2 Campus Madrid Septiembre 2016Micael Gallego
 
Taller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con DjangoTaller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con DjangoJuan Rodríguez
 
Diseño de Sistemas
Diseño de SistemasDiseño de Sistemas
Diseño de Sistemasjorgecaruci
 
01 Introduccion Programación Orientaeda a Objetos
01 Introduccion Programación Orientaeda a Objetos01 Introduccion Programación Orientaeda a Objetos
01 Introduccion Programación Orientaeda a ObjetosXavier Ochoa
 
JUG DAY FLEX / JEE
JUG DAY FLEX / JEEJUG DAY FLEX / JEE
JUG DAY FLEX / JEEjcoronel
 
Appcircus Academy: Integración de Social Media en Android
Appcircus Academy: Integración de Social Media en AndroidAppcircus Academy: Integración de Social Media en Android
Appcircus Academy: Integración de Social Media en AndroidAlberto Ruibal
 
Funciones lenguaje c modulo4
Funciones lenguaje c modulo4Funciones lenguaje c modulo4
Funciones lenguaje c modulo4flaquita_dany
 
FUNCIONES EN LENGUAJE C
FUNCIONES EN LENGUAJE CFUNCIONES EN LENGUAJE C
FUNCIONES EN LENGUAJE Cflaquita_dany
 
"Los Imprescindibles de .NetCore"
"Los Imprescindibles de .NetCore""Los Imprescindibles de .NetCore"
"Los Imprescindibles de .NetCore"www.encamina.com
 

Similar a Connascence: la brújula hacia un código más limpio (20)

Proyecto
ProyectoProyecto
Proyecto
 
Aw agiles2010 - dppt 1.1
Aw agiles2010 - dppt 1.1Aw agiles2010 - dppt 1.1
Aw agiles2010 - dppt 1.1
 
Apuntes #XPweek
Apuntes #XPweekApuntes #XPweek
Apuntes #XPweek
 
Node al limite con NestJS
Node al limite con NestJSNode al limite con NestJS
Node al limite con NestJS
 
CQRS .NET Conf Chile 2018
CQRS .NET Conf Chile 2018CQRS .NET Conf Chile 2018
CQRS .NET Conf Chile 2018
 
Estructuras basicas pseint
Estructuras basicas pseintEstructuras basicas pseint
Estructuras basicas pseint
 
Tutorial Nro 1 de Desarrollo de Aplicaciones Móviles con Android
Tutorial Nro 1 de Desarrollo de Aplicaciones Móviles con AndroidTutorial Nro 1 de Desarrollo de Aplicaciones Móviles con Android
Tutorial Nro 1 de Desarrollo de Aplicaciones Móviles con Android
 
Semana2 clases
Semana2 clasesSemana2 clases
Semana2 clases
 
Angular 2 Campus Madrid Septiembre 2016
Angular 2 Campus Madrid Septiembre 2016Angular 2 Campus Madrid Septiembre 2016
Angular 2 Campus Madrid Septiembre 2016
 
Clase4
Clase4Clase4
Clase4
 
Taller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con DjangoTaller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con Django
 
Diseño de Sistemas
Diseño de SistemasDiseño de Sistemas
Diseño de Sistemas
 
01 Introduccion Programación Orientaeda a Objetos
01 Introduccion Programación Orientaeda a Objetos01 Introduccion Programación Orientaeda a Objetos
01 Introduccion Programación Orientaeda a Objetos
 
Estructuras basicas pseint
Estructuras basicas pseintEstructuras basicas pseint
Estructuras basicas pseint
 
JUG DAY FLEX / JEE
JUG DAY FLEX / JEEJUG DAY FLEX / JEE
JUG DAY FLEX / JEE
 
Appcircus Academy: Integración de Social Media en Android
Appcircus Academy: Integración de Social Media en AndroidAppcircus Academy: Integración de Social Media en Android
Appcircus Academy: Integración de Social Media en Android
 
Cuestionario consultado
Cuestionario consultadoCuestionario consultado
Cuestionario consultado
 
Funciones lenguaje c modulo4
Funciones lenguaje c modulo4Funciones lenguaje c modulo4
Funciones lenguaje c modulo4
 
FUNCIONES EN LENGUAJE C
FUNCIONES EN LENGUAJE CFUNCIONES EN LENGUAJE C
FUNCIONES EN LENGUAJE C
 
"Los Imprescindibles de .NetCore"
"Los Imprescindibles de .NetCore""Los Imprescindibles de .NetCore"
"Los Imprescindibles de .NetCore"
 

Connascence: la brújula hacia un código más limpio

  • 2. www.lauragonzafer.com ● Culo inquieto por naturaleza ● Apasionada de los videojuegos Laura Gonzalez Fernandez Software Engineer in training at LifullConnect
  • 3. Index of content Introduction ¿Cual es nuestra Meta? ¿Como lo conseguimos? Code Smells, Patterns, y demas familia Connascene ¿Que significa Connascene? Que nos aporta Propiedades Como Aplicarla Conclusion Q&A Contenidos
  • 4. ¿ Cual es nuestra meta ? Un código limpio, fácil de entender y sostenible
  • 5. ¿ Como lo conseguimos ?
  • 6. Code Smells Bloaters ● Long Method ● Large Class ● Primitive Obsession ● Long Parameter List ● Data Clumps Object-Orientation Abusers ● Switch Statements ● Temporary Field ● Refused Bequest ● Alternative Classes with Different Interfaces Change Preventers ● Divergent Change ● Shotgun Surgery ● Parallel Inheritance Hierarchies Dispensable ● Comments ● Duplicate Code ● Lazy Class ● Data Class ● Dead Code ● Speculative Generality Couplers ● Feature Envy ● Inappropriate Intimacy ● Message Chains ● Middle Man ● Incomplete Library Class
  • 7. Design Patterns Creational ● Abstract Factory ● Builder ● Factory Method ● Object Pool ● Prototype ● Singleton Structural ● Adapter ● Bridge ● Composite ● Decorator ● Facade ● Flyweight ● Private Class Data ● Proxy Behavioral ● Chain of Responsibility ● Command ● Interpreter ● Iterator ● Mediator ● Memento ● Null Object ● Observer ● State ● Strategy ● Template Method ● Visitor
  • 8. ¿Connascence es otro método más?
  • 10. ¿Que significa Connascence? Cuando teniendo dos elementos de software A y B cualquier cambio en A va a requerir que B cambie o incluso que ambos cambien juntos para seguir funcionando correctamente
  • 11. Connascence == Brujula ¿Que es realmente Connascence?
  • 12. Agile Technical Practices Distilled by Pedro Moreira Santos, Marco Consolaro y Alessandro Di Gioia
  • 13. Propiedades DEGREE El impacto estimado que tendrá un cambio en nuestro código. Cuanto más alto más difícil será realizar un cambio.
  • 14. Propiedades LOCALITY La cercanía entre sí de nuestros elementos. Debemos intentar mantenerlos lo más cerca posible
  • 15. STRENGTH Como de complejo será realizar esos cambios, es las difícil y costosa de aplicar Propiedades
  • 16. Agile Technical Practices Distilled by Pedro Moreira Santos, Marco Consolaro y Alessandro Di Gioia
  • 17. STATIC Pueden verse en tiempo de compilación Dynamic Solo se ven en tiempo de ejecución
  • 18. Varios componentes de una aplicación deben ponerse de acuerdo en el nombre de una entidad Name
  • 19. public class Time { int _hour; int _minute; int _second; public Time(int hour, int minute, int second){ _hour = hour; _minute = minute; _second = second; } public string Display(){ return _hour + ":" + _minute + ":" + _second + ":"; } }
  • 20. Varios componentes de una aplicación deben ponerse de acuerdo en el tipo de una entidad Type
  • 21. public class Time { int _hour; int _minute; int _second; public Time(int hour, int minute, int second){ _hour = hour; _minute = minute; _second = second; } public string Display(){ return _hour + ":" + _minute + ":" + _second + ":"; } }
  • 22. Dos o más componentes tiene que tener un acuerdo en el significado de su valor. Es decir que tiene que tener un significado entendible. Convention (Meaning)
  • 23. private SetTransport(string transport){ switch(transport){ case "1": AddBike(); case "2": AddCar(); case "3": AddTrain(); case "4": AddBus(); break; } } private SetTransport(string transport){ switch(transport){ case BIKE: AddBike(); case CAR: AddCar(); case TRAIN: AddTrain(); case BUS: AddBus(); break; } }
  • 24. Dos o más componentes usan un mismo algoritmo de manera individual, por qué lo si este cambia se debe propagar en todos los componentes Algorithm
  • 25. public string AddChecksum(string inputData){ var sum = SumCharsOf(inputData); var difference = sum % 10; return inputData + difference; } public bool Check(string inputData){ var sum = SumCharsOf(inputData); return sum % 10 == 0; } public string AddChecksum(string inputData){ return inputData + Checksum(inputData); } public bool Check(string inputData){ return Checksum(inputData) == 0; } private int Checksum(string inputData){ var sum = SumCharsOf(inputData); return sum % 10; }
  • 26. Ocurre cuando en un método añadimos varios componentes que deben ser adjuntados en un orden concreto.TIP: Suele estar relacionada con Primitive obsession Position
  • 27. public void SendEmail(String recipient, String sender, String message) { Email email = new Email(); email.To(recipient); email.From(sender); email.Body(message); _smtpService.SendEmail(email); } public void SendEmail(Recipient recipient, Sender sender, Message message) { Email email = new Email(); email.To(recipient.Address); email.From(sender.Address); email.Body(message.body); _smtpService.SendEmail(email); }
  • 28. La llamada a componentes de una aplicaciones debe tener un orden concreto que no está registrado explícitamente. Execution Order
  • 29. public void SendReceipts(){ var receiptSender = new ReceiptSender(); var receiptId = NextUnsentReceiptId(); while(receiptId != null){ receiptSender.SendToCustomer(receiptId); receiptSender.Archive(receiptId); receiptId = NextUnsentReceiptID(); } }
  • 30. Dos o más llamadas depende del tiempo , es decir de cuando deben ejecutarse. Timing
  • 31. [TestFixture] public class ServiceBusMessageHandler_Should{ var messageHandler = new MessageHandler(); [Test] public void ReceiveMessages(){ var expectedMessage = new TestMessage(); SendMessageToIntegrationTestBus(expect edMessage); Thread.Sleep(1000); var receivedMessage = messageHandler.ReadLastMessage(); Assert.That(receivedMessage, Is.Equal(expectedMessage)) } [TestFixture] public class ServiceBusMessageHandler_Should{ var messageHandler = new MessageHandler(); [Test] public void ReceiveMessages(){ var expectedMessage = new TestMessage(); SendMessageToIntegrationTestBus(expected Message); awaiter.WaitOne(1000); var receivedMessage = messageHandler.ReadLastMessage(); Assert.That(receivedMessage, Is.Equal(expectedMessage)) }
  • 32. Cuando dos o más componentes estar interrelacionados o tienen un rango de validación que no se expresa o deja constancia Value
  • 33. public class Time { int _hour; int _minute; int _second; public Time(int hour, int minute, int second){ hour = hour; minute = minute; second = second; } } private void Validate(){ if (_hour < 0 || _hour > 23) throw new InvalidHourException(); if(_minute < 0 || _minute > 59) throw new InvalidMinuteException(); if(_second < 0 || _second > 59) throw new InvalidSecondException(); }
  • 34. Cuando uno o más componentes hacen referencia al exactamente la misma instancia de otra entidad. Identity
  • 35. public class GlobalCounter{ int count = 0; public void Increment(){ count++; } public int CurrentCount(){ return count; } } public class Controller{ GlobalCounter _counter; public Controller(GlobalCounter counter){ _counter = counter; } public ActionResult Home(){ _counter.Increment(); } }
  • 37. Concluºsione s Connascence puede ser la brújula que te indique el camino hacia un mejor código
  • 38.