SlideShare a Scribd company logo
Lego for Engineers

                                    How to build Reusable
                                      and Maintainable
                                        Applications
                                            in C#
Lego (trademarked in capitals as LEGO)   Theo Jungeblut 06/03/2011
Theo Jungeblut
• Senior Software Developer at
  Omnicell Inc. in Mountain View
• Has been designing and
  implementing .NET based
  applications , components and
  frameworks for 8 years
• Previously worked in factory
  automation with focus on
  component based software and
  framework development for 3 ½
  years
                                   theo@csharp-lighthouse.com
• Degree in Software Engineering
  and Network Communications       www.csharp-lightouse.com
Overview
    • Why Lego for Software Engineers?
    • Design Patterns, Principles and Best Practices
    • Dependency Injection Container & more
    • The “Must Read”-Book
    • Summary
    • Q&A
    • References


3
Why Lego for Software Engineers?
Lego (trademarked in capitals as LEGO) is a line of construction toys manufactured by the Lego Group




        http://upload.wikimedia.org/wikipedia/commons/7/75/Lego_technic_gears.jpg
                                                                                                       4
Design Patterns, Principals
         & Best Practices
         • Keep it simple stupid (KISS)
         • Separation of Concerns (SoC)
         • Single Responsibility Principle (SRP)
         • Component Oriented Programming (CoP)
         • Interface / Contract
         • Don’t Repeat Yourself (DRY)
         • Dependency Inversion Principal (DIP)
         • Inversion of Control (IoC)
              • Constructor Injection
              • Setter Injection
              • Interface Injection
              • Service Locator

5
Keep it simple, stupid
        (KISS)
KISS-Principle – “Keep It Simple Stupid”
   by Kelly Johnson




                      http://blogs.smarter.com/blogs/Lego%20Brick.jpg   7
The Power of Simplicity




                                                       Graphic by Nathan Sawaya courtesy of brickartist.com




Graphic by Nathan Sawaya courtesy of brickartist.com

8                                                                               http://www.geekalerts.com/lego-iphone/
Graphic by Nathan Sawaya courtesy of brickartist.com
Separation of Concerns
         (SoC)

 Single Responsibility
       Principle
         (SRP)
The Product




http://www.technicopedia.com/8865.html
Component / Service




          http://www.technicopedia.com/8865.html
Class, Struct, Enum etc.




http://technicbricks.blogspot.com/2009/06/tbs-techpoll-12-results-2009-1st.html
Separation of Concerns (SoC)
         probably by Edsger W. Dijkstra in 1974

 • “In computer science,
 separation of concerns (SoC) is
 the process of separating a
 computer program into distinct
 features that overlap in
 functionality as little as possible.

 •A concern is any piece of
 interest or focus in a program.
 Typically, concerns are
 synonymous with features or
 behaviors. “
     http://en.wikipedia.org/wiki/Separati
     on_of_Concerns

14
Single Responsibility Principle (SRP)
           by Robert C Martin


     “Every object should have a single responsibility, and that
     responsibility should be entirely encapsulated by the class.”
         http://en.wikipedia.org/wiki/Single_responsibility_principle




     public class Logger : ILogger
     {
       public Logger(ILoggingSink loggingSink)
       {}

          public void Log(string message)
          {}
     }
                                                                        http://www.ericalbrecht.com
15
Component-Oriented
   Programming
       (CoP)
Different Ways of doing Something Similar




http://www.ericalbrecht.com




                                                            http://www.julianaheng.com/transformers-rotf-bumblebee-
                                                            and-sam-action-figures/




                              http://www.ericalbrecht.com

17
Why Reusable Components Rock




     http://www.ericalbrecht.com/technic/8020/8020all.jpg



18
Interfaces / Contracts
     • Decouple Usage and Implementation through introduction of a contract
     • Allows to replace implementation without changing the consumer

     public interface ILogger              public class Logger : ILogger
     {                                     {
       void Log(string message);             public Logger(ILoggingSink loggingSink)
     }                                       {}

                                               public void Log(string message)
                                               {}
                                           }




19
Don’t repeat yourself
        (DRY)
Don’t repeat yourself (DRY)
         by Andy Hunt and Dave Thomas in their book “The Pragmatic Programmer”

 // Code Copy and Paste Method                                                    // DRY Method
 public Class Person                                                              public Class Person
  {                                                                                {
    public string FirstName { get; set;}                                             public string FirstName { get; set;}
    public string LastName { get; set;}                                              public string LastName { get; set;}

     public Person(Person person)                                                     public Person(Person person)
     {                                                                                {
       this.FirstName = string.IsNullOrEmpty(person.FirstName)                          this.FirstName = person.FirstName.CloneSecured();
                  ? string.Empty : (string) person.FirstName.Clone();                   this.LastName = person.LastName.CloneSecured();
                                                                                      }
         this.LastName = string.IsNullOrEmpty(person.LastName)
                   ? string.Empty : (string) person.LastName.Clone();                 public object Clone()
     }                                                                                {
                                                                                        return new Person(this);
     public object Clone()                                                            }
     {                                                                            }
       return new Person(this);
     }
 }                                         public static class StringExtension
                                            {
                                              public static string CloneSecured(this string original)
                                              {
                                                return string.IsNullOrEmpty(original) ? string.Empty : (string)original.Clone();
                                              }
                                           }
21
Dependency Inversion Principle
           (DIP)
Dependency Inversion Principle (DIP)
  by Robert C. Martin


• “High-level modules should not depend on
  low-level modules. Both should depend on
  abstractions.
• Abstractions should not depend upon details.
  Details should depend upon abstractions.”
  http://en.wikipedia.org/wiki/Dependency_inversion_principle




                                                                23
S               Single Responsibility Principle

   O               Open/Closed Principle

   L               Liskov Substitution Principle

   I               Interface Segregation Principle

   D               Dependency Inversion Principle

Robert C Martin:   http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod
Inversion of Control
        (IoC)
Inversion of Control (IoC)
     by Martin Fowler 1994




             Logger logger = new Logger();




26
Inversion of Control (IoC)
     by Martin Fowler 1994




             Logger logger = new Logger();




27
The “Must Read”-Book
      by Mark Seemann


     Dependency
     Injection is a set of
     software design
     principles and
     patterns that
     enable us to
     develop loosely
     coupled code.


28        http://www.manning.com/seemann/
Inversion of Control –

     Constructor Injection
     http://www.martinfowler.com/articles/injection.html


     public class ContactManager : IContactManager
     {
       public ContactManager(ILogger logger,
                               IContactPersistence contactPersistence)
       {
         this.logger = logger;
         if (logger == null)
         {
            throw new ArgumentNullException("logger");
         }

             …
         }
     }
29
Inversion of Control –
     Setter (Property) Injection
     http://www.martinfowler.com/articles/injection.html



        // UNITY Example
        public class ContactManager : IContactManager
        {
          [Dependency]
          public IContactPersistence ContactPersistence
          {
            get { return this.contactPersistence; }

                set { this.contactPersistence = value; }
            }
        }



30
Inversion of Control (IoC) –

      Interface Injection
       http://www.martinfowler.com/articles/injection.html


                                                            In this methodology we implement an
                                                            interface from the IOC framework. IOC
                                                            framework will use the interface method to
                                                            inject the object in the main class. You can see
                                                            in figure ‘Interface based DI’ we have
                                                            implemented an interface ‘IAddressDI’ which
                                                            has a ‘setAddress’ method which sets the
                                                            address object. This interface is then
                                                            implemented in the customer class. External
                                                            client / containers can then use the
                                                            ‘setAddress’ method to inject the address
                                                            object in the customer object.
     http://www.codeproject.com/KB/aspnet/IOCDI/InterfacebasedDI.JPG   http://www.codeproject.com/KB/aspnet/IOCDI.aspx




31
Inversion of Control –

     Service Locator
     http://www.martinfowler.com/articles/injection.html



     // UNITY Example
     internal static class Program
     {
       private static UnityContainer unityContainer;
       private static SingleContactManagerForm singleContactManagerForm;

         private static void InitializeMainForm()
         {
           singleContactManagerForm =
           unityContainer.Resolve<SingleContactManagerForm>();
         }
     }


32
Inversion of Control –

     Service Locator
     http://www.martinfowler.com/articles/injection.html



     // UNITY Example
     internal static class Program
     {
       private static UnityContainer unityContainer;
       private static SingleContactManagerForm singleContactManagerForm;

         private static void InitializeMainForm()
         {
           singleContactManagerForm =
           unityContainer.Resolve<SingleContactManagerForm>();
         }
     }


33
Inversion of Control
                         Service Locator vs Dependency Injection


 • Service Locator allows to request explicitly the needed instance/type/service

 • Every user of a service has a dependency to the Service Locator
      • Potential issue if the component need to be provided to 3rd parties.
      • Favorable for closed platforms as the Service Locator allow more control

 • Testing is easier with Dependency Injection than a Service Locator if Service
 provided is not easily substituted

 • In general Service Locator is only the less compelling choice if the code is
 mainly used out of the control of the writer




34
     http://www.martinfowler.com/articles/injection.html#ServiceLocatorVsDependencyInjection
Dependency Injection Container & more
     • Typically support all types of Inversion of Control mechanisms
        • Constructor Injection
        • Property (Setter) Injection
        • Interface Injection
        • Service Locator

     •.NET based DI-Container
        • Unity
        • Castle Windsor
        • StructureMap
                                        Related Technology:
        • Spring.NET                    • Managed Extensibility Framework (MEF)
        • Autofac                       • Windows Communication Foundation (WCF)
        • Puzzle.Nfactory
        • Ninject
        • PicoContainer.NET
        • and more
35
The “Must Read”-Book
     by Mark Seemann




36    http://www.manning.com/seemann/
Summary
     Improving Reusability and Maintainability through:

     • Simplification and Specialization
       (KISS, SoC, SRP)

     •Decoupling
       (Interfaces, CoP, DIP or SOA)

     • Avoiding Code Blow (DRY, YAGNI)

     • Testability (all of them!)


                                           Lego (trademarked in capitals as LEGO)
37
Q&A
                                         Feedback & Comments:
                                                       theo@csharp-lighthouse.com
                                                   www.csharp-lighthouse.com


Graphic by Nathan Sawaya courtesy of brickartist.com
References Part
     http://www.manning.com/seemann/
     http://en.wikipedia.org/wiki/Keep_it_simple_stupid
     http://picocontainer.org/patterns.html
     http://en.wikipedia.org/wiki/Separation_of_concerns
     http://en.wikipedia.org/wiki/Don't_repeat_yourself
     http://en.wikipedia.org/wiki/You_ain't_gonna_need_it
     http://en.wikipedia.org/wiki/Component-oriented_programming
     http://en.wikipedia.org/wiki/Service-oriented_architecture
     http://www.martinfowler.com/articles/injection.html
     http://www.codeproject.com/KB/aspnet/IOCDI.aspx
     http://msdn.microsoft.com/en-us/magazine/cc163739.aspx
     http://msdn.microsoft.com/en-us/library/ff650320.aspx
     http://msdn.microsoft.com/en-us/library/aa973811.aspx
     http://msdn.microsoft.com/en-us/library/ff647976.aspx
     http://msdn.microsoft.com/en-us/library/cc707845.aspx
     http://msdn.microsoft.com/en-us/library/bb833022.aspx
     http://dotnetslackers.com/articles/net/A-First-Look-at-Unity-2-0.aspx
     http://unity.codeplex.com/
     http://www.idesign.net/idesign/DesktopDefault.aspx?tabindex=5&tabid=11
39

More Related Content

What's hot (20)

PPTX
Clean Code - Design Patterns and Best Practices at Silicon Valley Code Camp
Theo Jungeblut
 
PDF
Clean Code 2
Fredrik Wendt
 
PDF
SOLID design principles applied in Java
Bucharest Java User Group
 
PDF
Binding android piece by piece
Bucharest Java User Group
 
PPT
SOLID Design Principles
Andreas Enbohm
 
PDF
Exploring lambdas and invokedynamic for embedded systems
InfinIT - Innovationsnetværket for it
 
PDF
Clean code & design patterns
Pascal Larocque
 
PDF
Object-oriented design principles
Xiaoyan Chen
 
PPTX
Cut your Dependencies - Dependency Injection at Silicon Valley Code Camp
Theo Jungeblut
 
PPT
OO design principles & heuristics
Dhaval Shah
 
PPT
principles of object oriented class design
Neetu Mishra
 
PPTX
SOLID principles
Jonathan Holloway
 
PPTX
Cut your Dependencies with Dependency Injection for East Bay.NET User Group
Theo Jungeblut
 
PPTX
Design Patterns: From STUPID to SOLID code
Paulo Gandra de Sousa
 
PPT
SOLID principles
Dmitry Kandalov
 
PDF
ReactJS for Programmers
David Rodenas
 
PDF
Matteo Vaccari - TDD per Android | Codemotion Milan 2015
Codemotion
 
PDF
Design patterns illustrated-2015-03
Herman Peeren
 
PDF
Extreme Interview Questions
Ehtisham Ali
 
PPTX
Advanced Object-Oriented/SOLID Principles
Jon Kruger
 
Clean Code - Design Patterns and Best Practices at Silicon Valley Code Camp
Theo Jungeblut
 
Clean Code 2
Fredrik Wendt
 
SOLID design principles applied in Java
Bucharest Java User Group
 
Binding android piece by piece
Bucharest Java User Group
 
SOLID Design Principles
Andreas Enbohm
 
Exploring lambdas and invokedynamic for embedded systems
InfinIT - Innovationsnetværket for it
 
Clean code & design patterns
Pascal Larocque
 
Object-oriented design principles
Xiaoyan Chen
 
Cut your Dependencies - Dependency Injection at Silicon Valley Code Camp
Theo Jungeblut
 
OO design principles & heuristics
Dhaval Shah
 
principles of object oriented class design
Neetu Mishra
 
SOLID principles
Jonathan Holloway
 
Cut your Dependencies with Dependency Injection for East Bay.NET User Group
Theo Jungeblut
 
Design Patterns: From STUPID to SOLID code
Paulo Gandra de Sousa
 
SOLID principles
Dmitry Kandalov
 
ReactJS for Programmers
David Rodenas
 
Matteo Vaccari - TDD per Android | Codemotion Milan 2015
Codemotion
 
Design patterns illustrated-2015-03
Herman Peeren
 
Extreme Interview Questions
Ehtisham Ali
 
Advanced Object-Oriented/SOLID Principles
Jon Kruger
 

Similar to Lego For Engineers - Dependency Injection for LIDNUG (2011-06-03) (20)

PPTX
Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01...
Theo Jungeblut
 
PPTX
Clean Code I - Design Patterns and Best Practices at SoCal Code Camp San Dieg...
Theo Jungeblut
 
PPTX
Clean Code I - Best Practices
Theo Jungeblut
 
PPTX
Clean Code Part i - Design Patterns and Best Practices -
Theo Jungeblut
 
PPTX
2009 Dotnet Information Day: More effective c#
Daniel Fisher
 
PDF
TWINS: OOP and FP - Warburton
Codemotion
 
PPTX
Use of Apache Commons and Utilities
Pramod Kumar
 
PPTX
The software design principles
Aman Kesarwani
 
PDF
Kotlin - The Swiss army knife of programming languages - Visma Mobile Meet-up...
Tudor Dragan
 
PDF
Java Day-3
People Strategists
 
PPTX
Spring Boot
Jiayun Zhou
 
PPT
designpatterns_blair_upe.ppt
banti43
 
PPTX
SOLID & IoC Principles
Pavlo Hodysh
 
PPTX
Cut your Dependencies with Dependency Injection - .NET User Group Osnabrueck
Theo Jungeblut
 
PDF
Parsley & Flex
prideconan
 
PDF
From Android NDK To AOSP
Min-Yih Hsu
 
PDF
Real-time Computer Vision With Ruby - OSCON 2008
Jan Wedekind
 
PPSX
TechkTalk #12 Grokking: Writing code that writes code – Nguyen Luong
Grokking VN
 
PPSX
Writing code that writes code - Nguyen Luong
Vu Huy
 
KEY
Gae icc fall2011
Juan Gomez
 
Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01...
Theo Jungeblut
 
Clean Code I - Design Patterns and Best Practices at SoCal Code Camp San Dieg...
Theo Jungeblut
 
Clean Code I - Best Practices
Theo Jungeblut
 
Clean Code Part i - Design Patterns and Best Practices -
Theo Jungeblut
 
2009 Dotnet Information Day: More effective c#
Daniel Fisher
 
TWINS: OOP and FP - Warburton
Codemotion
 
Use of Apache Commons and Utilities
Pramod Kumar
 
The software design principles
Aman Kesarwani
 
Kotlin - The Swiss army knife of programming languages - Visma Mobile Meet-up...
Tudor Dragan
 
Java Day-3
People Strategists
 
Spring Boot
Jiayun Zhou
 
designpatterns_blair_upe.ppt
banti43
 
SOLID & IoC Principles
Pavlo Hodysh
 
Cut your Dependencies with Dependency Injection - .NET User Group Osnabrueck
Theo Jungeblut
 
Parsley & Flex
prideconan
 
From Android NDK To AOSP
Min-Yih Hsu
 
Real-time Computer Vision With Ruby - OSCON 2008
Jan Wedekind
 
TechkTalk #12 Grokking: Writing code that writes code – Nguyen Luong
Grokking VN
 
Writing code that writes code - Nguyen Luong
Vu Huy
 
Gae icc fall2011
Juan Gomez
 
Ad

More from Theo Jungeblut (7)

PPTX
Accidentally Manager – A Survival Guide for First-Time Engineering Managers
Theo Jungeblut
 
PPTX
Clean Code III - Software Craftsmanship
Theo Jungeblut
 
PPTX
Cut your Dependencies with - Dependency Injection for South Bay.NET User Grou...
Theo Jungeblut
 
PPTX
Debugging,Troubleshooting & Monitoring Distributed Web & Cloud Applications a...
Theo Jungeblut
 
PPTX
Debugging,Troubleshooting & Monitoring Distributed Web & Cloud Applications a...
Theo Jungeblut
 
PPTX
Clean Code III - Software Craftsmanship at SoCal Code Camp San Diego (07/27/2...
Theo Jungeblut
 
PPTX
Clean Code II - Dependency Injection at SoCal Code Camp San Diego (07/27/2013)
Theo Jungeblut
 
Accidentally Manager – A Survival Guide for First-Time Engineering Managers
Theo Jungeblut
 
Clean Code III - Software Craftsmanship
Theo Jungeblut
 
Cut your Dependencies with - Dependency Injection for South Bay.NET User Grou...
Theo Jungeblut
 
Debugging,Troubleshooting & Monitoring Distributed Web & Cloud Applications a...
Theo Jungeblut
 
Debugging,Troubleshooting & Monitoring Distributed Web & Cloud Applications a...
Theo Jungeblut
 
Clean Code III - Software Craftsmanship at SoCal Code Camp San Diego (07/27/2...
Theo Jungeblut
 
Clean Code II - Dependency Injection at SoCal Code Camp San Diego (07/27/2013)
Theo Jungeblut
 
Ad

Recently uploaded (20)

PDF
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
PDF
SFWelly Summer 25 Release Highlights July 2025
Anna Loughnan Colquhoun
 
PPTX
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
PPT
Interview paper part 3, It is based on Interview Prep
SoumyadeepGhosh39
 
PPTX
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
PDF
SWEBOK Guide and Software Services Engineering Education
Hironori Washizaki
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PDF
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PDF
NewMind AI - Journal 100 Insights After The 100th Issue
NewMind AI
 
PDF
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
PDF
Windsurf Meetup Ottawa 2025-07-12 - Planning Mode at Reliza.pdf
Pavel Shukhman
 
PDF
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
PDF
CIFDAQ Weekly Market Wrap for 11th July 2025
CIFDAQ
 
PPTX
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
PDF
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
PDF
Log-Based Anomaly Detection: Enhancing System Reliability with Machine Learning
Mohammed BEKKOUCHE
 
PDF
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
PDF
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
PDF
July Patch Tuesday
Ivanti
 
PDF
Fl Studio 24.2.2 Build 4597 Crack for Windows Free Download 2025
faizk77g
 
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
SFWelly Summer 25 Release Highlights July 2025
Anna Loughnan Colquhoun
 
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
Interview paper part 3, It is based on Interview Prep
SoumyadeepGhosh39
 
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
SWEBOK Guide and Software Services Engineering Education
Hironori Washizaki
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
NewMind AI - Journal 100 Insights After The 100th Issue
NewMind AI
 
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
Windsurf Meetup Ottawa 2025-07-12 - Planning Mode at Reliza.pdf
Pavel Shukhman
 
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
CIFDAQ Weekly Market Wrap for 11th July 2025
CIFDAQ
 
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
Log-Based Anomaly Detection: Enhancing System Reliability with Machine Learning
Mohammed BEKKOUCHE
 
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
July Patch Tuesday
Ivanti
 
Fl Studio 24.2.2 Build 4597 Crack for Windows Free Download 2025
faizk77g
 

Lego For Engineers - Dependency Injection for LIDNUG (2011-06-03)

  • 1. Lego for Engineers How to build Reusable and Maintainable Applications in C# Lego (trademarked in capitals as LEGO) Theo Jungeblut 06/03/2011
  • 2. Theo Jungeblut • Senior Software Developer at Omnicell Inc. in Mountain View • Has been designing and implementing .NET based applications , components and frameworks for 8 years • Previously worked in factory automation with focus on component based software and framework development for 3 ½ years [email protected] • Degree in Software Engineering and Network Communications www.csharp-lightouse.com
  • 3. Overview • Why Lego for Software Engineers? • Design Patterns, Principles and Best Practices • Dependency Injection Container & more • The “Must Read”-Book • Summary • Q&A • References 3
  • 4. Why Lego for Software Engineers? Lego (trademarked in capitals as LEGO) is a line of construction toys manufactured by the Lego Group http://upload.wikimedia.org/wikipedia/commons/7/75/Lego_technic_gears.jpg 4
  • 5. Design Patterns, Principals & Best Practices • Keep it simple stupid (KISS) • Separation of Concerns (SoC) • Single Responsibility Principle (SRP) • Component Oriented Programming (CoP) • Interface / Contract • Don’t Repeat Yourself (DRY) • Dependency Inversion Principal (DIP) • Inversion of Control (IoC) • Constructor Injection • Setter Injection • Interface Injection • Service Locator 5
  • 6. Keep it simple, stupid (KISS)
  • 7. KISS-Principle – “Keep It Simple Stupid” by Kelly Johnson http://blogs.smarter.com/blogs/Lego%20Brick.jpg 7
  • 8. The Power of Simplicity Graphic by Nathan Sawaya courtesy of brickartist.com Graphic by Nathan Sawaya courtesy of brickartist.com 8 http://www.geekalerts.com/lego-iphone/
  • 9. Graphic by Nathan Sawaya courtesy of brickartist.com
  • 10. Separation of Concerns (SoC) Single Responsibility Principle (SRP)
  • 12. Component / Service http://www.technicopedia.com/8865.html
  • 13. Class, Struct, Enum etc. http://technicbricks.blogspot.com/2009/06/tbs-techpoll-12-results-2009-1st.html
  • 14. Separation of Concerns (SoC) probably by Edsger W. Dijkstra in 1974 • “In computer science, separation of concerns (SoC) is the process of separating a computer program into distinct features that overlap in functionality as little as possible. •A concern is any piece of interest or focus in a program. Typically, concerns are synonymous with features or behaviors. “ http://en.wikipedia.org/wiki/Separati on_of_Concerns 14
  • 15. Single Responsibility Principle (SRP) by Robert C Martin “Every object should have a single responsibility, and that responsibility should be entirely encapsulated by the class.” http://en.wikipedia.org/wiki/Single_responsibility_principle public class Logger : ILogger { public Logger(ILoggingSink loggingSink) {} public void Log(string message) {} } http://www.ericalbrecht.com 15
  • 16. Component-Oriented Programming (CoP)
  • 17. Different Ways of doing Something Similar http://www.ericalbrecht.com http://www.julianaheng.com/transformers-rotf-bumblebee- and-sam-action-figures/ http://www.ericalbrecht.com 17
  • 18. Why Reusable Components Rock http://www.ericalbrecht.com/technic/8020/8020all.jpg 18
  • 19. Interfaces / Contracts • Decouple Usage and Implementation through introduction of a contract • Allows to replace implementation without changing the consumer public interface ILogger public class Logger : ILogger { { void Log(string message); public Logger(ILoggingSink loggingSink) } {} public void Log(string message) {} } 19
  • 21. Don’t repeat yourself (DRY) by Andy Hunt and Dave Thomas in their book “The Pragmatic Programmer” // Code Copy and Paste Method // DRY Method public Class Person public Class Person { { public string FirstName { get; set;} public string FirstName { get; set;} public string LastName { get; set;} public string LastName { get; set;} public Person(Person person) public Person(Person person) { { this.FirstName = string.IsNullOrEmpty(person.FirstName) this.FirstName = person.FirstName.CloneSecured(); ? string.Empty : (string) person.FirstName.Clone(); this.LastName = person.LastName.CloneSecured(); } this.LastName = string.IsNullOrEmpty(person.LastName) ? string.Empty : (string) person.LastName.Clone(); public object Clone() } { return new Person(this); public object Clone() } { } return new Person(this); } } public static class StringExtension { public static string CloneSecured(this string original) { return string.IsNullOrEmpty(original) ? string.Empty : (string)original.Clone(); } } 21
  • 23. Dependency Inversion Principle (DIP) by Robert C. Martin • “High-level modules should not depend on low-level modules. Both should depend on abstractions. • Abstractions should not depend upon details. Details should depend upon abstractions.” http://en.wikipedia.org/wiki/Dependency_inversion_principle 23
  • 24. S Single Responsibility Principle O Open/Closed Principle L Liskov Substitution Principle I Interface Segregation Principle D Dependency Inversion Principle Robert C Martin: http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod
  • 26. Inversion of Control (IoC) by Martin Fowler 1994 Logger logger = new Logger(); 26
  • 27. Inversion of Control (IoC) by Martin Fowler 1994 Logger logger = new Logger(); 27
  • 28. The “Must Read”-Book by Mark Seemann Dependency Injection is a set of software design principles and patterns that enable us to develop loosely coupled code. 28 http://www.manning.com/seemann/
  • 29. Inversion of Control – Constructor Injection http://www.martinfowler.com/articles/injection.html public class ContactManager : IContactManager { public ContactManager(ILogger logger, IContactPersistence contactPersistence) { this.logger = logger; if (logger == null) { throw new ArgumentNullException("logger"); } … } } 29
  • 30. Inversion of Control – Setter (Property) Injection http://www.martinfowler.com/articles/injection.html // UNITY Example public class ContactManager : IContactManager { [Dependency] public IContactPersistence ContactPersistence { get { return this.contactPersistence; } set { this.contactPersistence = value; } } } 30
  • 31. Inversion of Control (IoC) – Interface Injection http://www.martinfowler.com/articles/injection.html In this methodology we implement an interface from the IOC framework. IOC framework will use the interface method to inject the object in the main class. You can see in figure ‘Interface based DI’ we have implemented an interface ‘IAddressDI’ which has a ‘setAddress’ method which sets the address object. This interface is then implemented in the customer class. External client / containers can then use the ‘setAddress’ method to inject the address object in the customer object. http://www.codeproject.com/KB/aspnet/IOCDI/InterfacebasedDI.JPG http://www.codeproject.com/KB/aspnet/IOCDI.aspx 31
  • 32. Inversion of Control – Service Locator http://www.martinfowler.com/articles/injection.html // UNITY Example internal static class Program { private static UnityContainer unityContainer; private static SingleContactManagerForm singleContactManagerForm; private static void InitializeMainForm() { singleContactManagerForm = unityContainer.Resolve<SingleContactManagerForm>(); } } 32
  • 33. Inversion of Control – Service Locator http://www.martinfowler.com/articles/injection.html // UNITY Example internal static class Program { private static UnityContainer unityContainer; private static SingleContactManagerForm singleContactManagerForm; private static void InitializeMainForm() { singleContactManagerForm = unityContainer.Resolve<SingleContactManagerForm>(); } } 33
  • 34. Inversion of Control Service Locator vs Dependency Injection • Service Locator allows to request explicitly the needed instance/type/service • Every user of a service has a dependency to the Service Locator • Potential issue if the component need to be provided to 3rd parties. • Favorable for closed platforms as the Service Locator allow more control • Testing is easier with Dependency Injection than a Service Locator if Service provided is not easily substituted • In general Service Locator is only the less compelling choice if the code is mainly used out of the control of the writer 34 http://www.martinfowler.com/articles/injection.html#ServiceLocatorVsDependencyInjection
  • 35. Dependency Injection Container & more • Typically support all types of Inversion of Control mechanisms • Constructor Injection • Property (Setter) Injection • Interface Injection • Service Locator •.NET based DI-Container • Unity • Castle Windsor • StructureMap Related Technology: • Spring.NET • Managed Extensibility Framework (MEF) • Autofac • Windows Communication Foundation (WCF) • Puzzle.Nfactory • Ninject • PicoContainer.NET • and more 35
  • 36. The “Must Read”-Book by Mark Seemann 36 http://www.manning.com/seemann/
  • 37. Summary Improving Reusability and Maintainability through: • Simplification and Specialization (KISS, SoC, SRP) •Decoupling (Interfaces, CoP, DIP or SOA) • Avoiding Code Blow (DRY, YAGNI) • Testability (all of them!) Lego (trademarked in capitals as LEGO) 37
  • 38. Q&A Feedback & Comments: [email protected] www.csharp-lighthouse.com Graphic by Nathan Sawaya courtesy of brickartist.com
  • 39. References Part http://www.manning.com/seemann/ http://en.wikipedia.org/wiki/Keep_it_simple_stupid http://picocontainer.org/patterns.html http://en.wikipedia.org/wiki/Separation_of_concerns http://en.wikipedia.org/wiki/Don't_repeat_yourself http://en.wikipedia.org/wiki/You_ain't_gonna_need_it http://en.wikipedia.org/wiki/Component-oriented_programming http://en.wikipedia.org/wiki/Service-oriented_architecture http://www.martinfowler.com/articles/injection.html http://www.codeproject.com/KB/aspnet/IOCDI.aspx http://msdn.microsoft.com/en-us/magazine/cc163739.aspx http://msdn.microsoft.com/en-us/library/ff650320.aspx http://msdn.microsoft.com/en-us/library/aa973811.aspx http://msdn.microsoft.com/en-us/library/ff647976.aspx http://msdn.microsoft.com/en-us/library/cc707845.aspx http://msdn.microsoft.com/en-us/library/bb833022.aspx http://dotnetslackers.com/articles/net/A-First-Look-at-Unity-2-0.aspx http://unity.codeplex.com/ http://www.idesign.net/idesign/DesktopDefault.aspx?tabindex=5&tabid=11 39