Your SlideShare is downloading. ×
Design Principles
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Design Principles

431
views

Published on


0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
431
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
43
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Design Principles By Kartheek Nagasuri & Amit Grewal
  • 2. Design• What is the meaning of the Design? Design is about “How”• What is the Difference if compared to Analysis? Analysis is about “What”
  • 3. Design Why do we need (good) design? To Deliver Faster To Deal with Complexity To Manage Change
  • 4. Design• How do we know a design is bad? “W*F? “ I can’t Fix this code “W*F? “ “W*F? “ I fixed the problem “W*F? “ but it broke at “W*F? “ other places.. “W*F? “ “W*F? “ “W*F? “
  • 5. Design• Lets talk about criteria of bad design • Are there any Symptoms of bad design? Immobility Rigidity Fragility Viscosity
  • 6. Rigidity• The Impact of the change is Unpredictable – Every change causes a cascade of changes in dependant modules. – A nice 2 days work become endless “Marathon” – Costs become unpredictable.
  • 7. Immobility• Its almost impossible to reuse interesting parts of the software – The useful modules have somany depandancies – The cost of rewriting is less compared to the risk faced to separate those parts
  • 8. Fragility• The Software tends to break in many places on every change. – The breakage occurs in areas with no conceptual relationship. – On every fix the software breaks in unexpected ways.
  • 9. Viscosity• A hack is cheaper to implement than the solution with in the design – preserving design moves are difficult to think and to implement. – Its much easier to do wrong thing than the right one.
  • 10. Design• What is the reason why design becomes rigid, fragile, immobile and viscous? Improper dependencies between the modules
  • 11. Good Design• What are the characteristics of a good design High Cohesion Low coupling
  • 12. How can we achieve gooddesign?
  • 13. Let’s Go SOLID…• Single Responsibility Principle• Open Close Principle• Liskov Substitution Principle• Interface Segregation Principle• Dependency Inversion Principle
  • 14. Single Responsibility Principle
  • 15. Single Responsibility Principle• A software module should have one and only responsibility• A software module should have one reason only to change• It translates directly in high cohesion
  • 16. Single Responsibility Principle• Is SRP violate here? Interface modem { Public Void Dial (string pno); Public void hangup(); Public void send (char c); Public char receive(); }
  • 17. Single Responsibility Principle• Is SRP violate here? Interface Employee { Public pay calculate(); Public void report(Writer w); Public void save(); Public void reload(); }
  • 18. How to Solve? public abstract class BankAccount { double Balance { get; } void Deposit(double amount) {} void Withdraw(double amount) {} void AddInterest(double amount) {} void Transfer(double amount, IBankAccount toAccount) {} }
  • 19. public abstract class BankAccount { double Balance { get; } void Deposit(double amount); void Withdraw(double amount); void Transfer(double amount, IBankAccount toAccount);}public class CheckingAccount : BankAccount { }public class SavingsAccount : BankAccount{ public void AddInterest(double amount); }
  • 20. Open Closed Principle
  • 21. Open Closed Principle• Modules should be open for extension but closed for modification.• “You should be able to extend the behavior of a module without changing it”
  • 22. public class ProductFilter { public IEnumerable<Product> ByColor(IList<Product> products, ProductColor productColor) {foreach (var product in products){ if (product.Color == productColor) yield return product; } } }
  • 23. public class ProductFilter { public IEnumerable<Product> BySize(IList<Product> products, ProductSize productSize) {foreach (var product in products){ if (product.Size== productSize) yield return product; } } }
  • 24. public class ProductFilter { public IEnumerable<Product> BySize(IList<Product> products, ProductColor productColor, ProductSize productSize) {foreach (var product in products){ if (product.Size== productSize && product.color==productColor) yield return product; } } }
  • 25. Any Problem?• Every time a user asks for new criteria to filter a product, do we have to modify the ProductFilter class? – Yes! This means it is not CLOSED for modification.• Every time a user asks for new criteria to filter a product, can we extend the behavior of the ProductFilter class to support the new criteria, without opening up the class file again and modifying it? – No! This means it is not OPEN for extension.
  • 26. Solution • Templatepublic abstract class roductFilterSpecification{public IEnumerable<Product> Filter(IList<Product> products){ return ApplyFilter(products); }protected abstract IEnumerable<Product> ApplyFilter(IList<Product>products);}
  • 27. public class ColorFilterSpecification :ProductFilterSpecification{ private readonly ProductColor productColor; public ColorFilterSpecification(ProductColor productColor){ this.productColor = productColor; }protected override IEnumerable<Product> ApplyFilter(IList<Product> products){ foreach (var product in products){ if (product.Color == productColor) yield return product; } } }
  • 28. public IEnumerable<Product> By(IList<Product> products, ProductFilterSpecification filterSpecification) { return filterSpecification.Filter(products); }
  • 29. Are we Fine now?
  • 30. Liskov Substitution Principle
  • 31. Liskov Substitution Principle• Functions that use ... references to base classes must be able to use objects of derived classes without knowing it.• A user of a base class should continue to function properly if a derivative of that base class is passed to it.
  • 32. Interface Segregation Principle
  • 33. Interface Segregation Principle• ISP States that clients should not know about fat classes.• Instead they should rely on clean cohesive interfaces• Many client specific interfaces are better than one general purpose interface
  • 34. Interface Segregation Principle• A class with many clients, and one large interface to serve them all
  • 35. Interface Segregation Principle
  • 36. Dependency Inversion Principle
  • 37. Dependency Inversion Principle• High level modules should not depend on low level modules, both should depend• Abstractions should not depend upon details, details should depend upon abstractions• Every dependency in the design should target an interface, or an abstract class. No dependency should target a concrete class.
  • 38. Dependency Inversion Principle
  • 39. Dependency Inversion Principle
  • 40. Dependency Inversion Principle• Don’t depend on anything concrete, depend only upon abstraction• High level modules should not be forced to change because of a change in low level/technology layers• Drives you towards low coupling
  • 41. Conclusion• The main forces driving your design should be “High Cohesion” and “Low coupling”• SOLID principles put you on right path.

×