Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Connascence, tu brújula para el camino

Pequeña introducción al método Connascence y como puede ser un gran aliado cuando estas empezando en el mundo del TDD y la refactorizacion de código.

  • Be the first to comment

  • Be the first to like this

Connascence, tu brújula para el camino

  1. 1. Connascence Apprentiship Program 2020 Laura Gonzalez Fernandez
  2. 2. www.lauragonzafer.com ● Culo inquieto por naturaleza ● Apasionada de los videojuegos Laura Gonzalez Fernandez Software Engineer in training at LifullConnect
  3. 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. 4. ¿ Cual es nuestra meta ? Un código limpio, fácil de entender y sostenible
  5. 5. ¿ Como lo conseguimos ?
  6. 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. 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. 8. ¿Connascence es otro método más?
  9. 9. Connascence
  10. 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. 11. Connascence == Brujula ¿Que es realmente Connascence?
  12. 12. Agile Technical Practices Distilled by Pedro Moreira Santos, Marco Consolaro y Alessandro Di Gioia
  13. 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. 14. Propiedades LOCALITY La cercanía entre sí de nuestros elementos. Debemos intentar mantenerlos lo más cerca posible
  15. 15. STRENGTH Como de complejo será realizar esos cambios, es las difícil y costosa de aplicar Propiedades
  16. 16. Agile Technical Practices Distilled by Pedro Moreira Santos, Marco Consolaro y Alessandro Di Gioia
  17. 17. STATIC Pueden verse en tiempo de compilación Dynamic Solo se ven en tiempo de ejecución
  18. 18. Varios componentes de una aplicación deben ponerse de acuerdo en el nombre de una entidad Name
  19. 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. 20. Varios componentes de una aplicación deben ponerse de acuerdo en el tipo de una entidad Type
  21. 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. 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. 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. 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. 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. 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. 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. 28. La llamada a componentes de una aplicaciones debe tener un orden concreto que no está registrado explícitamente. Execution Order
  29. 29. public void SendReceipts(){ var receiptSender = new ReceiptSender(); var receiptId = NextUnsentReceiptId(); while(receiptId != null){ receiptSender.SendToCustomer(receiptId); receiptSender.Archive(receiptId); receiptId = NextUnsentReceiptID(); } }
  30. 30. Dos o más llamadas depende del tiempo , es decir de cuando deben ejecutarse. Timing
  31. 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. 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. 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. 34. Cuando uno o más componentes hacen referencia al exactamente la misma instancia de otra entidad. Identity
  35. 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(); } }
  36. 36. Conclusiones
  37. 37. Concluºsione s Connascence puede ser la brújula que te indique el camino hacia un mejor código
  38. 38. Laura Gonzalez Fernandez www.lauragonzafer.com Q & A
  39. 39. Muchas Gracias

×