SlideShare uma empresa Scribd logo
1 de 49
Baixar para ler offline
Dependency Injection:
Why is it awesome
and why should I care?
Nolan Erck
CF.Objective 2014
About Me
● Consultant (southofshasta.com)
● Software Development, Training, Design
● Using ColdFusion since 1999 (4.x)
● Other stuff: C++, Java, jQuery, PHP, .NET, etc.
● Manager of SacInteractive (formerly Sacramento CFUG)
● Reformed Video Game Developer.
● Stuff I've Done: CycleGear.com, CastImages.com,
Fusion Events Staffing, Grim Fandango, Star Wars
Rogue Squadron, SimPark, SimSafari.
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.
● Lunch!
Prerequisites
● Have some experience building classes and
objects.
● Don't need to be an expert at it.
● 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”.
● Sort of like a for() loop, if() statement or array[].
– Reusable technique, but 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.
● Book: “Head First Design Patterns”
What is Dependency Injection?
● It's not platform specific.
● D/I libraries available for ColdFusion, Java,
.NET, JavaScript, etc.
● For today's presentation, I'm using a mix of
pseudocode and condensed examples from
various languages.
● Some of the keywords will change, all the
concepts work the same across the 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 of which are just “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. Please go find out what
classes D depends on, make those as needed, and hand me
back the final D when you're done.”
(“ColdSpring” is kind of 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, for effect.)
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.
And 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” or 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)
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=”singerBean”>
<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=”singerBean” />
</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.
● I did that all with 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=#now()# );
SaveToDebugLogFile();
● What happens NOW is...
DIFramework.runWithAdvice( “drawSalesReport”,
{ UserID=555, dtCreated=#now()# } );
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#(); }
● 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.
● 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.erck@gmail.com
Twitter: @southofshasta
Blog: southofshasta.com
Thanks!

Mais conteĂșdo relacionado

Mais procurados

JavaScript Modules Done Right
JavaScript Modules Done RightJavaScript Modules Done Right
JavaScript Modules Done RightMariusz Nowak
 
Javascript Design Patterns
Javascript Design PatternsJavascript Design Patterns
Javascript Design PatternsSubramanyan Murali
 
From YUI3 to K2
From YUI3 to K2From YUI3 to K2
From YUI3 to K2kaven yan
 
Dear Kotliners - Java Developers are Humans too
Dear Kotliners - Java Developers are Humans tooDear Kotliners - Java Developers are Humans too
Dear Kotliners - Java Developers are Humans tooVivek Chanddru
 
Performance Optimization and JavaScript Best Practices
Performance Optimization and JavaScript Best PracticesPerformance Optimization and JavaScript Best Practices
Performance Optimization and JavaScript Best PracticesDoris Chen
 
JavaScript: DOM and jQuery
JavaScript: DOM and jQueryJavaScript: DOM and jQuery
JavaScript: DOM and jQuery維䜋 攐
 
Kotlin/Everywhere GDG Bhubaneswar 2019
Kotlin/Everywhere GDG Bhubaneswar 2019 Kotlin/Everywhere GDG Bhubaneswar 2019
Kotlin/Everywhere GDG Bhubaneswar 2019 Sriyank Siddhartha
 
The Theory Of The Dom
The Theory Of The DomThe Theory Of The Dom
The Theory Of The Domkaven yan
 
React JS and why it's awesome
React JS and why it's awesomeReact JS and why it's awesome
React JS and why it's awesomeAndrew Hull
 
JavaOne TS-5098 Groovy SwingBuilder
JavaOne TS-5098 Groovy SwingBuilderJavaOne TS-5098 Groovy SwingBuilder
JavaOne TS-5098 Groovy SwingBuilderAndres Almiray
 
Dependency Injections in Kotlin
Dependency Injections in KotlinDependency Injections in Kotlin
Dependency Injections in KotlinEatDog
 
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 2Jeremy Likness
 
Javascript and Jquery Best practices
Javascript and Jquery Best practicesJavascript and Jquery Best practices
Javascript and Jquery Best practicesSultan Khan
 
jQquerysummit - Large-scale JavaScript Application Architecture
jQquerysummit - Large-scale JavaScript Application Architecture jQquerysummit - Large-scale JavaScript Application Architecture
jQquerysummit - Large-scale JavaScript Application Architecture Jiby John
 
OOP, API Design and MVP
OOP, API Design and MVPOOP, API Design and MVP
OOP, API Design and MVPHarshith Keni
 
Visage Android Hands-on Lab (OSCON)
Visage Android Hands-on Lab (OSCON)Visage Android Hands-on Lab (OSCON)
Visage Android Hands-on Lab (OSCON)Stephen Chin
 

Mais procurados (20)

JavaScript Modules Done Right
JavaScript Modules Done RightJavaScript Modules Done Right
JavaScript Modules Done Right
 
Javascript Design Patterns
Javascript Design PatternsJavascript Design Patterns
Javascript Design Patterns
 
From YUI3 to K2
From YUI3 to K2From YUI3 to K2
From YUI3 to K2
 
Dear Kotliners - Java Developers are Humans too
Dear Kotliners - Java Developers are Humans tooDear Kotliners - Java Developers are Humans too
Dear Kotliners - Java Developers are Humans too
 
Performance Optimization and JavaScript Best Practices
Performance Optimization and JavaScript Best PracticesPerformance Optimization and JavaScript Best Practices
Performance Optimization and JavaScript Best Practices
 
JavaScript: DOM and jQuery
JavaScript: DOM and jQueryJavaScript: DOM and jQuery
JavaScript: DOM and jQuery
 
hibernate
hibernatehibernate
hibernate
 
Kotlin/Everywhere GDG Bhubaneswar 2019
Kotlin/Everywhere GDG Bhubaneswar 2019 Kotlin/Everywhere GDG Bhubaneswar 2019
Kotlin/Everywhere GDG Bhubaneswar 2019
 
The Theory Of The Dom
The Theory Of The DomThe Theory Of The Dom
The Theory Of The Dom
 
Patterns In-Javascript
Patterns In-JavascriptPatterns In-Javascript
Patterns In-Javascript
 
Solid OOPS
Solid OOPSSolid OOPS
Solid OOPS
 
React JS and why it's awesome
React JS and why it's awesomeReact JS and why it's awesome
React JS and why it's awesome
 
JavaOne TS-5098 Groovy SwingBuilder
JavaOne TS-5098 Groovy SwingBuilderJavaOne TS-5098 Groovy SwingBuilder
JavaOne TS-5098 Groovy SwingBuilder
 
Dependency Injections in Kotlin
Dependency Injections in KotlinDependency Injections in Kotlin
Dependency Injections in Kotlin
 
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
 
Javascript and Jquery Best practices
Javascript and Jquery Best practicesJavascript and Jquery Best practices
Javascript and Jquery Best practices
 
Javascript Design Patterns
Javascript Design PatternsJavascript Design Patterns
Javascript Design Patterns
 
jQquerysummit - Large-scale JavaScript Application Architecture
jQquerysummit - Large-scale JavaScript Application Architecture jQquerysummit - Large-scale JavaScript Application Architecture
jQquerysummit - Large-scale JavaScript Application Architecture
 
OOP, API Design and MVP
OOP, API Design and MVPOOP, API Design and MVP
OOP, API Design and MVP
 
Visage Android Hands-on Lab (OSCON)
Visage Android Hands-on Lab (OSCON)Visage Android Hands-on Lab (OSCON)
Visage Android Hands-on Lab (OSCON)
 

Destaque

Cfobjective fusion reactor sponsor talk
Cfobjective fusion reactor sponsor talkCfobjective fusion reactor sponsor talk
Cfobjective fusion reactor sponsor talkColdFusionConference
 
Emberjs building-ambitious-web-applications
Emberjs building-ambitious-web-applicationsEmberjs building-ambitious-web-applications
Emberjs building-ambitious-web-applicationsColdFusionConference
 
2015 in tothebox-introtddbdd
2015 in tothebox-introtddbdd2015 in tothebox-introtddbdd
2015 in tothebox-introtddbddColdFusionConference
 
Get Gulping with Javascript Task Runners
Get Gulping with Javascript Task RunnersGet Gulping with Javascript Task Runners
Get Gulping with Javascript Task RunnersColdFusionConference
 
ColdFusion in Transit action
ColdFusion in Transit actionColdFusion in Transit action
ColdFusion in Transit actionColdFusionConference
 
Setting up your multiengine environment Apache Railo ColdFusion
Setting up your multiengine environment Apache Railo ColdFusionSetting up your multiengine environment Apache Railo ColdFusion
Setting up your multiengine environment Apache Railo ColdFusionColdFusionConference
 
Everyones invited! Meet accesibility requirements with ColdFusion
Everyones invited! Meet accesibility requirements with ColdFusionEveryones invited! Meet accesibility requirements with ColdFusion
Everyones invited! Meet accesibility requirements with ColdFusionColdFusionConference
 
Building Software in a weekend
Building Software in a weekendBuilding Software in a weekend
Building Software in a weekendColdFusionConference
 
Load Balancing, Failover and Scalability with ColdFusion
Load Balancing, Failover and Scalability with ColdFusionLoad Balancing, Failover and Scalability with ColdFusion
Load Balancing, Failover and Scalability with ColdFusionColdFusionConference
 
Expand Your ColdFusion App Power with AWS
Expand Your ColdFusion App Power with AWSExpand Your ColdFusion App Power with AWS
Expand Your ColdFusion App Power with AWSColdFusionConference
 
Building better SQL Server Databases
Building better SQL Server DatabasesBuilding better SQL Server Databases
Building better SQL Server DatabasesColdFusionConference
 

Destaque (20)

Cfobjective fusion reactor sponsor talk
Cfobjective fusion reactor sponsor talkCfobjective fusion reactor sponsor talk
Cfobjective fusion reactor sponsor talk
 
Emberjs building-ambitious-web-applications
Emberjs building-ambitious-web-applicationsEmberjs building-ambitious-web-applications
Emberjs building-ambitious-web-applications
 
2015 in tothebox-introtddbdd
2015 in tothebox-introtddbdd2015 in tothebox-introtddbdd
2015 in tothebox-introtddbdd
 
Get Gulping with Javascript Task Runners
Get Gulping with Javascript Task RunnersGet Gulping with Javascript Task Runners
Get Gulping with Javascript Task Runners
 
ColdFusion in Transit action
ColdFusion in Transit actionColdFusion in Transit action
ColdFusion in Transit action
 
Java scriptconfusingbits
Java scriptconfusingbitsJava scriptconfusingbits
Java scriptconfusingbits
 
Setting up your multiengine environment Apache Railo ColdFusion
Setting up your multiengine environment Apache Railo ColdFusionSetting up your multiengine environment Apache Railo ColdFusion
Setting up your multiengine environment Apache Railo ColdFusion
 
Test box bdd
Test box bddTest box bdd
Test box bdd
 
Git sourcecontrolpreso
Git sourcecontrolpresoGit sourcecontrolpreso
Git sourcecontrolpreso
 
Sql killedserver
Sql killedserverSql killedserver
Sql killedserver
 
Everyones invited! Meet accesibility requirements with ColdFusion
Everyones invited! Meet accesibility requirements with ColdFusionEveryones invited! Meet accesibility requirements with ColdFusion
Everyones invited! Meet accesibility requirements with ColdFusion
 
Building Software in a weekend
Building Software in a weekendBuilding Software in a weekend
Building Software in a weekend
 
Load Balancing, Failover and Scalability with ColdFusion
Load Balancing, Failover and Scalability with ColdFusionLoad Balancing, Failover and Scalability with ColdFusion
Load Balancing, Failover and Scalability with ColdFusion
 
Command box
Command boxCommand box
Command box
 
Marketing for developers
Marketing for developersMarketing for developers
Marketing for developers
 
Expand Your ColdFusion App Power with AWS
Expand Your ColdFusion App Power with AWSExpand Your ColdFusion App Power with AWS
Expand Your ColdFusion App Power with AWS
 
Keep Applications Online
Keep Applications OnlineKeep Applications Online
Keep Applications Online
 
Cold fusion is racecar fast
Cold fusion is racecar fastCold fusion is racecar fast
Cold fusion is racecar fast
 
Building better SQL Server Databases
Building better SQL Server DatabasesBuilding better SQL Server Databases
Building better SQL Server Databases
 
Hidden gems in cf2016
Hidden gems in cf2016Hidden gems in cf2016
Hidden gems in cf2016
 

Semelhante a Dependency injectionpreso

Dependency Injection: Why is awesome and why should I care?
Dependency Injection: Why is awesome and why should I care?Dependency Injection: Why is awesome and why should I care?
Dependency Injection: Why is awesome and why should I care?devObjective
 
HTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyHTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyDavid Padbury
 
Dsug 05 02-15 - ScalDI - lightweight DI in Scala
Dsug 05 02-15 - ScalDI - lightweight DI in ScalaDsug 05 02-15 - ScalDI - lightweight DI in Scala
Dsug 05 02-15 - ScalDI - lightweight DI in ScalaUgo Matrangolo
 
DevSecCon Singapore 2018 - Remove developers’ shameful secrets or simply rem...
DevSecCon Singapore 2018 -  Remove developers’ shameful secrets or simply rem...DevSecCon Singapore 2018 -  Remove developers’ shameful secrets or simply rem...
DevSecCon Singapore 2018 - Remove developers’ shameful secrets or simply rem...DevSecCon
 
DevSecCon SG 2018 Fabian Presentation Slides
DevSecCon SG 2018 Fabian Presentation SlidesDevSecCon SG 2018 Fabian Presentation Slides
DevSecCon SG 2018 Fabian Presentation SlidesFab L
 
A gentle intro to the Django Framework
A gentle intro to the Django FrameworkA gentle intro to the Django Framework
A gentle intro to the Django FrameworkRicardo Soares
 
Adding a modern twist to legacy web applications
Adding a modern twist to legacy web applicationsAdding a modern twist to legacy web applications
Adding a modern twist to legacy web applicationsJeff Durta
 
Smoothing Your Java with DSLs
Smoothing Your Java with DSLsSmoothing Your Java with DSLs
Smoothing Your Java with DSLsintelliyole
 
Zend Framework And Doctrine
Zend Framework And DoctrineZend Framework And Doctrine
Zend Framework And Doctrineisaaczfoster
 
Java interview questions and answers
Java interview questions and answersJava interview questions and answers
Java interview questions and answersKrishnaov
 
New Ideas for Old Code - Greach
New Ideas for Old Code - GreachNew Ideas for Old Code - Greach
New Ideas for Old Code - GreachHamletDRC
 
Nikolai Boiko "NodeJS Refactoring: How to kill a Dragon and stay alive"
Nikolai Boiko "NodeJS Refactoring: How to kill a Dragon and stay alive"Nikolai Boiko "NodeJS Refactoring: How to kill a Dragon and stay alive"
Nikolai Boiko "NodeJS Refactoring: How to kill a Dragon and stay alive"NodeUkraine
 
gDayX 2013 - Advanced AngularJS - Nicolas Embleton
gDayX 2013 - Advanced AngularJS - Nicolas EmbletongDayX 2013 - Advanced AngularJS - Nicolas Embleton
gDayX 2013 - Advanced AngularJS - Nicolas EmbletonGeorge Nguyen
 
Robots in Swift
Robots in SwiftRobots in Swift
Robots in SwiftJanie Clayton
 
Intro to OOP
Intro to OOPIntro to OOP
Intro to OOPGant Laborde
 
The Basic Concept Of IOC
The Basic Concept Of IOCThe Basic Concept Of IOC
The Basic Concept Of IOCCarl Lu
 
The State of Front-end At CrowdTwist
The State of Front-end At CrowdTwistThe State of Front-end At CrowdTwist
The State of Front-end At CrowdTwistMark Fayngersh
 

Semelhante a Dependency injectionpreso (20)

Dependency Injection: Why is awesome and why should I care?
Dependency Injection: Why is awesome and why should I care?Dependency Injection: Why is awesome and why should I care?
Dependency Injection: Why is awesome and why should I care?
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency Injection
 
HTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyHTML5 for the Silverlight Guy
HTML5 for the Silverlight Guy
 
Dsug 05 02-15 - ScalDI - lightweight DI in Scala
Dsug 05 02-15 - ScalDI - lightweight DI in ScalaDsug 05 02-15 - ScalDI - lightweight DI in Scala
Dsug 05 02-15 - ScalDI - lightweight DI in Scala
 
DevSecCon Singapore 2018 - Remove developers’ shameful secrets or simply rem...
DevSecCon Singapore 2018 -  Remove developers’ shameful secrets or simply rem...DevSecCon Singapore 2018 -  Remove developers’ shameful secrets or simply rem...
DevSecCon Singapore 2018 - Remove developers’ shameful secrets or simply rem...
 
DevSecCon SG 2018 Fabian Presentation Slides
DevSecCon SG 2018 Fabian Presentation SlidesDevSecCon SG 2018 Fabian Presentation Slides
DevSecCon SG 2018 Fabian Presentation Slides
 
End-to-end testing with geb
End-to-end testing with gebEnd-to-end testing with geb
End-to-end testing with geb
 
A gentle intro to the Django Framework
A gentle intro to the Django FrameworkA gentle intro to the Django Framework
A gentle intro to the Django Framework
 
Adding a modern twist to legacy web applications
Adding a modern twist to legacy web applicationsAdding a modern twist to legacy web applications
Adding a modern twist to legacy web applications
 
Smoothing Your Java with DSLs
Smoothing Your Java with DSLsSmoothing Your Java with DSLs
Smoothing Your Java with DSLs
 
Zend Framework And Doctrine
Zend Framework And DoctrineZend Framework And Doctrine
Zend Framework And Doctrine
 
Java interview questions and answers
Java interview questions and answersJava interview questions and answers
Java interview questions and answers
 
New Ideas for Old Code - Greach
New Ideas for Old Code - GreachNew Ideas for Old Code - Greach
New Ideas for Old Code - Greach
 
Nikolai Boiko "NodeJS Refactoring: How to kill a Dragon and stay alive"
Nikolai Boiko "NodeJS Refactoring: How to kill a Dragon and stay alive"Nikolai Boiko "NodeJS Refactoring: How to kill a Dragon and stay alive"
Nikolai Boiko "NodeJS Refactoring: How to kill a Dragon and stay alive"
 
gDayX 2013 - Advanced AngularJS - Nicolas Embleton
gDayX 2013 - Advanced AngularJS - Nicolas EmbletongDayX 2013 - Advanced AngularJS - Nicolas Embleton
gDayX 2013 - Advanced AngularJS - Nicolas Embleton
 
Robots in Swift
Robots in SwiftRobots in Swift
Robots in Swift
 
Intro to OOP
Intro to OOPIntro to OOP
Intro to OOP
 
Koin Quickstart
Koin QuickstartKoin Quickstart
Koin Quickstart
 
The Basic Concept Of IOC
The Basic Concept Of IOCThe Basic Concept Of IOC
The Basic Concept Of IOC
 
The State of Front-end At CrowdTwist
The State of Front-end At CrowdTwistThe State of Front-end At CrowdTwist
The State of Front-end At CrowdTwist
 

Mais de ColdFusionConference

API Economy, Realizing the Business Value of APIs
API Economy, Realizing the Business Value of APIsAPI Economy, Realizing the Business Value of APIs
API Economy, Realizing the Business Value of APIsColdFusionConference
 
Crafting ColdFusion Applications like an Architect
Crafting ColdFusion Applications like an ArchitectCrafting ColdFusion Applications like an Architect
Crafting ColdFusion Applications like an ArchitectColdFusionConference
 
Security And Access Control For APIS using CF API Manager
Security And Access Control For APIS using CF API ManagerSecurity And Access Control For APIS using CF API Manager
Security And Access Control For APIS using CF API ManagerColdFusionConference
 
Monetizing Business Models: ColdFusion and APIS
Monetizing Business Models: ColdFusion and APISMonetizing Business Models: ColdFusion and APIS
Monetizing Business Models: ColdFusion and APISColdFusionConference
 
Become a Security Rockstar with ColdFusion 2016
Become a Security Rockstar with ColdFusion 2016Become a Security Rockstar with ColdFusion 2016
Become a Security Rockstar with ColdFusion 2016ColdFusionConference
 
Developer Insights for Application Upgrade to ColdFusion 2016
Developer Insights for Application Upgrade to ColdFusion 2016Developer Insights for Application Upgrade to ColdFusion 2016
Developer Insights for Application Upgrade to ColdFusion 2016ColdFusionConference
 
ColdFusion Keynote: Building the Agile Web Since 1995
ColdFusion Keynote: Building the Agile Web Since 1995ColdFusion Keynote: Building the Agile Web Since 1995
ColdFusion Keynote: Building the Agile Web Since 1995ColdFusionConference
 
Instant ColdFusion with Vagrant
Instant ColdFusion with VagrantInstant ColdFusion with Vagrant
Instant ColdFusion with VagrantColdFusionConference
 
Restful services with ColdFusion
Restful services with ColdFusionRestful services with ColdFusion
Restful services with ColdFusionColdFusionConference
 
Super Fast Application development with Mura CMS
Super Fast Application development with Mura CMSSuper Fast Application development with Mura CMS
Super Fast Application development with Mura CMSColdFusionConference
 
Build your own secure and real-time dashboard for mobile and web
Build your own secure and real-time dashboard for mobile and webBuild your own secure and real-time dashboard for mobile and web
Build your own secure and real-time dashboard for mobile and webColdFusionConference
 
Why Everyone else writes bad code
Why Everyone else writes bad codeWhy Everyone else writes bad code
Why Everyone else writes bad codeColdFusionConference
 
Rest ful tools for lazy experts
Rest ful tools for lazy expertsRest ful tools for lazy experts
Rest ful tools for lazy expertsColdFusionConference
 
Herding cats managing ColdFusion servers with commandbox
Herding cats managing ColdFusion servers with commandboxHerding cats managing ColdFusion servers with commandbox
Herding cats managing ColdFusion servers with commandboxColdFusionConference
 

Mais de ColdFusionConference (20)

Api manager preconference
Api manager preconferenceApi manager preconference
Api manager preconference
 
Cf ppt vsr
Cf ppt vsrCf ppt vsr
Cf ppt vsr
 
API Economy, Realizing the Business Value of APIs
API Economy, Realizing the Business Value of APIsAPI Economy, Realizing the Business Value of APIs
API Economy, Realizing the Business Value of APIs
 
Don't just pdf, Smart PDF
Don't just pdf, Smart PDFDon't just pdf, Smart PDF
Don't just pdf, Smart PDF
 
Crafting ColdFusion Applications like an Architect
Crafting ColdFusion Applications like an ArchitectCrafting ColdFusion Applications like an Architect
Crafting ColdFusion Applications like an Architect
 
Security And Access Control For APIS using CF API Manager
Security And Access Control For APIS using CF API ManagerSecurity And Access Control For APIS using CF API Manager
Security And Access Control For APIS using CF API Manager
 
Monetizing Business Models: ColdFusion and APIS
Monetizing Business Models: ColdFusion and APISMonetizing Business Models: ColdFusion and APIS
Monetizing Business Models: ColdFusion and APIS
 
Become a Security Rockstar with ColdFusion 2016
Become a Security Rockstar with ColdFusion 2016Become a Security Rockstar with ColdFusion 2016
Become a Security Rockstar with ColdFusion 2016
 
Developer Insights for Application Upgrade to ColdFusion 2016
Developer Insights for Application Upgrade to ColdFusion 2016Developer Insights for Application Upgrade to ColdFusion 2016
Developer Insights for Application Upgrade to ColdFusion 2016
 
Where is cold fusion headed
Where is cold fusion headedWhere is cold fusion headed
Where is cold fusion headed
 
ColdFusion Keynote: Building the Agile Web Since 1995
ColdFusion Keynote: Building the Agile Web Since 1995ColdFusion Keynote: Building the Agile Web Since 1995
ColdFusion Keynote: Building the Agile Web Since 1995
 
Instant ColdFusion with Vagrant
Instant ColdFusion with VagrantInstant ColdFusion with Vagrant
Instant ColdFusion with Vagrant
 
Restful services with ColdFusion
Restful services with ColdFusionRestful services with ColdFusion
Restful services with ColdFusion
 
Super Fast Application development with Mura CMS
Super Fast Application development with Mura CMSSuper Fast Application development with Mura CMS
Super Fast Application development with Mura CMS
 
Build your own secure and real-time dashboard for mobile and web
Build your own secure and real-time dashboard for mobile and webBuild your own secure and real-time dashboard for mobile and web
Build your own secure and real-time dashboard for mobile and web
 
Why Everyone else writes bad code
Why Everyone else writes bad codeWhy Everyone else writes bad code
Why Everyone else writes bad code
 
Securing applications
Securing applicationsSecuring applications
Securing applications
 
Testing automaton
Testing automatonTesting automaton
Testing automaton
 
Rest ful tools for lazy experts
Rest ful tools for lazy expertsRest ful tools for lazy experts
Rest ful tools for lazy experts
 
Herding cats managing ColdFusion servers with commandbox
Herding cats managing ColdFusion servers with commandboxHerding cats managing ColdFusion servers with commandbox
Herding cats managing ColdFusion servers with commandbox
 

Último

20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...Akihiro Suda
 
è‹±ć›œUNć­ŠäœèŻ,ćŒ—ćź‰æ™źéĄżć€§ć­ŠæŻ•äžšèŻäčŠ1:1ćˆ¶äœœ
è‹±ć›œUNć­ŠäœèŻ,ćŒ—ćź‰æ™źéĄżć€§ć­ŠæŻ•äžšèŻäčŠ1:1ćˆ¶äœœè‹±ć›œUNć­ŠäœèŻ,ćŒ—ćź‰æ™źéĄżć€§ć­ŠæŻ•äžšèŻäčŠ1:1ćˆ¶äœœ
è‹±ć›œUNć­ŠäœèŻ,ćŒ—ćź‰æ™źéĄżć€§ć­ŠæŻ•äžšèŻäčŠ1:1ćˆ¶äœœqr0udbr0
 
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Angel Borroy LĂłpez
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based projectAnoyGreter
 
Sending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdfSending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdf31events.com
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Andreas Granig
 
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdf
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdfInnovate and Collaborate- Harnessing the Power of Open Source Software.pdf
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdfYashikaSharma391629
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsAhmed Mohamed
 
What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...Technogeeks
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024StefanoLambiase
 
Call Us🔝>àŒ’+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>àŒ’+91-9711147426⇛Call In girls karol bagh (Delhi)Call Us🔝>àŒ’+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>àŒ’+91-9711147426⇛Call In girls karol bagh (Delhi)jennyeacort
 
Post Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on IdentityPost Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on Identityteam-WIBU
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...OnePlan Solutions
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationBradBedford3
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringHironori Washizaki
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfMarharyta Nedzelska
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfAlina Yurenko
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsChristian Birchler
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesPhilip Schwarz
 

Último (20)

20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
 
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort ServiceHot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
 
è‹±ć›œUNć­ŠäœèŻ,ćŒ—ćź‰æ™źéĄżć€§ć­ŠæŻ•äžšèŻäčŠ1:1ćˆ¶äœœ
è‹±ć›œUNć­ŠäœèŻ,ćŒ—ćź‰æ™źéĄżć€§ć­ŠæŻ•äžšèŻäčŠ1:1ćˆ¶äœœè‹±ć›œUNć­ŠäœèŻ,ćŒ—ćź‰æ™źéĄżć€§ć­ŠæŻ•äžšèŻäčŠ1:1ćˆ¶äœœ
è‹±ć›œUNć­ŠäœèŻ,ćŒ—ćź‰æ™źéĄżć€§ć­ŠæŻ•äžšèŻäčŠ1:1ćˆ¶äœœ
 
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based project
 
Sending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdfSending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdf
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024
 
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdf
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdfInnovate and Collaborate- Harnessing the Power of Open Source Software.pdf
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdf
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML Diagrams
 
What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
 
Call Us🔝>àŒ’+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>àŒ’+91-9711147426⇛Call In girls karol bagh (Delhi)Call Us🔝>àŒ’+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>àŒ’+91-9711147426⇛Call In girls karol bagh (Delhi)
 
Post Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on IdentityPost Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on Identity
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion Application
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their Engineering
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdf
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a series
 

Dependency injectionpreso

  • 1. Dependency Injection: Why is it awesome and why should I care? Nolan Erck CF.Objective 2014
  • 2. About Me ● Consultant (southofshasta.com) ● Software Development, Training, Design ● Using ColdFusion since 1999 (4.x) ● Other stuff: C++, Java, jQuery, PHP, .NET, etc. ● Manager of SacInteractive (formerly Sacramento CFUG) ● Reformed Video Game Developer. ● Stuff I've Done: CycleGear.com, CastImages.com, Fusion Events Staffing, Grim Fandango, Star Wars Rogue Squadron, SimPark, SimSafari.
  • 3. 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. ● Lunch!
  • 4. Prerequisites ● Have some experience building classes and objects. ● Don't need to be an expert at it. ● Don't need to have used an MVC framework. ● DI frameworks can be totally separate. ● And 1 more thing you need to know...
  • 5. Prerequisites ● Know that Object Oriented Programming is hard. ● And some of it is confusing at first. ● And that's NORMAL.
  • 7. What is Dependency Injection? ● A “design pattern” ● $6 phrase for “a way to organize your classes so they work together in a flexible way”. ● Sort of like a for() loop, if() statement or array[]. – Reusable technique, but 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. ● Book: “Head First Design Patterns”
  • 8. What is Dependency Injection? ● It's not platform specific. ● D/I libraries available for ColdFusion, Java, .NET, JavaScript, etc. ● For today's presentation, I'm using a mix of pseudocode and condensed examples from various languages. ● Some of the keywords will change, all the concepts work the same across the libraries and languages.
  • 9. 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.
  • 10. 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...
  • 11. 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?
  • 13. 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.)
  • 14. 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...
  • 15. 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 of which are just “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”.
  • 16. 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. Please go find out what classes D depends on, make those as needed, and hand me back the final D when you're done.” (“ColdSpring” is kind of a placeholder here for any D/I framework. They all work about the same.)
  • 17. 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.
  • 18. 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();
  • 19. Bean Management ● New Way ColdSpring.getBean( “mailService” ).sendMail();
  • 20. Bean Management ● New Way ColdSpring.getBean( “mailService” ).sendMail(); Yes, 1 line of code. Yes, it is THAT easy. (I'm over simplifying a little, for effect.)
  • 21. 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”.
  • 23. 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.
  • 24. Inversion Of Control (IOC) class RockGroup { private String groupName; public String getGroupName(){ return groupName; } public void setGroupName( String name ) { this.groupName = name; } } No Constructor. And groupName is private. So we have to call the setter to initialize the variable with something.
  • 25. 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.
  • 26. 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!
  • 27. 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!
  • 28. Inversion Of Control (IOC) What about classes inside of other classes ● AKA “Composition” or the “has a” relationship. ● Kind of the same thing...
  • 29. 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; } }
  • 30. 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 );
  • 31. 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>
  • 32. 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=”singerBean”> <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=”singerBean” /> </class>
  • 33. 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. ● I did that all with 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.
  • 34. 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>
  • 35. 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.
  • 37. 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().
  • 38. Aspect Oriented Programming (AOP) ● Example: drawSalesReport() ● In your AOP library: <func name=”drawSalesReport”> <aspect before run=”checkIfLoggedIn” /> <aspect after run=”saveToDebugLogFile” /> </func>
  • 39. Aspect Oriented Programming (AOP) ● In your code, it USED to look like this: checkIfLoggedIn(); drawSalesReport( UserID=555, dtCreated=#now()# ); SaveToDebugLogFile(); ● What happens NOW is... DIFramework.runWithAdvice( “drawSalesReport”, { UserID=555, dtCreated=#now()# } ); and that does all 3 things, in correct order.
  • 40. 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.
  • 41. 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.)
  • 42. 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!
  • 43. Aspect Oriented Programming (AOP) ● Instead of calling a getUsers() method directly: ● GetUsers(); ● In your AOP library: <advice around functionName=”getUsersWithAdvice”> <method name=”getUsers” /> </advice>
  • 44. Aspect Oriented Programming (AOP) <advice around functionName=”getUsersWithAdvice”> – <method name=”getUsers” /> </advice> function getUsersWithAdvice( funcToRun ) { if( isProduction ) { try{ #funcToRun#(); } catch{ 
 } } else{ #funcToRun#(); } ● In your code: DIFramework.runWithAdvice( “getUsers” ); ● The if() statement is still there but our duplicate SQL is gone!
  • 45. So what's the catch? ● This is maybe a new way of thinking about how you build your classes. ● Takes some getting used to. ● Debugging errors can be slower at first. ...but it does make your code more flexible.
  • 46. 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.
  • 47. 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.)
  • 48. 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!
  • 49. Questions? Comments? Ways to reach me... Email: nolan.erck@gmail.com Twitter: @southofshasta Blog: southofshasta.com Thanks!