SlideShare a Scribd company logo
Dependency Injection:
Why is it awesome
and why should I care?
Nolan Erck
About Me
● Consultant (southofshasta.com)
● Software Development, On-site Training, Design
● Using ColdFusion since 1999 (4.x)
● Other stuff: C++, Java, jQuery, PHP, .NET, HTML5,
Android, you get the idea...
● Manager of SacInteractive
● Reformed Video Game Developer (Grim Fandango,
SimPark, StarWars Rogue Squadron, etc).
● Music Junkie
Today's Agenda
● What is Dependency Injection?
● When/why do I want it in my projects?
● Intro to Bean Management
● Intro to Aspect Oriented Programming (AOP)
● Intro to Inversion of Control (IOC)
● Other info
● Questions
Prerequisites
● Have some experience building classes and
objects.
● Don't need to be an expert.
● Don't need to have used an MVC framework.
● DI frameworks can be totally separate.
● And 1 more thing you need to know...
Prerequisites
● Know that Object Oriented Programming is
hard.
● And some of it is confusing at first.
● And that's NORMAL.
Dependency Injection
What is Dependency Injection?
● A “design pattern”
● $6 phrase for “a way to organize your classes so
they work together in a flexible way”.
● Like a for() loop, if(), array[]
– Reusable technique, based around objects.
● There are lots of design patterns:
– Dependency Injection is 1 design pattern
– Inversion of Control (IOC), Aspect Oriented Programming
(AOP) and Bean Management are all “variations on that
theme”.
– There are lots of others too.
What is Dependency Injection?
● It's not platform specific.
● Available for ColdFusion, Java, .NET,
JavaScript, etc.
● For today's preso:
● Using mostly pseudocode.
● Some keywords will change.
● All the concepts work the same across libraries and
languages.
Why / When Do I Want
D/I In My Projects?
● Short answer:
When you have lots of classes that talk to each
other, want to keep code organized, and make it
easy to swap different “types” of objects in/out of
your application.
Why / When Do I Want
D/I In My Projects?
● Short answer:
When you have lots of classes that talk to each
other, want to keep code organized, and make it
easy to swap different “types” of objects in/out of
your application.
● Longer answer:
That's what the rest of the slides are for...
Does this mean...
● I have to rebuild my entire app to use D/I?
● No. But you might get more benefits if you make a
few changes to legacy code along the way.
● I have to learn a new way to code all my classes?
● No. You can leave everything as-is.
– The nice thing about D/I is you can use it or not
use it. If you want to write code the “old way” in
part of your app, there's nothing stopping you
from doing so. It will all still work as-is.
● Neat huh? Let's learn a bit more, shall we?
Bean Management
What's a Bean?
A “thing” your D/I framework knows about.
class User{ … }
class DateUtils {…}
In your DI framework:
bean id=”myUser” class=”User”
bean id=”myDateUtils” class=”DateUtils”
(Exact syntax varies between DI libraries.)
Bean Management
class A {
public class A() {...}
}
class B{
public class B(A a)
{ … }
}
class C {
public class C(B b)
{ … }
}
class D{
public class D(C c)
{...}
}
So if I -JUST- want a D object made...
Bean Management
I have to do all this...
A a = new A();
B b = new B( a );
C c = new C( b );
D d = new D( c );
4 lines of code. The first 3 are “boilerplate” to create the
variables I need to make a D.
Multiply that out over all the objects in your app...
= a LOT of boilerplate code!
Another way to say it:
“D depends on A, B and C being made first”.
Bean Management
With a D/I library that does Bean Management, you'd write
something like this instead...
D d = ColdSpring.getBean( “D” );
4 lines of code just became 1. And no more boilerplate stuff!
You tell your D/I framework “I need a D. Go find out what D
depends on, make those as needed, and hand me back D when
you're done.”
(“ColdSpring” is a placeholder here for any D/I framework. They
all work about the same.)
Bean Management
● Quasi Real World Example.
● Mailing department wide messages.
● Mail Service CFC
● Needs a Department CFC to know which
Department is being emailed.
● Department needs a Department DAO for it's SQL
stuff.
● And a SecurityLogin CFC to make sure it's
validated/logged in/whatever.
Bean Management
● Old Way
mySecLogin = CreateObject( “component”, “SecurityLogin”);
myDeptDAO = CreateObject(“component”,“DepartmentDAO”);
dept = CreateObject( “component”, “Department” );
dept.init( mySecLogin, myDeptDAO );
mailSvc = CreateObject( “component”, “MailService” );
mailSvc.init( dept );
mailSvc.sendEmail();
Bean Management
● New Way
ColdSpring.getBean( “mailService” ).sendMail();
Bean Management
● New Way
ColdSpring.getBean( “mailService” ).sendMail();
Yes, 1 line of code.
Yes, it is THAT easy.
(I'm over simplifying a little.)
Bean Management
● So how does the D/I framework “know” that I need an A, B and
C to make a D object?
● Varies a little from framework to framework.
● Configuration based: XML file that “describes” the relationship
between the objects.
● (ColdSpring, Spring)
– Nice for, say, white-box testing w/ hands-on QA team.
● Convention based:
● Works automatically by which folders you store classes in,
and how the classes are named.
● DI/1, WireBox
● Just pick one and try it out, they all do the same core “things”.
Inversion of Control (IOC)
Inversion of Control (IOC)
● Fancy term for “flipping” some code around
from the “traditional” or “normal” way you'd build
objects.
● Instead of building an Employee object, then a
Department object, then putting the Employee
IN the Department.
● You say “get me a fully populated/constructed
Department”.
● Magic happens, automatically building the
Employee object for you.
Inversion Of Control (IOC)
class RockGroup
{
private String groupName;
public String getGroupName(){
return groupName;
}
public void setGroupName(String name) {
this.groupName = name;
}
}
No Constructor.
“groupName” is private.
So we have to call the
setter to initialize the
variable with something.
Inversion Of Control (IOC)
With regular code, we'd do this:
String myBandName = “depeche mode”;
RockGroup rg = new RockGroup();
rg.setGroupName( myBandName );
That works but...
Every time I want to provide a different default
value, I have to change code, and recompile.
Inversion Of Control (IOC)
What if we could provide that default value in a
“config file”, outside of code?
And whenever we create a RockGroup object, it
automatically gets a default value for
groupName passed in at that instant?
You can!
Inversion Of Control (IOC)
Using a D/I framework, you can have a “config” that notes default
values for your classes:
<class name=”RockGroup”>
<property name=”groupName” value=”Depeche Mode”/>
</class>
rg = ColdSpring.getBean( “RockGroup” )
...any time I make a RockGroup, it will automatically initialize the
“groupName” variable to the default value I provided. No extra lines of
code. And changing this default is now done in a config file. No
recompiling code to change it!
Inversion Of Control (IOC)
What about classes inside of other classes?
● AKA “Composition”, the “has a” relationship.
● Kind of the same thing...
Inversion Of Control (IOC)
class RockGroup{
private String groupName;
public String getGroupName()
{ … }
public void
setGroupName( String name )
{…}
private Musician singer;
public Musician getSinger()
{ … }
public void setSinger( Musician
m ) {…}
}
class Musician{
private String name;
private int yearsSober;
private int age;
public String getName()
{ return name; }
public void setName(String n)
{ this.name = n; }
public int getYearsSober() { … }
public void setYearsSober(int y)
{ … }
public void setAge( int a ){...}
public int getAge(){ return age; }
}
Inversion of Control (IOC)
With straight code...
Musician m = new Musician();
m.name = “David Lee Roth”;
m.age = 50;
m.yearsSober = 10;
RockGroup rg = new RockGroup();
rg.setGroupName( “Van Halen” );
rg.setSinger( m );
Inversion of Control (IOC)
With D/I...
RockGroup rg = Spring.getBean(“RockGroup”);
Inversion Of Control (IOC)
The Musician class has a String property, that
gets initialized just like the String property in
RockGroup. Ditto for the “int” properties, etc:
Spring.getBean( “Musician” );
– “name” will always be whatever is in my config for the
Musician class.
<class name=”Musician”>
<property name=”name” value=”David Lee Roth” />
<property name=”age” value=”50” />
<property name=”yearsSober” value=”10” />
</class>
Inversion Of Control (IOC)
You can also refer to other classes in the config, and “inject” them
into each other, just like we “injected” the String and int into
Musician:
<class name=”Singer” id=”mySingerBean”>
<property name=”name” value=”David Lee Roth” />
<property name=”yearsSober” value=”10” />
<property name=”age” value=”50” />
</class>
<class name=”RockGroup”>
<property name=”groupName” value=”Van Halen” />
<property name=”singer” ref=”mySingerBean” />
</class>
Inversion Of Control (IOC)
So now when I do this...
rg = DIFramework.getBean( “RockGroup” );
● rg will be fully constructed...
● It will have a “groupName” property set to “Van
Halen”.
● It will have a “singer” property set to “David Lee
Roth”, he'll be 50 years old and 10 years sober.
● 1 line of code, no boilerplate stuff.
● If I want to change those defaults, I don't have to
recompile, I just change a “config” setting.
Inversion Of Control (IOC)
Swapping out one type of Musician for another doesn't require
recompiling code, just change a config:
<class name=”Singer” id=”singerBean2”>
<property name=”name” value=”Sammy Hagar” />
<property name=”yearsSober” value=”15” />
<property name=”age” value=”51” />
</class>
<class name=”RockGroup”>
<property name=”groupName” value=”Van Halen” />
<property name=”singer” ref=”singerBean2” />
</class>
Inversion Of Control (IOC)
Swapping out one type of Musician for another doesn't require
recompiling code, just change a config:
<class name=”Singer” id=”singerBean2”>
<property name=”name” value=”Sammy Hagar” />
<property name=”yearsSober” value=”15” />
<property name=”age” value=”51” />
</class>
<class name=”RockGroup”>
<property name=”groupName” value=”Van Halen” />
<property name=”singer” ref=”singerBean2” />
</class>
Off topic: discussing if Dave is better/worse than Sammy.
Aspect Oriented
Programming (AOP)
Aspect Oriented Programming (AOP)
● AKA “Cross Cutting”.
● Change the “aspect” of how a function is called.
● Say I have a foo() method.
● Any time foo() is called...
● Automatically...
– Call code before or after foo()
– Wrap some sort of code “around” foo()
● e.g. try/catch blocks
● It no longer just does “foo()”.
● Also does whatever you define as an aspect of
calling foo().
Aspect Oriented Programming (AOP)
● Example: drawSalesReport()
● In your AOP library:
<func name=”drawSalesReport”>
<aspect before run=”checkIfLoggedIn” />
<aspect after run=”saveToDebugLogFile” />
</func>
Aspect Oriented Programming (AOP)
● In your code, it USED to look like this:
checkIfLoggedIn();
drawSalesReport( UserID=555,
dtCreated='1/1/2015' );
SaveToDebugLogFile();
What happens NOW is...
DIFramework.runWithAdvice( “drawSalesReport”,
{ UserID=555,
dtCreated='1/1/2015' } );
and that does all 3 things, in correct order.
Aspect Oriented Programming (AOP)
● But wait, there's more!
● Can also wrap “blocks” of code around each
other, not just function calls before/after each
other.
● e.g. try/catch blocks.
Aspect Oriented Programming (AOP)
Say I have a query like so:
<cfquery name=”qryGetUsers”>
SELECT * FROM Users
</cfquery>
In Production, I want that wrapped in a
try/catch, but in QA/Development, I don't. (So I
can see the debug output, etc.)
Aspect Oriented Programming (AOP)
I'd have to set some kind of “flag”:
<cfif isProduction>
<cftry>
<cfquery name=”qryGetUsers”>
SELECT * FROM Users
</cfquery>
<cfcatch> <cflog … /> </cfcatch>
</cftry>
<cfelse>
<cfquery name=”qryGetUsers”>
SELECT * FROM Users
</cfquery>
</cfif>
Duplicate Code!
Remember the DRY rule!
Aspect Oriented Programming (AOP)
● Instead of calling a getUsers() method directly:
● GetUsers();
● In your AOP library:
<advice around functionName=”getUsersWithAdvice”>
<method name=”getUsers” />
</advice>
Aspect Oriented Programming (AOP)
<advice around functionName=”getUsersWithAdvice”>
<method name=”getUsers” />
</advice>
function getUsersWithAdvice( funcToRun ) {
if( isProduction )
{
try{
#funcToRun#();
}
catch{ … }
}else{
#funcToRun#();
}
Aspect Oriented Programming (AOP)
In your code:
DIFramework.runWithAdvice( “getUsers” );
● The if() statement is still there but our
duplicate SQL is gone!
So what's the catch?
● This is maybe a new way of thinking about how
you build your classes.
● Takes some getting used to.
● A little extra “set up” work.
● Naming conventions, or typing some XML.
● Debugging errors can be slower at first.
...but it does make your code more flexible.
Remember...
● You don't have to do this all at once.
● Start with (for example) Bean Management.
● Add other bits as you get comfortable.
● It's not like an MVC framework where the
WHOLE app has to be considered.
● Find 1 tiny spot in your app, add a little DI there.
● Add more in increments, go as you learn.
Also Remember...
● OO Programming is hard.
● It's different than Procedural code.
● Takes getting used to.
● That's NORMAL.
● Nobody learns all this stuff instantly.
● It takes some time.
● (But it is the way most languages are going these
days.)
Other Resources
● Book: Spring In Action (Java)
● Book: Head First Design Patterns
● Framework/1, DI/1 and AOP/1
● ColdSpring documentation
● Good examples, not overwhelming.
● SpringByExample.org
● Java code, but explanation of the general concepts
is pretty good.
● I'm guessing the ColdBox docs are also great
for this too. Those guys like to write!
Questions? Comments?
Ways to reach me...
Email: nolan@southofshasta.com
Twitter: @southofshasta
Blog: southofshasta.com
Thanks!

More Related Content

What's hot

Js: master prototypes
Js: master prototypesJs: master prototypes
Js: master prototypes
Barak Drechsler
 
Ch2
Ch2Ch2
Wintellect - Devscovery - Enterprise JavaScript Development 1 of 2
Wintellect - Devscovery - Enterprise JavaScript Development 1 of 2Wintellect - Devscovery - Enterprise JavaScript Development 1 of 2
Wintellect - Devscovery - Enterprise JavaScript Development 1 of 2
Jeremy Likness
 
Excuse me, sir, do you have a moment to talk about tests in Kotlin
Excuse me, sir, do you have a moment to talk about tests in KotlinExcuse me, sir, do you have a moment to talk about tests in Kotlin
Excuse me, sir, do you have a moment to talk about tests in Kotlin
leonsabr
 
Object Oriented Programming with Java
Object Oriented Programming with JavaObject Oriented Programming with Java
Object Oriented Programming with Java
Jussi Pohjolainen
 
Clean code & design patterns
Clean code & design patternsClean code & design patterns
Clean code & design patterns
Pascal Larocque
 
Little Did He Know ...
Little Did He Know ...Little Did He Know ...
Little Did He Know ...
Burt Beckwith
 
Design patterns illustrated-2015-03
Design patterns illustrated-2015-03Design patterns illustrated-2015-03
Design patterns illustrated-2015-03
Herman Peeren
 
From code to pattern, part one
From code to pattern, part oneFrom code to pattern, part one
From code to pattern, part one
Bingfeng Zhao
 
Introduction to OOP(in java) BY Govind Singh
Introduction to OOP(in java)  BY Govind SinghIntroduction to OOP(in java)  BY Govind Singh
Introduction to OOP(in java) BY Govind Singh
prabhat engineering college
 
Oops in PHP
Oops in PHPOops in PHP
Oops in PHP
Mindfire Solutions
 
Metaprogramming With Ruby
Metaprogramming With RubyMetaprogramming With Ruby
Metaprogramming With Ruby
Farooq Ali
 
Advanced JavaScript
Advanced JavaScriptAdvanced JavaScript
Advanced JavaScript
Fu Cheng
 
Grails Worst Practices
Grails Worst PracticesGrails Worst Practices
Grails Worst Practices
Burt Beckwith
 
Object.__class__.__dict__ - python object model and friends - with examples
Object.__class__.__dict__ - python object model and friends - with examplesObject.__class__.__dict__ - python object model and friends - with examples
Object.__class__.__dict__ - python object model and friends - with examples
Robert Lujo
 
04 Java Language And OOP Part IV
04 Java Language And OOP Part IV04 Java Language And OOP Part IV
04 Java Language And OOP Part IV
Hari Christian
 
Android App code starter
Android App code starterAndroid App code starter
Android App code starter
FatimaYousif11
 
Java inheritance
Java inheritanceJava inheritance
Java inheritance
Hamid Ghorbani
 
Design patterns illustrated 010PHP
Design patterns illustrated 010PHPDesign patterns illustrated 010PHP
Design patterns illustrated 010PHP
Herman Peeren
 
Oops in java
Oops in javaOops in java

What's hot (20)

Js: master prototypes
Js: master prototypesJs: master prototypes
Js: master prototypes
 
Ch2
Ch2Ch2
Ch2
 
Wintellect - Devscovery - Enterprise JavaScript Development 1 of 2
Wintellect - Devscovery - Enterprise JavaScript Development 1 of 2Wintellect - Devscovery - Enterprise JavaScript Development 1 of 2
Wintellect - Devscovery - Enterprise JavaScript Development 1 of 2
 
Excuse me, sir, do you have a moment to talk about tests in Kotlin
Excuse me, sir, do you have a moment to talk about tests in KotlinExcuse me, sir, do you have a moment to talk about tests in Kotlin
Excuse me, sir, do you have a moment to talk about tests in Kotlin
 
Object Oriented Programming with Java
Object Oriented Programming with JavaObject Oriented Programming with Java
Object Oriented Programming with Java
 
Clean code & design patterns
Clean code & design patternsClean code & design patterns
Clean code & design patterns
 
Little Did He Know ...
Little Did He Know ...Little Did He Know ...
Little Did He Know ...
 
Design patterns illustrated-2015-03
Design patterns illustrated-2015-03Design patterns illustrated-2015-03
Design patterns illustrated-2015-03
 
From code to pattern, part one
From code to pattern, part oneFrom code to pattern, part one
From code to pattern, part one
 
Introduction to OOP(in java) BY Govind Singh
Introduction to OOP(in java)  BY Govind SinghIntroduction to OOP(in java)  BY Govind Singh
Introduction to OOP(in java) BY Govind Singh
 
Oops in PHP
Oops in PHPOops in PHP
Oops in PHP
 
Metaprogramming With Ruby
Metaprogramming With RubyMetaprogramming With Ruby
Metaprogramming With Ruby
 
Advanced JavaScript
Advanced JavaScriptAdvanced JavaScript
Advanced JavaScript
 
Grails Worst Practices
Grails Worst PracticesGrails Worst Practices
Grails Worst Practices
 
Object.__class__.__dict__ - python object model and friends - with examples
Object.__class__.__dict__ - python object model and friends - with examplesObject.__class__.__dict__ - python object model and friends - with examples
Object.__class__.__dict__ - python object model and friends - with examples
 
04 Java Language And OOP Part IV
04 Java Language And OOP Part IV04 Java Language And OOP Part IV
04 Java Language And OOP Part IV
 
Android App code starter
Android App code starterAndroid App code starter
Android App code starter
 
Java inheritance
Java inheritanceJava inheritance
Java inheritance
 
Design patterns illustrated 010PHP
Design patterns illustrated 010PHPDesign patterns illustrated 010PHP
Design patterns illustrated 010PHP
 
Oops in java
Oops in javaOops in java
Oops in java
 

Viewers also liked

Node without servers aws-lambda
Node without servers aws-lambdaNode without servers aws-lambda
Node without servers aws-lambda
devObjective
 
Revista copy#1
Revista copy#1Revista copy#1
Revista copy#1
CristianFelipeCubillos
 
PRORURAL / LEADER 2007-2013
PRORURAL / LEADER 2007-2013PRORURAL / LEADER 2007-2013
PRORURAL / LEADER 2007-2013
ArleneGoulart
 
Indicadores financieros
Indicadores financierosIndicadores financieros
Indicadores financieros
maferlinap
 
Silabo ntic´s
Silabo ntic´sSilabo ntic´s
Silabo ntic´s
iramos72
 
Music Legends .People who died too soon.
Music Legends .People who died too soon.Music Legends .People who died too soon.
Music Legends .People who died too soon.
Jahforia_Taylor
 
Presentation1
Presentation1Presentation1
Presentation1
hiimbatman
 
Unemployement
UnemployementUnemployement
Unemployement
sasidharkv
 
La Franquicia como Estrategia de la Empresa
La Franquicia como Estrategia de la EmpresaLa Franquicia como Estrategia de la Empresa
La Franquicia como Estrategia de la Empresa
pattyrihe
 
реченица проста и слож обнављање
реченица проста и слож обнављањереченица проста и слож обнављање
реченица проста и слож обнављање
milijana1
 
Building software products in a weekend
Building software products in a weekendBuilding software products in a weekend
Building software products in a weekend
devObjective
 
T19 chlorinated solvents-bienkowski
T19 chlorinated solvents-bienkowskiT19 chlorinated solvents-bienkowski
T19 chlorinated solvents-bienkowski
APWA Florida Chapter 2013 Annual Meeting and Trade Show
 
Adaptive Development in a Creative World
Adaptive Development in a Creative WorldAdaptive Development in a Creative World
Adaptive Development in a Creative World
devObjective
 
Covering Your Board Bases Boulder Chamber Orchestra
Covering Your Board Bases Boulder Chamber OrchestraCovering Your Board Bases Boulder Chamber Orchestra
Covering Your Board Bases Boulder Chamber Orchestra
Emily Davis Consulting
 
Lecciones de sabiduría gonzalo gallo
Lecciones de sabiduría gonzalo galloLecciones de sabiduría gonzalo gallo
Lecciones de sabiduría gonzalo gallo
alerozco
 
Dropbox
DropboxDropbox
Dropboxchamo9
 
Cristaisdeagua
CristaisdeaguaCristaisdeagua
Cristaisdeagua
Ariana Martins
 
Re-Imagining Customer Feedback To Drive Action
Re-Imagining Customer Feedback To Drive ActionRe-Imagining Customer Feedback To Drive Action
Re-Imagining Customer Feedback To Drive Action
G3 Communications
 
Presentacion de liderazgo
Presentacion de liderazgoPresentacion de liderazgo
Presentacion de liderazgo
Pepe Vallejo
 
Curso actualización 1st day 28 may 2012
Curso actualización 1st day 28 may 2012Curso actualización 1st day 28 may 2012
Curso actualización 1st day 28 may 2012
lidiaguillenprades
 

Viewers also liked (20)

Node without servers aws-lambda
Node without servers aws-lambdaNode without servers aws-lambda
Node without servers aws-lambda
 
Revista copy#1
Revista copy#1Revista copy#1
Revista copy#1
 
PRORURAL / LEADER 2007-2013
PRORURAL / LEADER 2007-2013PRORURAL / LEADER 2007-2013
PRORURAL / LEADER 2007-2013
 
Indicadores financieros
Indicadores financierosIndicadores financieros
Indicadores financieros
 
Silabo ntic´s
Silabo ntic´sSilabo ntic´s
Silabo ntic´s
 
Music Legends .People who died too soon.
Music Legends .People who died too soon.Music Legends .People who died too soon.
Music Legends .People who died too soon.
 
Presentation1
Presentation1Presentation1
Presentation1
 
Unemployement
UnemployementUnemployement
Unemployement
 
La Franquicia como Estrategia de la Empresa
La Franquicia como Estrategia de la EmpresaLa Franquicia como Estrategia de la Empresa
La Franquicia como Estrategia de la Empresa
 
реченица проста и слож обнављање
реченица проста и слож обнављањереченица проста и слож обнављање
реченица проста и слож обнављање
 
Building software products in a weekend
Building software products in a weekendBuilding software products in a weekend
Building software products in a weekend
 
T19 chlorinated solvents-bienkowski
T19 chlorinated solvents-bienkowskiT19 chlorinated solvents-bienkowski
T19 chlorinated solvents-bienkowski
 
Adaptive Development in a Creative World
Adaptive Development in a Creative WorldAdaptive Development in a Creative World
Adaptive Development in a Creative World
 
Covering Your Board Bases Boulder Chamber Orchestra
Covering Your Board Bases Boulder Chamber OrchestraCovering Your Board Bases Boulder Chamber Orchestra
Covering Your Board Bases Boulder Chamber Orchestra
 
Lecciones de sabiduría gonzalo gallo
Lecciones de sabiduría gonzalo galloLecciones de sabiduría gonzalo gallo
Lecciones de sabiduría gonzalo gallo
 
Dropbox
DropboxDropbox
Dropbox
 
Cristaisdeagua
CristaisdeaguaCristaisdeagua
Cristaisdeagua
 
Re-Imagining Customer Feedback To Drive Action
Re-Imagining Customer Feedback To Drive ActionRe-Imagining Customer Feedback To Drive Action
Re-Imagining Customer Feedback To Drive Action
 
Presentacion de liderazgo
Presentacion de liderazgoPresentacion de liderazgo
Presentacion de liderazgo
 
Curso actualización 1st day 28 may 2012
Curso actualización 1st day 28 may 2012Curso actualización 1st day 28 may 2012
Curso actualización 1st day 28 may 2012
 

Similar to Dependency Injection: Why is awesome and why should I care?

Dependency injectionpreso
Dependency injectionpresoDependency injectionpreso
Dependency injectionpreso
ColdFusionConference
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency Injection
ColdFusionConference
 
Reviewing OOP Design patterns
Reviewing OOP Design patternsReviewing OOP Design patterns
Reviewing OOP Design patterns
Olivier Bacs
 
HTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyHTML5 for the Silverlight Guy
HTML5 for the Silverlight Guy
David Padbury
 
Intro to OOP
Intro to OOPIntro to OOP
Intro to OOP
Gant Laborde
 
Oop c sharp_part_1
Oop c sharp_part_1Oop c sharp_part_1
Oop c sharp_part_1
shivaksn
 
CPP13 - Object Orientation
CPP13 - Object OrientationCPP13 - Object Orientation
CPP13 - Object Orientation
Michael Heron
 
All of Javascript
All of JavascriptAll of Javascript
All of Javascript
Togakangaroo
 
Apache Calcite (a tutorial given at BOSS '21)
Apache Calcite (a tutorial given at BOSS '21)Apache Calcite (a tutorial given at BOSS '21)
Apache Calcite (a tutorial given at BOSS '21)
Julian Hyde
 
Node.js Patterns for Discerning Developers
Node.js Patterns for Discerning DevelopersNode.js Patterns for Discerning Developers
Node.js Patterns for Discerning Developers
cacois
 
Design Without Types
Design Without TypesDesign Without Types
Design Without Types
Alexandru Bolboaca
 
01 - Intro To Using Java
01 - Intro To Using Java01 - Intro To Using Java
01 - Intro To Using Java
thewhiteafrican
 
Mongo learning series
Mongo learning series Mongo learning series
Mongo learning series
Prashanth Panduranga
 
The Ring programming language version 1.5.4 book - Part 15 of 185
The Ring programming language version 1.5.4 book - Part 15 of 185The Ring programming language version 1.5.4 book - Part 15 of 185
The Ring programming language version 1.5.4 book - Part 15 of 185
Mahmoud Samir Fayed
 
Lotusphere 2007 AD507 Leveraging the Power of Object Oriented Programming in ...
Lotusphere 2007 AD507 Leveraging the Power of Object Oriented Programming in ...Lotusphere 2007 AD507 Leveraging the Power of Object Oriented Programming in ...
Lotusphere 2007 AD507 Leveraging the Power of Object Oriented Programming in ...
Bill Buchan
 
Smoothing Your Java with DSLs
Smoothing Your Java with DSLsSmoothing Your Java with DSLs
Smoothing Your Java with DSLs
intelliyole
 
The Basic Concept Of IOC
The Basic Concept Of IOCThe Basic Concept Of IOC
The Basic Concept Of IOC
Carl Lu
 
Solid OOPS
Solid OOPSSolid OOPS
Solid OOPS
Toshish Jawale
 
OOP, API Design and MVP
OOP, API Design and MVPOOP, API Design and MVP
OOP, API Design and MVP
Harshith Keni
 
DevSecCon SG 2018 Fabian Presentation Slides
DevSecCon SG 2018 Fabian Presentation SlidesDevSecCon SG 2018 Fabian Presentation Slides
DevSecCon SG 2018 Fabian Presentation Slides
Fab L
 

Similar to Dependency Injection: Why is awesome and why should I care? (20)

Dependency injectionpreso
Dependency injectionpresoDependency injectionpreso
Dependency injectionpreso
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency Injection
 
Reviewing OOP Design patterns
Reviewing OOP Design patternsReviewing OOP Design patterns
Reviewing OOP Design patterns
 
HTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyHTML5 for the Silverlight Guy
HTML5 for the Silverlight Guy
 
Intro to OOP
Intro to OOPIntro to OOP
Intro to OOP
 
Oop c sharp_part_1
Oop c sharp_part_1Oop c sharp_part_1
Oop c sharp_part_1
 
CPP13 - Object Orientation
CPP13 - Object OrientationCPP13 - Object Orientation
CPP13 - Object Orientation
 
All of Javascript
All of JavascriptAll of Javascript
All of Javascript
 
Apache Calcite (a tutorial given at BOSS '21)
Apache Calcite (a tutorial given at BOSS '21)Apache Calcite (a tutorial given at BOSS '21)
Apache Calcite (a tutorial given at BOSS '21)
 
Node.js Patterns for Discerning Developers
Node.js Patterns for Discerning DevelopersNode.js Patterns for Discerning Developers
Node.js Patterns for Discerning Developers
 
Design Without Types
Design Without TypesDesign Without Types
Design Without Types
 
01 - Intro To Using Java
01 - Intro To Using Java01 - Intro To Using Java
01 - Intro To Using Java
 
Mongo learning series
Mongo learning series Mongo learning series
Mongo learning series
 
The Ring programming language version 1.5.4 book - Part 15 of 185
The Ring programming language version 1.5.4 book - Part 15 of 185The Ring programming language version 1.5.4 book - Part 15 of 185
The Ring programming language version 1.5.4 book - Part 15 of 185
 
Lotusphere 2007 AD507 Leveraging the Power of Object Oriented Programming in ...
Lotusphere 2007 AD507 Leveraging the Power of Object Oriented Programming in ...Lotusphere 2007 AD507 Leveraging the Power of Object Oriented Programming in ...
Lotusphere 2007 AD507 Leveraging the Power of Object Oriented Programming in ...
 
Smoothing Your Java with DSLs
Smoothing Your Java with DSLsSmoothing Your Java with DSLs
Smoothing Your Java with DSLs
 
The Basic Concept Of IOC
The Basic Concept Of IOCThe Basic Concept Of IOC
The Basic Concept Of IOC
 
Solid OOPS
Solid OOPSSolid OOPS
Solid OOPS
 
OOP, API Design and MVP
OOP, API Design and MVPOOP, API Design and MVP
OOP, API Design and MVP
 
DevSecCon SG 2018 Fabian Presentation Slides
DevSecCon SG 2018 Fabian Presentation SlidesDevSecCon SG 2018 Fabian Presentation Slides
DevSecCon SG 2018 Fabian Presentation Slides
 

More from devObjective

Lets git together
Lets git togetherLets git together
Lets git together
devObjective
 
Raspberry Pi a la CFML
Raspberry Pi a la CFMLRaspberry Pi a la CFML
Raspberry Pi a la CFML
devObjective
 
Command box
Command boxCommand box
Command box
devObjective
 
Effective version control
Effective version controlEffective version control
Effective version control
devObjective
 
Front end-modernization
Front end-modernizationFront end-modernization
Front end-modernization
devObjective
 
Using type script to build better apps
Using type script to build better appsUsing type script to build better apps
Using type script to build better apps
devObjective
 
Csp and http headers
Csp and http headersCsp and http headers
Csp and http headers
devObjective
 
Who owns Software Security
Who owns Software SecurityWho owns Software Security
Who owns Software Security
devObjective
 
Naked and afraid Offline mobile
Naked and afraid Offline mobileNaked and afraid Offline mobile
Naked and afraid Offline mobile
devObjective
 
Web hackingtools 2015
Web hackingtools 2015Web hackingtools 2015
Web hackingtools 2015
devObjective
 
I am-designer
I am-designerI am-designer
I am-designer
devObjective
 
Garbage First and You!
Garbage First and You!Garbage First and You!
Garbage First and You!
devObjective
 
Fusion Reactor
Fusion ReactorFusion Reactor
Fusion Reactor
devObjective
 
Paying off emotional debt
Paying off emotional debtPaying off emotional debt
Paying off emotional debt
devObjective
 
My SQL Skills Killed the Server
My SQL Skills Killed the ServerMy SQL Skills Killed the Server
My SQL Skills Killed the Server
devObjective
 
Authentication Control
Authentication ControlAuthentication Control
Authentication Control
devObjective
 
Multiply like rabbits with rabbit mq
Multiply like rabbits with rabbit mqMultiply like rabbits with rabbit mq
Multiply like rabbits with rabbit mq
devObjective
 
Preso slidedeck
Preso slidedeckPreso slidedeck
Preso slidedeck
devObjective
 
Intro to TDD & BDD
Intro to TDD & BDDIntro to TDD & BDD
Intro to TDD & BDD
devObjective
 
Rethink Async with RXJS
Rethink Async with RXJSRethink Async with RXJS
Rethink Async with RXJS
devObjective
 

More from devObjective (20)

Lets git together
Lets git togetherLets git together
Lets git together
 
Raspberry Pi a la CFML
Raspberry Pi a la CFMLRaspberry Pi a la CFML
Raspberry Pi a la CFML
 
Command box
Command boxCommand box
Command box
 
Effective version control
Effective version controlEffective version control
Effective version control
 
Front end-modernization
Front end-modernizationFront end-modernization
Front end-modernization
 
Using type script to build better apps
Using type script to build better appsUsing type script to build better apps
Using type script to build better apps
 
Csp and http headers
Csp and http headersCsp and http headers
Csp and http headers
 
Who owns Software Security
Who owns Software SecurityWho owns Software Security
Who owns Software Security
 
Naked and afraid Offline mobile
Naked and afraid Offline mobileNaked and afraid Offline mobile
Naked and afraid Offline mobile
 
Web hackingtools 2015
Web hackingtools 2015Web hackingtools 2015
Web hackingtools 2015
 
I am-designer
I am-designerI am-designer
I am-designer
 
Garbage First and You!
Garbage First and You!Garbage First and You!
Garbage First and You!
 
Fusion Reactor
Fusion ReactorFusion Reactor
Fusion Reactor
 
Paying off emotional debt
Paying off emotional debtPaying off emotional debt
Paying off emotional debt
 
My SQL Skills Killed the Server
My SQL Skills Killed the ServerMy SQL Skills Killed the Server
My SQL Skills Killed the Server
 
Authentication Control
Authentication ControlAuthentication Control
Authentication Control
 
Multiply like rabbits with rabbit mq
Multiply like rabbits with rabbit mqMultiply like rabbits with rabbit mq
Multiply like rabbits with rabbit mq
 
Preso slidedeck
Preso slidedeckPreso slidedeck
Preso slidedeck
 
Intro to TDD & BDD
Intro to TDD & BDDIntro to TDD & BDD
Intro to TDD & BDD
 
Rethink Async with RXJS
Rethink Async with RXJSRethink Async with RXJS
Rethink Async with RXJS
 

Recently uploaded

Northern Engraving | Nameplate Manufacturing Process - 2024
Northern Engraving | Nameplate Manufacturing Process - 2024Northern Engraving | Nameplate Manufacturing Process - 2024
Northern Engraving | Nameplate Manufacturing Process - 2024
Northern Engraving
 
Dandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity serverDandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity server
Antonios Katsarakis
 
Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |
AstuteBusiness
 
Generating privacy-protected synthetic data using Secludy and Milvus
Generating privacy-protected synthetic data using Secludy and MilvusGenerating privacy-protected synthetic data using Secludy and Milvus
Generating privacy-protected synthetic data using Secludy and Milvus
Zilliz
 
Digital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Digital Banking in the Cloud: How Citizens Bank Unlocked Their MainframeDigital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Digital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Precisely
 
“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...
“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...
“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...
Edge AI and Vision Alliance
 
Energy Efficient Video Encoding for Cloud and Edge Computing Instances
Energy Efficient Video Encoding for Cloud and Edge Computing InstancesEnergy Efficient Video Encoding for Cloud and Edge Computing Instances
Energy Efficient Video Encoding for Cloud and Edge Computing Instances
Alpen-Adria-Universität
 
The Microsoft 365 Migration Tutorial For Beginner.pptx
The Microsoft 365 Migration Tutorial For Beginner.pptxThe Microsoft 365 Migration Tutorial For Beginner.pptx
The Microsoft 365 Migration Tutorial For Beginner.pptx
operationspcvita
 
What is an RPA CoE? Session 1 – CoE Vision
What is an RPA CoE?  Session 1 – CoE VisionWhat is an RPA CoE?  Session 1 – CoE Vision
What is an RPA CoE? Session 1 – CoE Vision
DianaGray10
 
Driving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success StoryDriving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success Story
Safe Software
 
"Choosing proper type of scaling", Olena Syrota
"Choosing proper type of scaling", Olena Syrota"Choosing proper type of scaling", Olena Syrota
"Choosing proper type of scaling", Olena Syrota
Fwdays
 
Principle of conventional tomography-Bibash Shahi ppt..pptx
Principle of conventional tomography-Bibash Shahi ppt..pptxPrinciple of conventional tomography-Bibash Shahi ppt..pptx
Principle of conventional tomography-Bibash Shahi ppt..pptx
BibashShahi
 
Mutation Testing for Task-Oriented Chatbots
Mutation Testing for Task-Oriented ChatbotsMutation Testing for Task-Oriented Chatbots
Mutation Testing for Task-Oriented Chatbots
Pablo Gómez Abajo
 
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdfHow to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
Chart Kalyan
 
Introduction of Cybersecurity with OSS at Code Europe 2024
Introduction of Cybersecurity with OSS  at Code Europe 2024Introduction of Cybersecurity with OSS  at Code Europe 2024
Introduction of Cybersecurity with OSS at Code Europe 2024
Hiroshi SHIBATA
 
Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...
Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...
Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...
saastr
 
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
Edge AI and Vision Alliance
 
June Patch Tuesday
June Patch TuesdayJune Patch Tuesday
June Patch Tuesday
Ivanti
 
HCL Notes and Domino License Cost Reduction in the World of DLAU
HCL Notes and Domino License Cost Reduction in the World of DLAUHCL Notes and Domino License Cost Reduction in the World of DLAU
HCL Notes and Domino License Cost Reduction in the World of DLAU
panagenda
 
Leveraging the Graph for Clinical Trials and Standards
Leveraging the Graph for Clinical Trials and StandardsLeveraging the Graph for Clinical Trials and Standards
Leveraging the Graph for Clinical Trials and Standards
Neo4j
 

Recently uploaded (20)

Northern Engraving | Nameplate Manufacturing Process - 2024
Northern Engraving | Nameplate Manufacturing Process - 2024Northern Engraving | Nameplate Manufacturing Process - 2024
Northern Engraving | Nameplate Manufacturing Process - 2024
 
Dandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity serverDandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity server
 
Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |
 
Generating privacy-protected synthetic data using Secludy and Milvus
Generating privacy-protected synthetic data using Secludy and MilvusGenerating privacy-protected synthetic data using Secludy and Milvus
Generating privacy-protected synthetic data using Secludy and Milvus
 
Digital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Digital Banking in the Cloud: How Citizens Bank Unlocked Their MainframeDigital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Digital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
 
“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...
“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...
“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...
 
Energy Efficient Video Encoding for Cloud and Edge Computing Instances
Energy Efficient Video Encoding for Cloud and Edge Computing InstancesEnergy Efficient Video Encoding for Cloud and Edge Computing Instances
Energy Efficient Video Encoding for Cloud and Edge Computing Instances
 
The Microsoft 365 Migration Tutorial For Beginner.pptx
The Microsoft 365 Migration Tutorial For Beginner.pptxThe Microsoft 365 Migration Tutorial For Beginner.pptx
The Microsoft 365 Migration Tutorial For Beginner.pptx
 
What is an RPA CoE? Session 1 – CoE Vision
What is an RPA CoE?  Session 1 – CoE VisionWhat is an RPA CoE?  Session 1 – CoE Vision
What is an RPA CoE? Session 1 – CoE Vision
 
Driving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success StoryDriving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success Story
 
"Choosing proper type of scaling", Olena Syrota
"Choosing proper type of scaling", Olena Syrota"Choosing proper type of scaling", Olena Syrota
"Choosing proper type of scaling", Olena Syrota
 
Principle of conventional tomography-Bibash Shahi ppt..pptx
Principle of conventional tomography-Bibash Shahi ppt..pptxPrinciple of conventional tomography-Bibash Shahi ppt..pptx
Principle of conventional tomography-Bibash Shahi ppt..pptx
 
Mutation Testing for Task-Oriented Chatbots
Mutation Testing for Task-Oriented ChatbotsMutation Testing for Task-Oriented Chatbots
Mutation Testing for Task-Oriented Chatbots
 
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdfHow to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
 
Introduction of Cybersecurity with OSS at Code Europe 2024
Introduction of Cybersecurity with OSS  at Code Europe 2024Introduction of Cybersecurity with OSS  at Code Europe 2024
Introduction of Cybersecurity with OSS at Code Europe 2024
 
Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...
Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...
Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...
 
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
 
June Patch Tuesday
June Patch TuesdayJune Patch Tuesday
June Patch Tuesday
 
HCL Notes and Domino License Cost Reduction in the World of DLAU
HCL Notes and Domino License Cost Reduction in the World of DLAUHCL Notes and Domino License Cost Reduction in the World of DLAU
HCL Notes and Domino License Cost Reduction in the World of DLAU
 
Leveraging the Graph for Clinical Trials and Standards
Leveraging the Graph for Clinical Trials and StandardsLeveraging the Graph for Clinical Trials and Standards
Leveraging the Graph for Clinical Trials and Standards
 

Dependency Injection: Why is awesome and why should I care?

  • 1. Dependency Injection: Why is it awesome and why should I care? Nolan Erck
  • 2. About Me ● Consultant (southofshasta.com) ● Software Development, On-site Training, Design ● Using ColdFusion since 1999 (4.x) ● Other stuff: C++, Java, jQuery, PHP, .NET, HTML5, Android, you get the idea... ● Manager of SacInteractive ● Reformed Video Game Developer (Grim Fandango, SimPark, StarWars Rogue Squadron, etc). ● Music Junkie
  • 3.
  • 4.
  • 5.
  • 6. Today's Agenda ● What is Dependency Injection? ● When/why do I want it in my projects? ● Intro to Bean Management ● Intro to Aspect Oriented Programming (AOP) ● Intro to Inversion of Control (IOC) ● Other info ● Questions
  • 7. Prerequisites ● Have some experience building classes and objects. ● Don't need to be an expert. ● Don't need to have used an MVC framework. ● DI frameworks can be totally separate. ● And 1 more thing you need to know...
  • 8. Prerequisites ● Know that Object Oriented Programming is hard. ● And some of it is confusing at first. ● And that's NORMAL.
  • 10. What is Dependency Injection? ● A “design pattern” ● $6 phrase for “a way to organize your classes so they work together in a flexible way”. ● Like a for() loop, if(), array[] – Reusable technique, based around objects. ● There are lots of design patterns: – Dependency Injection is 1 design pattern – Inversion of Control (IOC), Aspect Oriented Programming (AOP) and Bean Management are all “variations on that theme”. – There are lots of others too.
  • 11. What is Dependency Injection? ● It's not platform specific. ● Available for ColdFusion, Java, .NET, JavaScript, etc. ● For today's preso: ● Using mostly pseudocode. ● Some keywords will change. ● All the concepts work the same across libraries and languages.
  • 12. Why / When Do I Want D/I In My Projects? ● Short answer: When you have lots of classes that talk to each other, want to keep code organized, and make it easy to swap different “types” of objects in/out of your application.
  • 13. Why / When Do I Want D/I In My Projects? ● Short answer: When you have lots of classes that talk to each other, want to keep code organized, and make it easy to swap different “types” of objects in/out of your application. ● Longer answer: That's what the rest of the slides are for...
  • 14. Does this mean... ● I have to rebuild my entire app to use D/I? ● No. But you might get more benefits if you make a few changes to legacy code along the way. ● I have to learn a new way to code all my classes? ● No. You can leave everything as-is. – The nice thing about D/I is you can use it or not use it. If you want to write code the “old way” in part of your app, there's nothing stopping you from doing so. It will all still work as-is. ● Neat huh? Let's learn a bit more, shall we?
  • 16. What's a Bean? A “thing” your D/I framework knows about. class User{ … } class DateUtils {…} In your DI framework: bean id=”myUser” class=”User” bean id=”myDateUtils” class=”DateUtils” (Exact syntax varies between DI libraries.)
  • 17. Bean Management class A { public class A() {...} } class B{ public class B(A a) { … } } class C { public class C(B b) { … } } class D{ public class D(C c) {...} } So if I -JUST- want a D object made...
  • 18. Bean Management I have to do all this... A a = new A(); B b = new B( a ); C c = new C( b ); D d = new D( c ); 4 lines of code. The first 3 are “boilerplate” to create the variables I need to make a D. Multiply that out over all the objects in your app... = a LOT of boilerplate code! Another way to say it: “D depends on A, B and C being made first”.
  • 19. Bean Management With a D/I library that does Bean Management, you'd write something like this instead... D d = ColdSpring.getBean( “D” ); 4 lines of code just became 1. And no more boilerplate stuff! You tell your D/I framework “I need a D. Go find out what D depends on, make those as needed, and hand me back D when you're done.” (“ColdSpring” is a placeholder here for any D/I framework. They all work about the same.)
  • 20. Bean Management ● Quasi Real World Example. ● Mailing department wide messages. ● Mail Service CFC ● Needs a Department CFC to know which Department is being emailed. ● Department needs a Department DAO for it's SQL stuff. ● And a SecurityLogin CFC to make sure it's validated/logged in/whatever.
  • 21. Bean Management ● Old Way mySecLogin = CreateObject( “component”, “SecurityLogin”); myDeptDAO = CreateObject(“component”,“DepartmentDAO”); dept = CreateObject( “component”, “Department” ); dept.init( mySecLogin, myDeptDAO ); mailSvc = CreateObject( “component”, “MailService” ); mailSvc.init( dept ); mailSvc.sendEmail();
  • 22. Bean Management ● New Way ColdSpring.getBean( “mailService” ).sendMail();
  • 23. Bean Management ● New Way ColdSpring.getBean( “mailService” ).sendMail(); Yes, 1 line of code. Yes, it is THAT easy. (I'm over simplifying a little.)
  • 24. Bean Management ● So how does the D/I framework “know” that I need an A, B and C to make a D object? ● Varies a little from framework to framework. ● Configuration based: XML file that “describes” the relationship between the objects. ● (ColdSpring, Spring) – Nice for, say, white-box testing w/ hands-on QA team. ● Convention based: ● Works automatically by which folders you store classes in, and how the classes are named. ● DI/1, WireBox ● Just pick one and try it out, they all do the same core “things”.
  • 26. Inversion of Control (IOC) ● Fancy term for “flipping” some code around from the “traditional” or “normal” way you'd build objects. ● Instead of building an Employee object, then a Department object, then putting the Employee IN the Department. ● You say “get me a fully populated/constructed Department”. ● Magic happens, automatically building the Employee object for you.
  • 27. Inversion Of Control (IOC) class RockGroup { private String groupName; public String getGroupName(){ return groupName; } public void setGroupName(String name) { this.groupName = name; } } No Constructor. “groupName” is private. So we have to call the setter to initialize the variable with something.
  • 28. Inversion Of Control (IOC) With regular code, we'd do this: String myBandName = “depeche mode”; RockGroup rg = new RockGroup(); rg.setGroupName( myBandName ); That works but... Every time I want to provide a different default value, I have to change code, and recompile.
  • 29. Inversion Of Control (IOC) What if we could provide that default value in a “config file”, outside of code? And whenever we create a RockGroup object, it automatically gets a default value for groupName passed in at that instant? You can!
  • 30. Inversion Of Control (IOC) Using a D/I framework, you can have a “config” that notes default values for your classes: <class name=”RockGroup”> <property name=”groupName” value=”Depeche Mode”/> </class> rg = ColdSpring.getBean( “RockGroup” ) ...any time I make a RockGroup, it will automatically initialize the “groupName” variable to the default value I provided. No extra lines of code. And changing this default is now done in a config file. No recompiling code to change it!
  • 31. Inversion Of Control (IOC) What about classes inside of other classes? ● AKA “Composition”, the “has a” relationship. ● Kind of the same thing...
  • 32. Inversion Of Control (IOC) class RockGroup{ private String groupName; public String getGroupName() { … } public void setGroupName( String name ) {…} private Musician singer; public Musician getSinger() { … } public void setSinger( Musician m ) {…} } class Musician{ private String name; private int yearsSober; private int age; public String getName() { return name; } public void setName(String n) { this.name = n; } public int getYearsSober() { … } public void setYearsSober(int y) { … } public void setAge( int a ){...} public int getAge(){ return age; } }
  • 33. Inversion of Control (IOC) With straight code... Musician m = new Musician(); m.name = “David Lee Roth”; m.age = 50; m.yearsSober = 10; RockGroup rg = new RockGroup(); rg.setGroupName( “Van Halen” ); rg.setSinger( m );
  • 34. Inversion of Control (IOC) With D/I... RockGroup rg = Spring.getBean(“RockGroup”);
  • 35. Inversion Of Control (IOC) The Musician class has a String property, that gets initialized just like the String property in RockGroup. Ditto for the “int” properties, etc: Spring.getBean( “Musician” ); – “name” will always be whatever is in my config for the Musician class. <class name=”Musician”> <property name=”name” value=”David Lee Roth” /> <property name=”age” value=”50” /> <property name=”yearsSober” value=”10” /> </class>
  • 36. Inversion Of Control (IOC) You can also refer to other classes in the config, and “inject” them into each other, just like we “injected” the String and int into Musician: <class name=”Singer” id=”mySingerBean”> <property name=”name” value=”David Lee Roth” /> <property name=”yearsSober” value=”10” /> <property name=”age” value=”50” /> </class> <class name=”RockGroup”> <property name=”groupName” value=”Van Halen” /> <property name=”singer” ref=”mySingerBean” /> </class>
  • 37. Inversion Of Control (IOC) So now when I do this... rg = DIFramework.getBean( “RockGroup” ); ● rg will be fully constructed... ● It will have a “groupName” property set to “Van Halen”. ● It will have a “singer” property set to “David Lee Roth”, he'll be 50 years old and 10 years sober. ● 1 line of code, no boilerplate stuff. ● If I want to change those defaults, I don't have to recompile, I just change a “config” setting.
  • 38. Inversion Of Control (IOC) Swapping out one type of Musician for another doesn't require recompiling code, just change a config: <class name=”Singer” id=”singerBean2”> <property name=”name” value=”Sammy Hagar” /> <property name=”yearsSober” value=”15” /> <property name=”age” value=”51” /> </class> <class name=”RockGroup”> <property name=”groupName” value=”Van Halen” /> <property name=”singer” ref=”singerBean2” /> </class>
  • 39. Inversion Of Control (IOC) Swapping out one type of Musician for another doesn't require recompiling code, just change a config: <class name=”Singer” id=”singerBean2”> <property name=”name” value=”Sammy Hagar” /> <property name=”yearsSober” value=”15” /> <property name=”age” value=”51” /> </class> <class name=”RockGroup”> <property name=”groupName” value=”Van Halen” /> <property name=”singer” ref=”singerBean2” /> </class> Off topic: discussing if Dave is better/worse than Sammy.
  • 41. Aspect Oriented Programming (AOP) ● AKA “Cross Cutting”. ● Change the “aspect” of how a function is called. ● Say I have a foo() method. ● Any time foo() is called... ● Automatically... – Call code before or after foo() – Wrap some sort of code “around” foo() ● e.g. try/catch blocks ● It no longer just does “foo()”. ● Also does whatever you define as an aspect of calling foo().
  • 42. Aspect Oriented Programming (AOP) ● Example: drawSalesReport() ● In your AOP library: <func name=”drawSalesReport”> <aspect before run=”checkIfLoggedIn” /> <aspect after run=”saveToDebugLogFile” /> </func>
  • 43. Aspect Oriented Programming (AOP) ● In your code, it USED to look like this: checkIfLoggedIn(); drawSalesReport( UserID=555, dtCreated='1/1/2015' ); SaveToDebugLogFile(); What happens NOW is... DIFramework.runWithAdvice( “drawSalesReport”, { UserID=555, dtCreated='1/1/2015' } ); and that does all 3 things, in correct order.
  • 44. Aspect Oriented Programming (AOP) ● But wait, there's more! ● Can also wrap “blocks” of code around each other, not just function calls before/after each other. ● e.g. try/catch blocks.
  • 45. Aspect Oriented Programming (AOP) Say I have a query like so: <cfquery name=”qryGetUsers”> SELECT * FROM Users </cfquery> In Production, I want that wrapped in a try/catch, but in QA/Development, I don't. (So I can see the debug output, etc.)
  • 46. Aspect Oriented Programming (AOP) I'd have to set some kind of “flag”: <cfif isProduction> <cftry> <cfquery name=”qryGetUsers”> SELECT * FROM Users </cfquery> <cfcatch> <cflog … /> </cfcatch> </cftry> <cfelse> <cfquery name=”qryGetUsers”> SELECT * FROM Users </cfquery> </cfif> Duplicate Code! Remember the DRY rule!
  • 47. Aspect Oriented Programming (AOP) ● Instead of calling a getUsers() method directly: ● GetUsers(); ● In your AOP library: <advice around functionName=”getUsersWithAdvice”> <method name=”getUsers” /> </advice>
  • 48. Aspect Oriented Programming (AOP) <advice around functionName=”getUsersWithAdvice”> <method name=”getUsers” /> </advice> function getUsersWithAdvice( funcToRun ) { if( isProduction ) { try{ #funcToRun#(); } catch{ … } }else{ #funcToRun#(); }
  • 49. Aspect Oriented Programming (AOP) In your code: DIFramework.runWithAdvice( “getUsers” ); ● The if() statement is still there but our duplicate SQL is gone!
  • 50. So what's the catch? ● This is maybe a new way of thinking about how you build your classes. ● Takes some getting used to. ● A little extra “set up” work. ● Naming conventions, or typing some XML. ● Debugging errors can be slower at first. ...but it does make your code more flexible.
  • 51. Remember... ● You don't have to do this all at once. ● Start with (for example) Bean Management. ● Add other bits as you get comfortable. ● It's not like an MVC framework where the WHOLE app has to be considered. ● Find 1 tiny spot in your app, add a little DI there. ● Add more in increments, go as you learn.
  • 52. Also Remember... ● OO Programming is hard. ● It's different than Procedural code. ● Takes getting used to. ● That's NORMAL. ● Nobody learns all this stuff instantly. ● It takes some time. ● (But it is the way most languages are going these days.)
  • 53. Other Resources ● Book: Spring In Action (Java) ● Book: Head First Design Patterns ● Framework/1, DI/1 and AOP/1 ● ColdSpring documentation ● Good examples, not overwhelming. ● SpringByExample.org ● Java code, but explanation of the general concepts is pretty good. ● I'm guessing the ColdBox docs are also great for this too. Those guys like to write!
  • 54. Questions? Comments? Ways to reach me... Email: nolan@southofshasta.com Twitter: @southofshasta Blog: southofshasta.com Thanks!