intentions interfaces
play

Intentions & Interfaces Making patterns concrete Udi Dahan The - PowerPoint PPT Presentation

Intentions & Interfaces Making patterns concrete Udi Dahan The Software Simplist .NET Development Expert & SOA Specialist www.UdiDahan.com email@UdiDahan.com Books, and books, and books, and books Flexibility brings many benefits


  1. Intentions & Interfaces Making patterns concrete Udi Dahan – The Software Simplist .NET Development Expert & SOA Specialist www.UdiDahan.com email@UdiDahan.com

  2. Books, and books, and books, and books…

  3. Flexibility brings many benefits

  4. Preventing rigidity from creeping in

  5. Existing solutions Strategy Pattern Visitor Pattern

  6. Visitor pattern Requires a method for each ConcreteElement

  7. Strategy pattern Requires all classes to contain a strategy

  8. Applicati lication on Cod ode May cause a collapse of application structure Infrastr In rastructure ucture Code at at Co Co ion io de de lic lic App Infr In fras astructu tructure re Cod ode

  9. Doing too much can hurt ou ren„t onna eed t

  10. “Prediction is very difficult, especially if it's about the future.” -- Niels Bohr Physics Nobel prize 1922

  11. Bolt on flexibility where you need it

  12. Sometimes called “hooks” Applicati lication on Cod ode In Infr frastruc astructure ture Cod ode New New w Code Code Code Code

  13. Flexibility you seek? Hmm? Made your roles explicit, have you? No? That is why you fail.

  14. Make Roles Explicit

  15. Some well known interfaces ISerializable IFather IHusband Java Serializable IGoToWork IComeHome IWashTheDishes

  16. Custom entity validation before persistence

  17. The old “object - oriented” way bool IsValidating; .Validate(); Cust ustomer omer .Validate(); * Address Ad dress .Validate(); Order der But what if we start here? Persis sistenc ence

  18. It looks like our objects have too many roles to play

  19. Make roles explicit

  20. Add a marker interface here, and an interface there…. IEntity where T : IEntity IValidator<T> ValidationError Validate(T entity);

  21. The first part is trivial: IEntity Customer Order

  22. The second part is more interesting IValidator<T> ValidationError Validate(T entity); Customer CustomerValidator: IValidator<Customer> ValidationError Validate(Customer entity);

  23. Add a dash of Inversion of Control Service-Locator style

  24. The extensible way .Persist(Customer) Persis sistenc ence Service vice Lo Loca cator or Get<IValidator<Customer>> new Validate(Customer) Cust stomer omer Val alid idat ator or

  25. But that’s not Object Oriented Is it?

  26. Extensible and Object Oriented .Persist(Customer) Persis sistenc ence Service vice Lo Loca cator or Get<IValidator<Customer>> new Validate(Customer) Cust stomer omer Val alid idat ator or .Validate(); Cust stomer omer

  27. And application code stays simple Applicati lication on Cod ode .Persist(Customer) In Infr frastruc astructure ture Cod ode

  28. Loading objects from the DB public class Customer { public void MakePreferred() { foreach(Order o in this.UnshippedOrders) foreach(Orderline ol in o.OrderLines) ol.Discount(10.Percent); } } Lazy Loading

  29. Dangers of Lazy Loading public void MakePreferred() { foreach(Order o in this.UnshippedOrders) foreach(Orderline ol in o.OrderLines) ol.Discount(10.Percent); } DB

  30. Loading objects from the DB Making a customer Adding an Order “preferred” Customer Customer Order OrderLine

  31. Need Different “Fetching Strategies” public class ServiceLayer { public void MakePreferred(Id customerId) { Customer c = ORM.Get<Customer>(customerId); c.MakePreferred(); } public void AddOrder(Id customerId, OrderInfo o) { Customer c = ORM.Get<Customer>(customerId); c.AddOrder(o); } }

  32. Make Roles Explicit

  33. Use interfaces to differentiate roles IMakeCustomerPreferred IAddOrdersToCustomer void MakePreferred(); void AddOrder(Order o); Customer

  34. Application code specifies role public class ServiceLayer { public void MakePreferred(Id customerId) { IMakeCustomerPreferred c = ORM .Get< IMakeCustomerPreferred>(customerId); c.MakePreferred(); } public void AddOrder(Id customerId, OrderInfo o) { IAddOrdersToCustomer c = ORM .Get< IAddOrdersToCustomer>(customerId); c.AddOrder(o); } }

  35. Extend behavior around role IMakeCustomerPreferred IAddOrdersToCustomer void MakePreferred(); void AddOrder(Order o); Customer T MakeCustomerPreferredFetchingStrategy : Inherits IFetchingStrategy<IMakeCustomerPreferred> string Strategy { get { return “ UnshippedOrders, OrderLines ”; } } IFetchingStrategy<T>

  36. The extensible way .Get<IMakeCustomerPreferred>(id) Persis sistenc ence Service vice Lo Loca cator or Get<IFetchingStrategy< new IMakeCustomerPreferred>> Get strategy MakeCustomerPreferredFetchingStrategy

  37. And the pattern repeats… IMessage where T : IEntity IMessageHandler<T> void Handle(T message);

  38. Once your roles made explicit, you have… Extensibility and flexibility - simple they will be

  39. Thank you Udi Dahan – The Software Simplist .NET Development Expert & SOA Specialist www.UdiDahan.com email@UdiDahan.com

Recommend


More recommend