SlideShare une entreprise Scribd logo
1  sur  124
Télécharger pour lire hors ligne
Dependency Injection
in iOS
I’m going to talk about…
• DI concept
• DI relevant concepts
• How to apply DI
• TDD+DI example (in iOS)
• TDD+DI real case (in iOS)
• DI Pros & Cons
• References
DI concept
What is Dependency Injection?
Dependency Injection (DI) is a software design pattern
that implements inversion of control (IoC) and
allows a program design to follow the
dependency inversion principle.
- Wikipedia
What is Dependency Injection?
Dependency Injection (DI) is a set of software design
principles and patterns that enables us to develop
loosely coupled code.
- Mark Seemann (Dependency Injection in .NET)
What is Dependency Injection?
The basic concept is that we separate
dependencies from classes that uses them.
But… What is a dependency?
A dependency is an object that your class under test
interacts with.
What is Dependency Injection?
CollaboratorSUT
DependencyClass
Interaction
A dependency is a collaborator, is someone that your
class under test needs to use for some reason.
What is Dependency Injection?
The problem is that we use to create dependencies from within the SUT
The base of DI is that we should create dependencies from
somewhere else, not within our SUT
CollaboratorSUT
DependencyClass
Instantiation
Interaction
CollaboratorSUT
DependencyClass
Interaction Instantiation
Somewhere
else
Another class
What is Dependency Injection?
The idea of DI is that somehow we will inject those dependencies into
our SUT…
Collaborator
Dependency
SUT
Class
Interaction
Instantiation
Somewhere
else
Another class
Injection
This separates construction from behavior
What is Dependency Injection?
Let’s see a real world example (an Inaka world example)…
What is Dependency Injection?
Let’s see a real world example (an Inaka world example)…
Say we are testing Nacho, say we want to see whether he has a good
working performance, i.e. whether he is producing as we expect.
Guy under test
What is Dependency Injection?
Our tester will be Demian (couldn’t be other way…)
Evaluates
The tester
The guy
under test
What is Dependency Injection?
But, let’s say Nacho needs Gera’s help to do his work…
Evaluates Needs
The tester
The guy
under test
The
dependency
So, Nacho is depending upon Gera to have his job done.
There is some task that Nacho needs from Gera to be done to complete
his work.
What is Dependency Injection?
Even though Gera is a hard-working guy,
he is human, so it will take some time and
effort to complete the work he has to do for
Nacho.
But, wait… We are not testing Gera’s
performance, but Nacho’s.
In other words, as the guy under test is
Nacho, we should not depend upon Gera’s
work to see how Nacho works.
So, what to do…?
What is Dependency Injection?
Well, Demian (the tester) can make up some sort of fake Gera, one
that will have everything there for Nacho as soon as he needs it.
Imagine this fake Gera as some sort of terminator that will have
everything Nacho needs immediately and perfectly done for him.
Creates
The tester
The
dependency
fake Gera
What is Dependency Injection?
Creates
The tester
The
dependency
Passes
it to
The guy
under test
Nacho needs a Gera to help him, and it’s
Demian who’s telling him:
“Hey, take this Gera and use this one”
Interacts
with
fake Gera
What is Dependency Injection?
At this point, we see that it’s not up to Nacho to choose WHAT
Gera to use, all he needs to know is that he’s going to use some sort
of Gera to help him.
It’s another guy who is choosing WHAT Gera to use, that guy is
Demian.
This way we assure that we are testing Nacho, no matter what Gera
he uses, as long as he uses one.
Collaborator
What is Dependency Injection?
Let’s see the equivallences of this example and the OO world…
Creates
The tester
The
dependency
Passes
it to
The guy
under test
Instantiates
The tester
The
dependency
Injects
The system
under test
Test class
SUT
Note that “passing the dependency to” is referred to as “injecting” the dependency.
Interacts
with
Interacts
with
fake Gera
What is Dependency Injection?
This way of working leads us to develop loosely-coupled designs
Collaborator
Creation
Injection
Class
Class
Interaction
What is Dependency Injection?
This way of working leads us to develop loosely-coupled designs
WITHOUT DI WITH DI
What is Dependency Injection for?
DI’s overall purpose is code maintainability.
By writing maintainable code,
we will spend less time finding and fixing bugs.
One of many ways to write maintainable code is through
loose coupling.
SOLID
Single Responsibility
Interface Segregation
Liskov Substitution
Dependency Inversion
Open / Closed
Some principles that DI will encourage us to follow:
S
O
L
I
D
ingle Responsibility
pen / Closed
iskov Substitution
nterface Segregation
ependency Inversion
A class should have only one single responsibility.
Classes should be open for extension, but closed for modification.
Objects in a program should be replaceable with other objects of the
same interface without breaking either client or implementation.
Many client-specific interfaces are better than one general-purpose
interface.
Depend upon abstractions. Do not depend upon concretions.
DI relevant concepts
Unit tests provide rapid feedback on the state of an
application.
However, it’s only possible to write unit tests when the
unit in question can be properly isolated from its
dependencies.
TDD is the safest way to ensure testability.
(a software is considered testable
when it’s susceptible to unit testing)
That’s the point in which TDD is related to DI
We use DI to isolate classes from their dependencies
TDD leverages unit tests, which need our classes to be
isolated from their dependencies
Stable Dependencies -vs- Volatile
Dependencies
You expect that new versions
won’t contain breaking
changes
Class already exists
Types in question contain
deterministic algorythms
You never expect to have to
replace the class with another
Example: UITextField
The class introduces a
requirement to setup and
configure runtime envionment
The class contains
nondeterministic behavior
Important in unit tests: All tests
should be deterministic
Example: AFNetworking
The class doesn’t yet exist,
but it’s still in development
Volatile Dependencies are the focal point of DI
When we have a volatile dependency, we must
introduce a seam in our class.
A seam is sort of a gate,
from which we are going to relate a class with its dependency.
We can see seam as the separation between the class and its dependency.
Seams
Everywhere we decide to program against an interface instead of a
concrete type, we introduce a seam.
A seam is a place where an application is assembled from
its constituent parts.
This is similar to the way a piece of clothing is sewn together at its
seams.
A seam is also a place where we can disassemble the application
and work with their modules in isolation.
We won’t lose the control of the dependency, though.
We’ll just move it to another place.
This is an application of the Single Responsibility Principle,
because our classes would only deal with their given area
of responsibility.
This means we will make the class give up control of the
dependency (hence, its lifetime).
Seams
Seams
Class
Volatile
dependency
Class
Volatile
dependency
Seam
BEFORE AFTER
Seams
Counter
ViewController
Counter
Counter
ViewController
Counter
Seam
BEFORE AFTER
Seams
Counter
ViewController
Counter
Counter
ViewController
Counter
Seam
BEFORE AFTER
replaceable
interchangeable
Seams
Counter
ViewController
Counter
Counter
ViewController
Counter
Seam
BEFORE AFTER
FakeCounter
Seams
Counter
ViewController
Counter
Counter
ViewController
Counter
Seam
BEFORE AFTER
Good for
unit testing!
FakeCounter
… and for loose-coupling!
Applying DI
Methods to apply DI:
Extract and override
Method injection
Setter injection (a.k.a. Property injection)
Constructor injection
Extract and override
volatile dependency detected
Extract and override
extract
Extract and override
Subclasses can override this method and provide whatever manager they want.
extract
* Observe that [AFHTTPRequestOperationManager manager] has become our default manager.
Extract and override
Extract and override
Subclass
… or whatever you want
Extract and override
Subclass
Here (in a subclass) you can provide whatever manager you want.
This allows testing classes to replace real dependency objects with fakes.
In this case, you must use your testable version of the class (i.e. your subclass) to test.
… or whatever you want
Extract and override
Subclass
Method injection
Method injection
We inject the dependency from the outside
This allows us to inject whatever instance we need at any moment we
need to use the method.
Usually, we will inject a fake object when testing the method…
Method injection
We inject the dependency from the outside
Method injection
Method injection
Method injection in action
DRMessagesFetcher.h
DRMessagesFetcher.m
Setter injection
DRMessagesFetcher.h
DRMessagesFetcher.m
Setter injection
We inject the dependency via a property
Setter injection
We can make a trick to have a default
dependency initialization and make
the injection optional.
Setter injection
Setter injection
Setter injection in action
Setter injection
Constructor injection
This way we make the property private
Constructor injection
This way we make the property private
Constructor injection
We inject our dependency from the outside
through a constructor
Constructor injection
Default initialization
Constructor injection
Default initialization
Custom initialization
Constructor injection
Default initialization
Custom initialization
When testing, we will use this one
Constructor injection
Constructor injection
Constructor injection in action
Constructor injection
TDD+DI example
(in iOS)
Let’s make a very simple application from
scratch by applying TDD and some DI
increment
Count:
Yet Another Counter
0
Let’s make a very simple application from
scratch by applying TDD and some DI
increment
Count:
Yet Another Counter
0123
But first,
let’s remember which kind of tests we categorized last time…
3 kind of verifications
(a.k.a. InteractionVerification)
Counter
ViewController
View-Controller
class
Counter
Model
class
This is what we start with…
CounterViewController.h
CounterViewController.m
CounterViewControllerTests.m
CounterViewController.h
CounterViewController.m
CounterViewControllerTests.m
State verification tests
Counter.h
Counter.m
CounterTests.m
Counter.h
Counter.m
CounterTests.m
State verification tests
increment
View-Controller
class
Model
class
Let’s add some interaction…
Counter
ViewController
Counter
CounterViewController.h
CounterViewController.m
CounterViewControllerTests.m
CounterViewController.h
CounterViewController.m
CounterViewControllerTests.m
CounterViewController.h
CounterViewController.m
CounterViewControllerTests.m
Interaction test
CounterViewController.h
CounterViewController.m
CounterViewControllerTests.m
Interaction test
CounterViewController.h
CounterViewController.m
CounterViewControllerTests.m
Interaction test
Counter.h
Counter.m
CounterTests.m
It remains
all the same
so far…
Let’s add a trick to default initialize our dependency
in our View Controller…
Thus, other classes that need to use CounterViewController don’t have to remember what
dependencies to initialize (even though they optionally can) and unnecessarily mess the
code up everywhere.
In CounterViewController.m
default initializer
increment
didIncrement
View-Controller
class
Model
class
Let’s add a feedback interaction…
Counter
ViewController
Counter
CounterViewController.h
CounterViewController.m
CounterViewControllerTests.m
Counter.h
Counter.m
CounterTests.m
Counter.h
Counter.m
CounterTests.m
Counter.h
Counter.m
CounterTests.m
Interaction test
Counter.h
Counter.m
CounterTests.m
Interaction test
Counter.h
Counter.m
CounterTests.m
Interaction test
Counter.h
Counter.m
CounterTests.m
Interaction test
“did increment”
before incrementing???
Currently, our
test method is not ensuring that the “did increment” call
should be done right after incrementing, and not before.
Having said that, we will know that this test will pass,
because it’s only testing that the “did delegate” call is
being done, no matter when, as long as we call
[counter increment];
This is giving us a false sense of correctness.
That’s one of the drawbacks of TDD that we saw in my
previous talk about TDD.
Currently, our
test method is not ensuring that the “did increment” call
should be done right after incrementing, and not before.
So, we will need to modify this test to make sure the
“did increment” delegate call is being fired once the
integer counter property has been increased.
Currently, our
test method is not ensuring that the “did increment” call
should be done right after incrementing, and not before.
Counter.h
Counter.m
CounterTests.m
Counter.h
Counter.m
CounterTests.m
Counter.h
Counter.m
CounterTests.m
Counter.h
Counter.m
CounterTests.m
increment
didIncrement
View-Controller
class
Model
class
Almost there…
Just don’t forget to update the screen…!
Counter
ViewController
Counter
CounterViewController.h
CounterViewController.m
CounterViewControllerTests.m
CounterViewController.h
CounterViewController.m
CounterViewControllerTests.m
State verification test
CounterViewController.h
CounterViewController.m
CounterViewControllerTests.m
State verification test
CounterViewController.h
CounterViewController.m
CounterViewControllerTests.m
State verification test
CounterViewController.h
CounterViewController.m
CounterViewControllerTests.m
State verification test
This ain’t updating,
is it???
CounterViewController.h
CounterViewController.m
CounterViewControllerTests.m
State verification test
There ya go!
increment
didIncrement
View-Controller
class
Model
class
We are there.
Finally, we have our application working!
Counter
ViewController
Counter
TDD+DI real case
(in iOS)
DailyReader
DailyReader is an iOS app that fetches all the messages of the
current day from Inaka’s main room and displays them on the
screen through a grouped table, categorizing them into three
different groups:
‣ “dailies”
‣ “not so descriptive dailies”
‣ “other messages”
It was entirely developed by applying TDD and DI.
https://github.com/inaka/daily-reader
DRMessages
ViewController
DRMessages
Fetcher
AFHTTP
OperationManager
DRURLManager DRDataParser
DRMessage
DRMessageCell
DRMessages
DataSource
via delegate
via
blocks
Model Classes
View/Controller
Classes
External Classes
References
asks for messages
leverages
(to configure request URL) leverages
needs
returns array of messages
returns
responses
needs
(to set the cell)
leverages
(to configure
itself)
creates
sends array
with messages
asks for
JSON
DailyReader architecture
This is what DailyReader could have looked like if we had not applied TDD+DI
DRMessages
ViewController
DRManager
AFHTTP
OperationManager
DRMessage
via delegate
via
blocks
Model Classes
View/Controller
Classes
External Classes
References
asks
for
messages
needs
returns array of messages
returns
responsesasks for
JSON
needs
This is what DailyReader could have looked like if we had not applied TDD+DI
DRMessages
ViewController
DRManager
AFHTTP
OperationManager
DRMessage
via delegate
via
blocks
Model Classes
View/Controller
Classes
External Classes
References
asks
for
messages
needs
returns array of messages
returns
responsesasks for
JSON
• Fewer classes
• Classes are tightly coupled
• Responsibilites are not clear
• Code is less extensible
• Code is less testable
• Code is less maintainable
What do we see here?
needs
This is what DailyReader could have looked like if we had not applied TDD+DI
DRMessages
ViewController
AFHTTP
OperationManager
DRMessage
via delegate
via
blocks
Model Classes
View/Controller
Classes
External Classes
References
asks
for
messages
needs
returns array of messages
returns
responsesasks for
JSON
needs
DRManager
would be a God Class
with these responsibilites:
• Communicating to
networking classes
• Configuring request URLs
• Parsing responses into
model objects
• Creating model objects
It definitely breaks the
Single
Responsibility
Principle
such a
code smell
DI: Pros & Cons
When we applied TDD+DI, we spent more time and effort on the developing
process, but on the other hand, we’ve been rewarded with these great things:
✓ Flexible architecture
✓ Extensible code
✓ Maintainable code
… and, the best one…
✓ We now have tests that will catch us (or any developer who
has to modify code) in case we make mistakes when
refactoring, bugfixing, or adding new features.
Benefits of applying TDD + DI
… all these things will lead us to spend much less time and effort on future
refactorings / bug fixings processes.
Remember this?
Team progress and output measured with and without tests
- Roy Osherove, The Art Of Unit Testing
“That’s why it’s important to emphasize that, although unit testing can increase the amount of
time it takes to implement a feature, the time balances out over the product’s release cycle because
of increased quality and maintainability.”
There are also more benefits of applying dependency injection:
✓ Classes are easier to unit-test in isolation, leveraging fake objects.
✓ We can externalize system’s configuration details into
configuration files, allowing the system to be reconfigured without
recompilation.
✓ Separated configurations can be written for different situations that
require different implementations of components.
✓ DI allows concurrent or independient development.
Even more benefits of applying TDD + DI !
But… Be careful: There are some downsides when applying DI…
๏ Code is more difficult to trace (read).
๏ We will usually require more lines of code to
accomplish the same behavior legacy code would.
๏ It adds much more time and effort to the process of
code development.
Because DI separates behavior from construction
References
Dependency Injection
by Mark Seemann
in .NET
2012 .NET
The Art Of Unit Testing
by Roy Osherove
with Examples in .NET
2009 .NET
Working Effectively With
Legacy Code
by Michael Feathers
2005 Java, C++, C
http://qualitycoding.org/
Jon Reid’s blog
2011 - Actua
/Dependency_injection
Wikipedia
/Inversion_of_control
/SOLID_(object-oriented_design)
/Test-driven_development
http://en.wikipedia.org/wiki/
Other internet articles
http://codebetter.com/jeremymiller/2005/10/06/the-dependency-
injection-pattern-%E2%80%93-what-is-it-and-why-do-i-care/
http://di-objective-c.blogspot.com.ar/2010/06/diy-di-objective-
c.html
http://www.slideshare.net/MarcMorera/dependency-
injection-29887934
http://blog.8thlight.com/eric-smith/2009/04/16/dependency-
inversion-principle-and-iphone.html
https://www.youtube.com/watch?v=_CeWMxzB1SI
(eBay Tech Talk with Jon Reid about TDD for iOS)
That’s all, folks!
(this story may continue soon though…)
I hope you enjoy
implementing
TDD + DI
in iOS
:D
Pablo Villar - May 2014 @ InakaLabs

Contenu connexe

Tendances

SOLID Design Principles applied in Java
SOLID Design Principles applied in JavaSOLID Design Principles applied in Java
SOLID Design Principles applied in JavaIonut Bilica
 
Clean Code II - Dependency Injection
Clean Code II - Dependency InjectionClean Code II - Dependency Injection
Clean Code II - Dependency InjectionTheo Jungeblut
 
SOLID Design Principles
SOLID Design PrinciplesSOLID Design Principles
SOLID Design PrinciplesSamuel Breed
 
Jetpack Compose beginner.pdf
Jetpack Compose beginner.pdfJetpack Compose beginner.pdf
Jetpack Compose beginner.pdfAayushmaAgrawal
 
Clean Architecture
Clean ArchitectureClean Architecture
Clean ArchitectureBadoo
 
Nest.js Introduction
Nest.js IntroductionNest.js Introduction
Nest.js IntroductionTakuya Tejima
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency InjectionKnoldus Inc.
 
Single Responsibility Principle
Single Responsibility PrincipleSingle Responsibility Principle
Single Responsibility PrincipleEyal Golan
 
Asp.Net Core MVC , Razor page , Entity Framework Core
Asp.Net Core MVC , Razor page , Entity Framework CoreAsp.Net Core MVC , Razor page , Entity Framework Core
Asp.Net Core MVC , Razor page , Entity Framework Coremohamed elshafey
 
Learning solid principles using c#
Learning solid principles using c#Learning solid principles using c#
Learning solid principles using c#Aditya Kumar Rajan
 
SwiftUI - Performance and Memory Management
SwiftUI - Performance and Memory ManagementSwiftUI - Performance and Memory Management
SwiftUI - Performance and Memory ManagementWannitaTolaema
 
Introduction to Spring's Dependency Injection
Introduction to Spring's Dependency InjectionIntroduction to Spring's Dependency Injection
Introduction to Spring's Dependency InjectionRichard Paul
 
Introduction to React
Introduction to ReactIntroduction to React
Introduction to ReactRob Quick
 
3.Java EE7 徹底入門 CDI&EJB
3.Java EE7 徹底入門 CDI&EJB3.Java EE7 徹底入門 CDI&EJB
3.Java EE7 徹底入門 CDI&EJBTsunenaga Hanyuda
 

Tendances (20)

Java modules
Java modulesJava modules
Java modules
 
SOLID Design Principles applied in Java
SOLID Design Principles applied in JavaSOLID Design Principles applied in Java
SOLID Design Principles applied in Java
 
Clean Code II - Dependency Injection
Clean Code II - Dependency InjectionClean Code II - Dependency Injection
Clean Code II - Dependency Injection
 
SOLID Design Principles
SOLID Design PrinciplesSOLID Design Principles
SOLID Design Principles
 
Solid Principles
Solid PrinciplesSolid Principles
Solid Principles
 
Jetpack Compose beginner.pdf
Jetpack Compose beginner.pdfJetpack Compose beginner.pdf
Jetpack Compose beginner.pdf
 
Clean Architecture
Clean ArchitectureClean Architecture
Clean Architecture
 
Nest.js Introduction
Nest.js IntroductionNest.js Introduction
Nest.js Introduction
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency Injection
 
Facade Pattern
Facade PatternFacade Pattern
Facade Pattern
 
Single Responsibility Principle
Single Responsibility PrincipleSingle Responsibility Principle
Single Responsibility Principle
 
Asp.Net Core MVC , Razor page , Entity Framework Core
Asp.Net Core MVC , Razor page , Entity Framework CoreAsp.Net Core MVC , Razor page , Entity Framework Core
Asp.Net Core MVC , Razor page , Entity Framework Core
 
Learning solid principles using c#
Learning solid principles using c#Learning solid principles using c#
Learning solid principles using c#
 
SwiftUI - Performance and Memory Management
SwiftUI - Performance and Memory ManagementSwiftUI - Performance and Memory Management
SwiftUI - Performance and Memory Management
 
Spring mvc
Spring mvcSpring mvc
Spring mvc
 
Introduction to Spring's Dependency Injection
Introduction to Spring's Dependency InjectionIntroduction to Spring's Dependency Injection
Introduction to Spring's Dependency Injection
 
Introduction à JPA (Java Persistence API )
Introduction à JPA  (Java Persistence API )Introduction à JPA  (Java Persistence API )
Introduction à JPA (Java Persistence API )
 
Solid principles
Solid principlesSolid principles
Solid principles
 
Introduction to React
Introduction to ReactIntroduction to React
Introduction to React
 
3.Java EE7 徹底入門 CDI&EJB
3.Java EE7 徹底入門 CDI&EJB3.Java EE7 徹底入門 CDI&EJB
3.Java EE7 徹底入門 CDI&EJB
 

En vedette

Writing a REST Interconnection Library in Swift
Writing a REST Interconnection Library in SwiftWriting a REST Interconnection Library in Swift
Writing a REST Interconnection Library in SwiftPablo Villar
 
iOS Test-Driven Development
iOS Test-Driven DevelopmentiOS Test-Driven Development
iOS Test-Driven DevelopmentPablo Villar
 
Power point dropbox google drive
Power point  dropbox google drivePower point  dropbox google drive
Power point dropbox google driveanderibi
 
Android application development company in chennai
Android application development company in chennaiAndroid application development company in chennai
Android application development company in chennaiedsseo
 
From Objective-C to Swift
From Objective-C to SwiftFrom Objective-C to Swift
From Objective-C to SwiftPablo Villar
 
Panic! at the Disco
Panic! at the Disco Panic! at the Disco
Panic! at the Disco Alarmclock24
 
Mavropoulos theofanis
Mavropoulos theofanisMavropoulos theofanis
Mavropoulos theofanisTheofanis2014
 
Working report on insurance company
Working report on insurance companyWorking report on insurance company
Working report on insurance companyAndey786
 
Little lessons learned from Swift
Little lessons learned from SwiftLittle lessons learned from Swift
Little lessons learned from SwiftPablo Villar
 
SEO pro eshopy a jejich majitele/správce - Eshopvíkend 2015 :-)
SEO pro eshopy a jejich majitele/správce - Eshopvíkend 2015 :-)SEO pro eshopy a jejich majitele/správce - Eshopvíkend 2015 :-)
SEO pro eshopy a jejich majitele/správce - Eshopvíkend 2015 :-)Jakub Kašparů
 
Ohjeistus onnistuneen sisältöstrategian luomiseen ja verkkokauppa-analytiikkaan
Ohjeistus onnistuneen sisältöstrategian luomiseen ja  verkkokauppa-analytiikkaanOhjeistus onnistuneen sisältöstrategian luomiseen ja  verkkokauppa-analytiikkaan
Ohjeistus onnistuneen sisältöstrategian luomiseen ja verkkokauppa-analytiikkaanannaemilia
 
โครงการผู้บำเพ็ญประโยชน์
โครงการผู้บำเพ็ญประโยชน์โครงการผู้บำเพ็ญประโยชน์
โครงการผู้บำเพ็ญประโยชน์panomkon
 
NYCC 2014 (Bionicle)
NYCC 2014 (Bionicle)NYCC 2014 (Bionicle)
NYCC 2014 (Bionicle)rusbionicle
 
โครงการผู้บำเพ็ญประโยชน์
โครงการผู้บำเพ็ญประโยชน์โครงการผู้บำเพ็ญประโยชน์
โครงการผู้บำเพ็ญประโยชน์panomkon
 

En vedette (20)

Writing a REST Interconnection Library in Swift
Writing a REST Interconnection Library in SwiftWriting a REST Interconnection Library in Swift
Writing a REST Interconnection Library in Swift
 
iOS Test-Driven Development
iOS Test-Driven DevelopmentiOS Test-Driven Development
iOS Test-Driven Development
 
Power point dropbox google drive
Power point  dropbox google drivePower point  dropbox google drive
Power point dropbox google drive
 
Android application development company in chennai
Android application development company in chennaiAndroid application development company in chennai
Android application development company in chennai
 
From Objective-C to Swift
From Objective-C to SwiftFrom Objective-C to Swift
From Objective-C to Swift
 
Pre o-net math6
Pre o-net math6Pre o-net math6
Pre o-net math6
 
اللحن
اللحناللحن
اللحن
 
Johnny cash
Johnny cashJohnny cash
Johnny cash
 
Panic! at the Disco
Panic! at the Disco Panic! at the Disco
Panic! at the Disco
 
Mavropoulos theofanis
Mavropoulos theofanisMavropoulos theofanis
Mavropoulos theofanis
 
Working report on insurance company
Working report on insurance companyWorking report on insurance company
Working report on insurance company
 
Little lessons learned from Swift
Little lessons learned from SwiftLittle lessons learned from Swift
Little lessons learned from Swift
 
SEO pro eshopy a jejich majitele/správce - Eshopvíkend 2015 :-)
SEO pro eshopy a jejich majitele/správce - Eshopvíkend 2015 :-)SEO pro eshopy a jejich majitele/správce - Eshopvíkend 2015 :-)
SEO pro eshopy a jejich majitele/správce - Eshopvíkend 2015 :-)
 
Ohjeistus onnistuneen sisältöstrategian luomiseen ja verkkokauppa-analytiikkaan
Ohjeistus onnistuneen sisältöstrategian luomiseen ja  verkkokauppa-analytiikkaanOhjeistus onnistuneen sisältöstrategian luomiseen ja  verkkokauppa-analytiikkaan
Ohjeistus onnistuneen sisältöstrategian luomiseen ja verkkokauppa-analytiikkaan
 
โครงการผู้บำเพ็ญประโยชน์
โครงการผู้บำเพ็ญประโยชน์โครงการผู้บำเพ็ญประโยชน์
โครงการผู้บำเพ็ญประโยชน์
 
E4
E4E4
E4
 
NYCC 2014 (Bionicle)
NYCC 2014 (Bionicle)NYCC 2014 (Bionicle)
NYCC 2014 (Bionicle)
 
Tik 2
Tik 2Tik 2
Tik 2
 
โครงการผู้บำเพ็ญประโยชน์
โครงการผู้บำเพ็ญประโยชน์โครงการผู้บำเพ็ญประโยชน์
โครงการผู้บำเพ็ญประโยชน์
 
Presentation1
Presentation1Presentation1
Presentation1
 

Similaire à Dependency Injection in iOS

Introduction to dependency injection in Scala (Play)
Introduction to dependency injection in Scala (Play)Introduction to dependency injection in Scala (Play)
Introduction to dependency injection in Scala (Play)Knoldus Inc.
 
Dependency Injection Lightning Talk
Dependency Injection Lightning TalkDependency Injection Lightning Talk
Dependency Injection Lightning TalkJon Bachelor
 
Unit Testing Full@
Unit Testing Full@Unit Testing Full@
Unit Testing Full@Alex Borsuk
 
Dependency injection using Google guice
Dependency injection using Google guiceDependency injection using Google guice
Dependency injection using Google guiceAman Verma
 
Software design principles - jinal desai
Software design principles - jinal desaiSoftware design principles - jinal desai
Software design principles - jinal desaijinaldesailive
 
JAVA VIVA QUESTIONS_CODERS LODGE.pdf
JAVA VIVA QUESTIONS_CODERS LODGE.pdfJAVA VIVA QUESTIONS_CODERS LODGE.pdf
JAVA VIVA QUESTIONS_CODERS LODGE.pdfnofakeNews
 
Automation testing real time interview question.pdf
Automation testing real time interview question.pdfAutomation testing real time interview question.pdf
Automation testing real time interview question.pdfEnjoyr
 
Working Effectively With Legacy Code
Working Effectively With Legacy CodeWorking Effectively With Legacy Code
Working Effectively With Legacy CodeNaresh Jain
 
DIC To The Limit – deSymfonyDay, Barcelona 2014
DIC To The Limit – deSymfonyDay, Barcelona 2014DIC To The Limit – deSymfonyDay, Barcelona 2014
DIC To The Limit – deSymfonyDay, Barcelona 2014Ronny López
 
Dependency Inversion Principle
Dependency Inversion PrincipleDependency Inversion Principle
Dependency Inversion PrincipleShahriar Hyder
 
A Mockery of a persentation
A Mockery of a persentationA Mockery of a persentation
A Mockery of a persentationGil Zilberfeld
 
Design principle vs design patterns
Design principle vs design patternsDesign principle vs design patterns
Design principle vs design patternsPrabhakar Sharma
 
Jump start to OOP, OOAD, and Design Pattern
Jump start to OOP, OOAD, and Design PatternJump start to OOP, OOAD, and Design Pattern
Jump start to OOP, OOAD, and Design PatternNishith Shukla
 
Jump Start To Ooad And Design Patterns
Jump Start To Ooad And Design PatternsJump Start To Ooad And Design Patterns
Jump Start To Ooad And Design PatternsLalit Kale
 
20 most important java programming interview questions
20 most important java programming interview questions20 most important java programming interview questions
20 most important java programming interview questionsGradeup
 
C# Dependency Injection Tutorial | C# Dependency Injection Example | C# Tutor...
C# Dependency Injection Tutorial | C# Dependency Injection Example | C# Tutor...C# Dependency Injection Tutorial | C# Dependency Injection Example | C# Tutor...
C# Dependency Injection Tutorial | C# Dependency Injection Example | C# Tutor...Simplilearn
 
Dependency injection and inversion
Dependency injection and inversionDependency injection and inversion
Dependency injection and inversionchhabraravish23
 
Test Driven Development:Unit Testing, Dependency Injection, Mocking
Test Driven Development:Unit Testing, Dependency Injection, MockingTest Driven Development:Unit Testing, Dependency Injection, Mocking
Test Driven Development:Unit Testing, Dependency Injection, Mockingmrjawright
 

Similaire à Dependency Injection in iOS (20)

Introduction to dependency injection in Scala (Play)
Introduction to dependency injection in Scala (Play)Introduction to dependency injection in Scala (Play)
Introduction to dependency injection in Scala (Play)
 
Dependency Injection Lightning Talk
Dependency Injection Lightning TalkDependency Injection Lightning Talk
Dependency Injection Lightning Talk
 
Unit Testing Full@
Unit Testing Full@Unit Testing Full@
Unit Testing Full@
 
Dependency injection using Google guice
Dependency injection using Google guiceDependency injection using Google guice
Dependency injection using Google guice
 
Software design principles - jinal desai
Software design principles - jinal desaiSoftware design principles - jinal desai
Software design principles - jinal desai
 
JAVA VIVA QUESTIONS_CODERS LODGE.pdf
JAVA VIVA QUESTIONS_CODERS LODGE.pdfJAVA VIVA QUESTIONS_CODERS LODGE.pdf
JAVA VIVA QUESTIONS_CODERS LODGE.pdf
 
Automation testing real time interview question.pdf
Automation testing real time interview question.pdfAutomation testing real time interview question.pdf
Automation testing real time interview question.pdf
 
Working Effectively With Legacy Code
Working Effectively With Legacy CodeWorking Effectively With Legacy Code
Working Effectively With Legacy Code
 
DIC To The Limit – deSymfonyDay, Barcelona 2014
DIC To The Limit – deSymfonyDay, Barcelona 2014DIC To The Limit – deSymfonyDay, Barcelona 2014
DIC To The Limit – deSymfonyDay, Barcelona 2014
 
Dependency Inversion Principle
Dependency Inversion PrincipleDependency Inversion Principle
Dependency Inversion Principle
 
A Mockery of a persentation
A Mockery of a persentationA Mockery of a persentation
A Mockery of a persentation
 
Design principle vs design patterns
Design principle vs design patternsDesign principle vs design patterns
Design principle vs design patterns
 
Jump start to OOP, OOAD, and Design Pattern
Jump start to OOP, OOAD, and Design PatternJump start to OOP, OOAD, and Design Pattern
Jump start to OOP, OOAD, and Design Pattern
 
Jump Start To Ooad And Design Patterns
Jump Start To Ooad And Design PatternsJump Start To Ooad And Design Patterns
Jump Start To Ooad And Design Patterns
 
20 most important java programming interview questions
20 most important java programming interview questions20 most important java programming interview questions
20 most important java programming interview questions
 
C# Dependency Injection Tutorial | C# Dependency Injection Example | C# Tutor...
C# Dependency Injection Tutorial | C# Dependency Injection Example | C# Tutor...C# Dependency Injection Tutorial | C# Dependency Injection Example | C# Tutor...
C# Dependency Injection Tutorial | C# Dependency Injection Example | C# Tutor...
 
Dependency injection and inversion
Dependency injection and inversionDependency injection and inversion
Dependency injection and inversion
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency Injection
 
Unusual C# - OOP
Unusual C# - OOPUnusual C# - OOP
Unusual C# - OOP
 
Test Driven Development:Unit Testing, Dependency Injection, Mocking
Test Driven Development:Unit Testing, Dependency Injection, MockingTest Driven Development:Unit Testing, Dependency Injection, Mocking
Test Driven Development:Unit Testing, Dependency Injection, Mocking
 

Dernier

TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providermohitmore19
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionSolGuruz
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdfWave PLM
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVshikhaohhpro
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsArshad QA
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...OnePlan Solutions
 
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female serviceCALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female serviceanilsa9823
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsJhone kinadey
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️Delhi Call girls
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AIABDERRAOUF MEHENNI
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...panagenda
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsAndolasoft Inc
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️anilsa9823
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...MyIntelliSource, Inc.
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...harshavardhanraghave
 

Dernier (20)

TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with Precision
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
 
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female serviceCALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.js
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
 

Dependency Injection in iOS