14147503 Intentions Interfaces Making Patterns Concrete

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    Favorites, Groups & Events

    14147503 Intentions Interfaces Making Patterns Concrete - Presentation Transcript

    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. Application Code May cause a collapse of application structure Infrastructure Code at Co ion de lic App Infrastructure Code
    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” Application Code Infrastructure Code New New 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(); Customer .Validate(); * Address .Validate(); Order But what if we start here? Persistence
    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) Persistence Service Locator Get<IValidator<Customer>> new Validate(Customer) Customer Validator
    25. But that’s not Object Oriented Is it?
    26. Extensible and Object Oriented .Persist(Customer) Persistence Service Locator Get<IValidator<Customer>> new Validate(Customer) Customer Validator .Validate(); Customer
    27. And application code stays simple Application Code .Persist(Customer) Infrastructure Code
    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) Persistence Service Locator 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

    + QConLondon2008QConLondon2008, 6 months ago

    custom

    252 views, 0 favs, 0 embeds more stats

    More info about this document

    © All Rights Reserved

    Go to text version

    • Total Views 252
      • 252 on SlideShare
      • 0 from embeds
    • Comments 0
    • Favorites 0
    • Downloads 4
    Most viewed embeds

    more

    All embeds

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?

    Categories