Inversion of control

820 views

Published on

Published in: Technology, Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
820
On SlideShare
0
From Embeds
0
Number of Embeds
11
Actions
Shares
0
Downloads
36
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Inversion of control

  1. 1. Inversion of Control Guy Nir January 2012
  2. 2. Agenda» The problem …» Inversion of Control» Benefits» Acceptance misbelieves
  3. 3. The problem …
  4. 4. The problem …public class MediaPlayer { private InputSource inputSource; private OutputDevice outputDevice; /** * Class constructor. */ public MediaPlayer() { inputSource = new FileInputSource(“c:/media/movie.avi”); outputDevice = new Screen(); } /** * Play media. */ public void play() { while (running) { // Read from inputSource and write to outputDevice. } }}
  5. 5. The problem …/** * Represents an input source. */public interface InputSource { // Business methods.}/** * Represents an output device. */public interface OutputDevice { // Business methods.}
  6. 6. The problem … Media Player << InputSource >> <<TargetDevice>> File (C:/….) Screen
  7. 7. The problem … Configuration file source = C:/media/file.avi Media Player << InputSource >> <<TargetDevice>> File (<?>) Screen
  8. 8. The problem … Configuration file source = C:/media/file.avi targetClass = example.ScreenTarget Media Player << InputSource >> <<TargetDevice>> File (<?>) <?>
  9. 9. The problem … Configuration fileDatabase Media Player X X source = C:/media/file.avi targetClass = example.ScreenTarget << InputSource >> <<TargetDevice>> File (<?>) <?>
  10. 10. The problem … Web service Configuration fileDatabase Media Player X X source = C:/media/file.avi targetClass = example.ScreenTarget << InputSource >> <<TargetDevice>> File (<?>) <?>
  11. 11. The problem … Web service Configuration fileDatabase Media Player X X source = C:/media/file.avi targetClass = example.ScreenTarget << InputSource >> << Target >> File (<?>) <?>
  12. 12. The problem …The problem with the design …Driven by behavior and not by functionality» Too strict, cannot be changed easily.» Hard to extend» Can barely be reused (if at all). [1]» Contradicts the ‘Open-Close principle’.[1] Open/closed principle by Bertrand Meyer
  13. 13. The problem … Media Player << InputSource >> << TargetDevice >> File (C:/….) Screen
  14. 14. The problem … << InputSource >> << TargetDevice >> Media Player
  15. 15. The problem …/** * Represents an input source. */public interface InputSource { // Business methods.}/** * Represents an output device. */public interface OutputDevice { // Business methods.}
  16. 16. The problem …public class MediaPlayer { private InputSource inputSource; private OutputDevice outputDevice; /** * Class constructor. */ public MediaPlayer() { inputSource = new FileInputSource(“c:/media/movie.avi”); outputDevice = new Screen(); } /** * Play media. */ public void play() { while (running) { // Read from inputSource and write to outputDevice. } }}
  17. 17. The problem …public class MediaPlayer { private InputSource inputSource; private OutputDevice outputDevice; public void setInputSource(InputSource inputSource) { this.inputSource = inputSource; } public void setOutputDevice(OutputDevice outputDevice) { this.outputDevice = outputDevice; } That’s our /** * Play media. business logic. */ public void play() { while (running) { // Read from inputSource and write to outputDevice. } }}
  18. 18. The problem …What we’ve accomplished…Design by functionality» Concentrates on functionality only  No lookup or creation of resources,  Separation of concerns.» We’re not limited to certain behavior  Source and Target can be anything,  Source and Target can be fetched from any where • Configuration file, Database, Web service, …
  19. 19. The problem …What we’ve accomplished… (continued)» We can inject any source / target !  E.g.: deployable on other platforms  Quickly inject mockups • Required for Agile development • Required for unit testing.
  20. 20. Inversion of Control
  21. 21. Inversion of Control» Is a conceptual abstraction in software development. [1]» Introduced by Martin Fowler’s in 1988.» Has 3 flavors,  Constructor injection (Dependency injection)  Setter injection (Dependency injection)  Dependency lookup.[1] Martin Fowler – Dependency injection
  22. 22. Inversion of ControlConstructor injection» Inject required resources via constructor.public class ConstructorInjection { private final DataSource dataSource; private final int timeout; /** * Class constructor. * * @param dataSource Database connection. * @param timeout Query timeout. */ public ConstructorInjection(DataSource dataSource, int timeout) { ... }}
  23. 23. Inversion of ControlConstructor injection» Pros:  Require user to specify all required resources.  Object is guaranteed to be injected with resources. • May cancel object if a resource is not fulfilled ( == null).public ConstructorInjection(DataSource dataSource, int timeout) { if (dataSource == null || timeout < 1) throw new IllegalArgumentException(); this.dataSource = dataSource; this.timeout = timeout;}
  24. 24. Inversion of ControlConstructor injection» Cons:  Sometimes tedious, • Must inject all resources or replace them with null.  Does not work well for a large number of dependencies.public BadConstructorInjection(DataSource dataSource, int timeout, Dialect dialect, String characterSet, double threashold, boolean eagerly, Formatter messageFormatter, ...) {}
  25. 25. Inversion of ControlSetter injection» Inject required resources via setXXX() method.  Using JavaBean™ mutators.public class SetterInjection { private DataSource dataSource; private int timeout; public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public void setTimeout(int timeout) { this.timeout = timeout; }}
  26. 26. Inversion of ControlSetter injection» Pros:  Inject as many dependencies as you want.  Each resource/value treated independently.» Cons:  Debatable issues …public void setTimeout(int timeout) { if (timeout < 0) { throw new IllegalArgumentException("Timeout cannot be negative."); } this.timeout = timeout;}
  27. 27. Inversion of ControlDependency lookup» Split resource locating between user and implementation.» Used much less than Constructor/Setter injections.public void lookupDS(JNDIContext context) throws NamingException { dataSource = (DataSource) context.lookup("env:/ds/oracleDataSource");}public void locateConfigFile(File rootDir) throws NamingException { // Search file system for configuration file, starting with ‘rootDir’.}
  28. 28. Benefits
  29. 29. Benefits» Full separation of concerns  Reusable components  Extendable components.» Design and development by functionality.  Each object/module is focused on its business logic.  Produce a better, small, more efficient code.» Agility.  Excellent for Agile practices (e.g.: XP, TDD, …).
  30. 30. Acceptance misbelievesOpen discussion about Inversion of Control
  31. 31. Acceptance misbelieves» Psychologically, hard to accept a new working methodology.» Tendency to think that IoC creates too much code.» It looks complex.
  32. 32. Q&A

×