SlideShare ist ein Scribd-Unternehmen logo
1 von 122
I come with knifes
A story of Daggers and Toothpicks…
Droidcon Krakow 2016
Danny Preussler
@PreusslerBerlin
@PreusslerBerlin
Once upon a time
@PreusslerBerlin
A single activity
@PreusslerBerlin
public class LonelyActivity extends Activity {
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
setContentView(R.layout.activity_main);
}
}
@PreusslerBerlin
needs to
@PreusslerBerlin
needs to support
@PreusslerBerlin
needs to support
Tracking
@PreusslerBerlin
The journey to testability starts
@PreusslerBerlin
Starring
@PreusslerBerlin
Tracker as component
public interface Tracker {
void trackStarted();
}
@PreusslerBerlin
GoogleAnalyticsTracker as Tracker
public class GoogleAnalyticsTracker
implements Tracker {
@Override
public void trackStarted() {
}
}
@PreusslerBerlin
Prolog
The Untestable
@PreusslerBerlin
public class LonelyActivity extends Activity {
private final Tracker tracker
= new GoogleAnalyticsTracker();
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
setContentView(R.layout.activity_main);
tracker.trackStarted();
}
}
@PreusslerBerlin
public class LonelyActivity extends Activity {
private final Tracker tracker
= new GoogleAnalyticsTracker();
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
setContentView(R.layout.activity_main);
tracker.trackStarted();
}
}
@PreusslerBerlin
public class LonelyActivity extends Activity {
private final Tracker tracker
= new GoogleAnalyticsTracker();
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
setContentView(R.layout.activity_main);
tracker.trackStarted();
}
}
Not testable!
@PreusslerBerlin
A voice out of the dark:
Inversion of Control!
@PreusslerBerlin
A voice out of the dark:
Inversion of Control!
@PreusslerBerlin
public class LonelyActivity extends Activity {
private final Tracker tracker
= new GoogleAnalyticsTracker();
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
setContentView(R.layout.activity_main);
tracker.trackStarted();
}
}
@PreusslerBerlin
Act I
The Factory
@PreusslerBerlin
public class Dependencies {
static Dependencies instance = new Dependencies();
public static Dependencies getInstance() {
return instance;
}
public Tracker getTracker() {
return new GoogleAnalyticsTracker();
}
…
@PreusslerBerlin
public class Dependencies {
static Dependencies instance = new Dependencies();
public static Dependencies getInstance() {
return instance;
}
public Tracker getTracker() {
return new GoogleAnalyticsTracker();
}
…
@PreusslerBerlin
public class Dependencies {
static Dependencies instance = new Dependencies();
public static Dependencies getInstance() {
return instance;
}
public Tracker getTracker() {
return new GoogleAnalyticsTracker();
}
…
@PreusslerBerlin
import static Dependencies.getInstance;
class LonelyActivity extends Activity {
Tracker tracker = getInstance().getTracker();
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
...
tracker.trackStarted();
}
}
@PreusslerBerlin
import static Dependencies.getInstance;
class LonelyActivity extends Activity {
Tracker tracker = getInstance().getTracker();
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
...
tracker.trackStarted();
}
}
@PreusslerBerlin
@Mock Tracker tracker;
@Before
public void setup() {
…
Dependencies.instance = mock(Dependencies.class);
when(Dependencies.instance.getTracker())
.thenReturn(tracker);
}
@Test
public void should_track() {
new SimpleActivity().onCreate(null);
verify(tracker).trackStarted();
}
@PreusslerBerlin
@Mock Tracker tracker;
@Before
public void setup() {
…
Dependencies.instance = mock(Dependencies.class);
when(Dependencies.instance.getTracker())
.thenReturn(tracker);
}
@Test
public void should_track() {
new SimpleActivity().onCreate(null);
verify(tracker).trackStarted();
}
@PreusslerBerlin
@Mock Tracker tracker;
@Before
public void setup() {
…
Dependencies.instance = mock(Dependencies.class);
when(Dependencies.instance.getTracker())
.thenReturn(tracker);
}
@Test
public void should_track() {
new SimpleActivity().onCreate(null);
verify(tracker).trackStarted();
}
@PreusslerBerlin
+/- Somehow testable
- Not very dynamic
- Lots of code
@PreusslerBerlin
Act II
The Map
@PreusslerBerlin
public class Dependencies {
static Map<Class, Class> modules = new HashMap<>();
static {
modules.put(
Tracker.class,
new GoogleAnalyticsTracker());
}
public static <T> T get(Class<T> clzz) {
return (T) modules.get(clzz);
}
}
@PreusslerBerlin
public class Dependencies {
static Map<Class, Class> modules = new HashMap<>();
static {
modules.put(
Tracker.class,
new GoogleAnalyticsTracker());
}
public static <T> T get(Class<T> clzz) {
return (T) modules.get(clzz);
}
}
@PreusslerBerlin
import static Dependencies.getInstance;
class LonelyActivity extends Activity {
Tracker tracker = getInstance().get(Tracker.class);
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
...
tracker.trackStarted();
}
}
@PreusslerBerlin
import static Dependencies.getInstance;
class LonelyActivity extends Activity {
Tracker tracker = getInstance().get(Tracker.class);
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
...
tracker.trackStarted();
}
}
@PreusslerBerlin
+ Testable
+ Dynamic
- Instances created at startup
@PreusslerBerlin
Act III
Reflection(s)
@PreusslerBerlin
public class Dependencies {
private final static Map<Class, Class> modules
= new HashMap<>();
static {
modules.put(
Tracker.class,
GoogleAnalyticsTracker.class);
}
static <T> T get(Class<T> clzz) {
…
@PreusslerBerlin
public class GoogleAnalyticsTracker implements Tracker {
GoogleAnalyticsTracker(Activity activity) {
...}
GoogleAnalyticsTracker(Application application) {
...}
GoogleAnalyticsTracker(Context context) {
...}
...
@PreusslerBerlin
public class GoogleAnalyticsTracker implements Tracker {
GoogleAnalyticsTracker(Activity activity) {
...}
GoogleAnalyticsTracker(Application application) {
...}
@Inject
GoogleAnalyticsTracker(Context context) {
...}
...
@PreusslerBerlin
package javax.inject;
@Target({ METHOD, CONSTRUCTOR, FIELD })
@Retention(RUNTIME)
public @interface Inject {}
@PreusslerBerlin
public class Dependencies {
private final static Map<Class, Class> modules
= new HashMap<>();
static {
modules.put(
Tracker.class,
GoogleAnalyticsTracker.class);
}
static <T> T get(Class<T> clzz) {
…
@PreusslerBerlin
static <T> T get(Class<T> clzz) {
…
Constructor<?>[] constructors =
clzz.getDeclaredConstructors();
for(Constructor ctr: constructors) {
@PreusslerBerlin
static <T> T get(Class<T> clzz) {
…
Constructor<?>[] constructors =
clzz.getDeclaredConstructors();
for(Constructor ctr: constructors) {
@PreusslerBerlin
...
if(ctr.getDeclaredAnnotation(Inject.class)
!= null) {
Class[] types = ctr.getParameterTypes();
Object[] params =
new Object[types.length];
for (int i=1; i< params.length; i++) {
params[i] = get(types[i]);
}
@PreusslerBerlin
if(ctr.getDeclaredAnnotation(Inject.class)
!= null) {
Class[] types = ctr.getParameterTypes();
Object[] params =
new Object[types.length];
for (int i=1; i< params.length; i++) {
params[i] = get(types[i]);
}
@PreusslerBerlin
if(ctr.getDeclaredAnnotation(Inject.class)
!= null) {
Class[] types = ctr.getParameterTypes();
Object[] params =
new Object[types.length];
for (int i=1; i< params.length; i++) {
params[i] = get(types[i]);
}
@PreusslerBerlin
...
try {
return (T) ctr.newInstance(params);
} catch (Exception e) {
...
}
@PreusslerBerlin
import static Dependencies.getInstance;
class LonelyActivity extends Activity {
Tracker tracker = getInstance().get(Tracker.class);
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
...
tracker.trackStarted();
}
}
@PreusslerBerlin
import static Dependencies.getInstance;
class LonelyActivity extends Activity {
Tracker tracker = getInstance().get(Tracker.class);
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
...
tracker.trackStarted();
}
}
@PreusslerBerlin
+ Testable
+ Dynamic
+ Flexible
@PreusslerBerlin
Can we improve that?
@PreusslerBerlin
import static Dependencies.getInstance;
class LonelyActivity extends Activity {
Tracker tracker = getInstance().get(Tracker.class);
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
...
tracker.trackStarted();
}
}
@PreusslerBerlin
import static Dependencies.getInstance;
class LonelyActivity extends Activity {
Tracker tracker = getInstance().get(Tracker.class);
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
...
tracker.trackStarted();
}
}
@PreusslerBerlin
import static Dependencies.getInstance;
class LonelyActivity extends Activity {
@Inject Tracker tracker;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
...
tracker.trackStarted();
}
}
@PreusslerBerlin
import static Dependencies.getInstance;
class LonelyActivity extends Activity {
@Inject Tracker tracker;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
Dependencies.inject(this);
...
tracker.trackStarted();
}
}
@PreusslerBerlin
static void inject(Object instance) {
Field[] fields =
instance.getClass().getDeclaredFields();
for (Field f: fields) {
if (f.getDeclaredAnnotation(Inject.class) != null){
try {
field.set(instance, get(f.getType()));
} catch (IllegalAccessException e) {...}
...
@PreusslerBerlin
static void inject(Object instance) {
Field[] fields =
instance.getClass().getDeclaredFields();
for (Field f: fields) {
if (f.getDeclaredAnnotation(Inject.class) != null){
try {
field.set(instance, get(f.getType()));
} catch (IllegalAccessException e) {...}
...
@PreusslerBerlin
static void inject(Object instance) {
Field[] fields =
instance.getClass().getDeclaredFields();
for (Field f: fields) {
if (f.getDeclaredAnnotation(Inject.class) != null){
try {
field.set(instance, get(f.getType()));
} catch (IllegalAccessException e) {...}
...
@PreusslerBerlin
static void inject(Object instance) {
Field[] fields =
instance.getClass().getDeclaredFields();
for (Field f: fields) {
if (f.getDeclaredAnnotation(Inject.class) != null){
try {
field.set(instance, get(f.getType()));
} catch (IllegalAccessException e) {...}
...
@PreusslerBerlin
OMG,
We just built
@PreusslerBerlin
OMG,
We just built
Guice!
@PreusslerBerlin
OMG,
We just built
RoboGuice!
@PreusslerBerlin
OMG,
We just built
RoboGuice!
@PreusslerBerlin
import static Dependencies.getInstance;
class LonelyActivity extends Activity {
@Inject Tracker tracker;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
Dependencies.inject(this);
...
tracker.trackStarted();
}
}
@PreusslerBerlin
- Reflection is slow
@PreusslerBerlin
"Avoid dependency injection frameworks”
- Google
developer.android.com/training/articles/memory.html#DependencyInjection
till early 2016
@PreusslerBerlin
Act IV
Compiler Magic
@PreusslerBerlin
Annotation processing
&
Code generation
@PreusslerBerlin
Here comes
Dagger as Hero
@PreusslerBerlin
The end!?
@PreusslerBerlin
In its first screen appearance:
Toothpick
as unknown stranger
@PreusslerBerlin
“YOUR boilerplate sucks”
@PreusslerBerlin
“YOU don’t even know
how to unit test!”
@PreusslerBerlin
Fight!
@PreusslerBerlin
The module
@PreusslerBerlin
@Module
static class BaseModule {
...
BaseModule(Application application) {
...
}
@Provides
public Tracker provideTracker() {
return new GoogleAnalyticsTracker();
}
}
@PreusslerBerlin
class BaseModule extends Module {
public BaseModule(Application application) {
bind(Tracker.class)
.to(GoogleAnalyticsTracker.class);
...
@PreusslerBerlin
The component
@PreusslerBerlin
@Component(modules = {BaseModule.class})
interface AppComponent {
void inject(LonelyActivity activity);
}
@PreusslerBerlin
“WHAT component???”
@PreusslerBerlin
Setup
Dagger 0 : 1 Toothpick
@PreusslerBerlin
Usage
@PreusslerBerlin
class LonelyActivity extends Activity {
@Inject Tracker tracker;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
...
tracker.trackStarted();
}
}
@PreusslerBerlin
class MainApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
DaggerDependencies_AppComponent
.builder()
.baseModule(
new BaseModule(this))
.build()
@PreusslerBerlin
class LonelyActivity extends Activity {
@Inject Tracker tracker;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
getApplication().getComponent().inject(this);
tracker.trackStarted();
}
}
@PreusslerBerlin
Scope scope =
openScope("APPLICATION")
scope.installModules(
new BaseModule(application));
@PreusslerBerlin
import static Toothpick.openScope;
class LonelyActivity extends Activity {
@Inject Tracker tracker;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
openScope("APPLICATION").inject(this);
tracker.trackStarted();
}
}
@PreusslerBerlin
Usage
Dagger 1 : 2 Toothpick
@PreusslerBerlin
Testing
@PreusslerBerlin
Testing
@PreusslerBerlin
@Mock Tracker tracker;
class TestModule extends Dependencies.BaseModule {
TestModule() {
super(mock(Application.class));
}
@Provides
public Tracker provideTracker() {
return tracker;
}
}
}
@PreusslerBerlin
@Mock Tracker tracker;
class TestModule extends Dependencies.BaseModule {
TestModule() {
super(mock(Application.class));
}
@Provides
public Tracker provideTracker() {
return tracker;
}
}
}
@PreusslerBerlin
@Test
public void should_track() {
Application.set(
DaggerDependencies_AppComponent
.builder().baseModule(
new TestModule()).build());
new LonelyActivity().onCreate(null);
verify(tracker).trackStarted();
}
...
}
@PreusslerBerlin
@Test
public void should_track() {
Application.set(
DaggerDependencies_AppComponent
.builder().baseModule(
new TestModule()).build());
new LonelyActivity().onCreate(null);
verify(tracker).trackStarted();
}
...
}
@PreusslerBerlin
@Mock Tracker tracker;
@Rule
public ToothPickRule toothPickRule =
new ToothPickRule(this, "APPLICATION_SCOPE");
@Test
public void should_track() {
new LonelyActivity().onCreate(null);
verify(tracker).trackStarted();
}
@PreusslerBerlin
@Mock Tracker tracker;
@Rule
public ToothPickRule toothPickRule =
new ToothPickRule(this, "APPLICATION_SCOPE");
@Test
public void should_track() {
new LonelyActivity().onCreate(null);
verify(tracker).trackStarted();
}
@PreusslerBerlin
Testing
Dagger 1 : 3 Toothpick
@PreusslerBerlin
Scopes
@PreusslerBerlin
@Singleton
@PreusslerBerlin
@Scope
@Retention(RUNTIME)
public @interface ActivityScope {}
@ActivityScope
@Subcomponent(modules = {ScopeModule.class})
interface ScopeComponent {
void inject(ScopeActivity activity);
}
@PreusslerBerlin
@Module
static class ScopeModule {
private Activity activity;
public ScopeModule(Activity activity) {
this.activity = activity;
}
@Provides @ActivityScope
public Activity provideActivity() {
return activity;
}
}
@PreusslerBerlin
@Component(modules = {BaseModule.class})
interface AppComponent {
void inject(LonelyActivity activity);
ScopeComponent plus(ScopeModule module);
}
@PreusslerBerlin
“That’s Annotation Porn!”
@PreusslerBerlin
public class ScopeActivity extends Activity {
…
private ScopeComponent scope;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
setContentView(R.layout.activity_main);
scope = createScope(this);
scope.inject(this);
…
}
// call from fragments...
public ScopeComponent getScope() {
return scope;
}
}
@PreusslerBerlin
public class ScopeActivity extends Activity {
…
private ScopeComponent scope;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
setContentView(R.layout.activity_main);
scope = createScope(this);
scope.inject(this);
…
}
// call from fragments...
public ScopeComponent getScope() {
return scope;
}
}
@PreusslerBerlin
“Stop this madness!”
@PreusslerBerlin
class ScopeModule extends Module {
public ScopeModule(Activity activity) {
bind(Activity.class).toInstance(activity);
}
@PreusslerBerlin
Scope scope =
openScopes(”APPLICATION_SCOPE”,
activity.getClass().getName());
scope.installModules(
new ScopeModule(activity));
@PreusslerBerlin
Scope scope =
openScopes(”APPLICATION_SCOPE”,
activity.getClass().getName());
scope.installModules(
new ScopeModule(activity));
@PreusslerBerlin
closeScope(
activity.getClass().getName());
@PreusslerBerlin
Scopes
Dagger 1 : 4 Toothpick
@PreusslerBerlin
Performance
1000 injections
• Dagger 1: 33 ms
• Dagger 2: 31 ms
• Toothpick: 35 ms
6400 injections
• Dagger 1: 45 ms
• Dagger 2: 42 ms
• Toothpick: 66 ms
@PreusslerBerlin
Performance
Dagger 2 : 4 Toothpick
@PreusslerBerlin
And there is more:
SmoothieModule
@PreusslerBerlin
Ease of
use
Speed
Roboguice
Dagger
Toothpick
@PreusslerBerlin
Dagger:
+ compile safe
+ feature rich
+ performant
@PreusslerBerlin
Dagger:
-heavy weight
- top down
- annotation porn
- hard on unit tests
@PreusslerBerlin
Toothpick:
+ light weight
+ bottom up
+ less boilerplate
+ testing focus
@PreusslerBerlin
Toothpick:
-not idiot proof
- performance
@PreusslerBerlin
Choose the
right tool
for your
problem!
ABetterToolbyTheMarmot,CCby2.0,flickr.com/photos/themarmot/6283203163
@PreusslerBerlin
github.com/
dpreussler/
understand_dependencies
@PreusslerBerlin
TP written by
Stephane Nicolas
Daniel Molinero Reguera
Presented by
Danny Preussler
Special thanks to
Florina Muntenescu

Weitere ähnliche Inhalte

Was ist angesagt?

DjangoCon US 2011 - Monkeying around at New Relic
DjangoCon US 2011 - Monkeying around at New RelicDjangoCon US 2011 - Monkeying around at New Relic
DjangoCon US 2011 - Monkeying around at New RelicGraham Dumpleton
 
Android Unit Testing With Robolectric
Android Unit Testing With RobolectricAndroid Unit Testing With Robolectric
Android Unit Testing With RobolectricDanny Preussler
 
Spock: A Highly Logical Way To Test
Spock: A Highly Logical Way To TestSpock: A Highly Logical Way To Test
Spock: A Highly Logical Way To TestHoward Lewis Ship
 
Java libraries you can't afford to miss
Java libraries you can't afford to missJava libraries you can't afford to miss
Java libraries you can't afford to missAndres Almiray
 
Introduction to web programming for java and c# programmers by @drpicox
Introduction to web programming for java and c# programmers by @drpicoxIntroduction to web programming for java and c# programmers by @drpicox
Introduction to web programming for java and c# programmers by @drpicoxDavid Rodenas
 
Redux for ReactJS Programmers
Redux for ReactJS ProgrammersRedux for ReactJS Programmers
Redux for ReactJS ProgrammersDavid Rodenas
 
Java Bytecode for Discriminating Developers - JavaZone 2011
Java Bytecode for Discriminating Developers - JavaZone 2011Java Bytecode for Discriminating Developers - JavaZone 2011
Java Bytecode for Discriminating Developers - JavaZone 2011Anton Arhipov
 
JEEConf 2017 - The hitchhiker’s guide to Java class reloading
JEEConf 2017 - The hitchhiker’s guide to Java class reloadingJEEConf 2017 - The hitchhiker’s guide to Java class reloading
JEEConf 2017 - The hitchhiker’s guide to Java class reloadingAnton Arhipov
 
An introduction to Google test framework
An introduction to Google test frameworkAn introduction to Google test framework
An introduction to Google test frameworkAbner Chih Yi Huang
 
Unit/Integration Testing using Spock
Unit/Integration Testing using SpockUnit/Integration Testing using Spock
Unit/Integration Testing using SpockAnuj Aneja
 
Construire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleConstruire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleThierry Wasylczenko
 
Smarter Testing With Spock
Smarter Testing With SpockSmarter Testing With Spock
Smarter Testing With SpockIT Weekend
 
Smarter Testing with Spock
Smarter Testing with SpockSmarter Testing with Spock
Smarter Testing with SpockDmitry Voloshko
 
Spock: Test Well and Prosper
Spock: Test Well and ProsperSpock: Test Well and Prosper
Spock: Test Well and ProsperKen Kousen
 
ReactJS for Programmers
ReactJS for ProgrammersReactJS for Programmers
ReactJS for ProgrammersDavid Rodenas
 

Was ist angesagt? (20)

DjangoCon US 2011 - Monkeying around at New Relic
DjangoCon US 2011 - Monkeying around at New RelicDjangoCon US 2011 - Monkeying around at New Relic
DjangoCon US 2011 - Monkeying around at New Relic
 
Android Unit Testing With Robolectric
Android Unit Testing With RobolectricAndroid Unit Testing With Robolectric
Android Unit Testing With Robolectric
 
Spock: A Highly Logical Way To Test
Spock: A Highly Logical Way To TestSpock: A Highly Logical Way To Test
Spock: A Highly Logical Way To Test
 
Introduzione al TDD
Introduzione al TDDIntroduzione al TDD
Introduzione al TDD
 
Spock
SpockSpock
Spock
 
Java libraries you can't afford to miss
Java libraries you can't afford to missJava libraries you can't afford to miss
Java libraries you can't afford to miss
 
Introduction to web programming for java and c# programmers by @drpicox
Introduction to web programming for java and c# programmers by @drpicoxIntroduction to web programming for java and c# programmers by @drpicox
Introduction to web programming for java and c# programmers by @drpicox
 
Redux for ReactJS Programmers
Redux for ReactJS ProgrammersRedux for ReactJS Programmers
Redux for ReactJS Programmers
 
Java Bytecode for Discriminating Developers - JavaZone 2011
Java Bytecode for Discriminating Developers - JavaZone 2011Java Bytecode for Discriminating Developers - JavaZone 2011
Java Bytecode for Discriminating Developers - JavaZone 2011
 
JEEConf 2017 - The hitchhiker’s guide to Java class reloading
JEEConf 2017 - The hitchhiker’s guide to Java class reloadingJEEConf 2017 - The hitchhiker’s guide to Java class reloading
JEEConf 2017 - The hitchhiker’s guide to Java class reloading
 
GMock framework
GMock frameworkGMock framework
GMock framework
 
An introduction to Google test framework
An introduction to Google test frameworkAn introduction to Google test framework
An introduction to Google test framework
 
Unit/Integration Testing using Spock
Unit/Integration Testing using SpockUnit/Integration Testing using Spock
Unit/Integration Testing using Spock
 
Construire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleConstruire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradle
 
Smarter Testing With Spock
Smarter Testing With SpockSmarter Testing With Spock
Smarter Testing With Spock
 
Smarter Testing with Spock
Smarter Testing with SpockSmarter Testing with Spock
Smarter Testing with Spock
 
Spock: Test Well and Prosper
Spock: Test Well and ProsperSpock: Test Well and Prosper
Spock: Test Well and Prosper
 
groovy & grails - lecture 7
groovy & grails - lecture 7groovy & grails - lecture 7
groovy & grails - lecture 7
 
JS and patterns
JS and patternsJS and patterns
JS and patterns
 
ReactJS for Programmers
ReactJS for ProgrammersReactJS for Programmers
ReactJS for Programmers
 

Andere mochten auch

Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014
Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014
Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014Danny Preussler
 
Unit Testing on Android: why and how? DevFest Romania, Bucharest 2016
Unit Testing on Android: why and how? DevFest Romania, Bucharest 2016Unit Testing on Android: why and how? DevFest Romania, Bucharest 2016
Unit Testing on Android: why and how? DevFest Romania, Bucharest 2016Danny Preussler
 
Agile for Embedded & System Software Development : Presented by Priyank KS
Agile for Embedded & System Software Development : Presented by Priyank KS Agile for Embedded & System Software Development : Presented by Priyank KS
Agile for Embedded & System Software Development : Presented by Priyank KS oGuild .
 
Interfaces to ubiquitous computing
Interfaces to ubiquitous computingInterfaces to ubiquitous computing
Interfaces to ubiquitous computingswati sonawane
 
iBeacons: Security and Privacy?
iBeacons: Security and Privacy?iBeacons: Security and Privacy?
iBeacons: Security and Privacy?Jim Fenton
 
Agile London: Industrial Agility, How to respond to the 4th Industrial Revolu...
Agile London: Industrial Agility, How to respond to the 4th Industrial Revolu...Agile London: Industrial Agility, How to respond to the 4th Industrial Revolu...
Agile London: Industrial Agility, How to respond to the 4th Industrial Revolu...Paolo Sammicheli
 
HUG Ireland Event Presentation - In-Memory Databases
HUG Ireland Event Presentation - In-Memory DatabasesHUG Ireland Event Presentation - In-Memory Databases
HUG Ireland Event Presentation - In-Memory DatabasesJohn Mulhall
 
Agile Methodology PPT
Agile Methodology PPTAgile Methodology PPT
Agile Methodology PPTMohit Kumar
 
Skiena algorithm 2007 lecture07 heapsort priority queues
Skiena algorithm 2007 lecture07 heapsort priority queuesSkiena algorithm 2007 lecture07 heapsort priority queues
Skiena algorithm 2007 lecture07 heapsort priority queueszukun
 
Privacy Concerns and Social Robots
Privacy Concerns and Social Robots Privacy Concerns and Social Robots
Privacy Concerns and Social Robots Christoph Lutz
 
ScrumGuides training: Agile Software Development With Scrum
ScrumGuides training: Agile Software Development With ScrumScrumGuides training: Agile Software Development With Scrum
ScrumGuides training: Agile Software Development With ScrumAlexey Krivitsky
 
Design & Analysis of Algorithms Lecture Notes
Design & Analysis of Algorithms Lecture NotesDesign & Analysis of Algorithms Lecture Notes
Design & Analysis of Algorithms Lecture NotesFellowBuddy.com
 
Final Year Project-Gesture Based Interaction and Image Processing
Final Year Project-Gesture Based Interaction and Image ProcessingFinal Year Project-Gesture Based Interaction and Image Processing
Final Year Project-Gesture Based Interaction and Image ProcessingSabnam Pandey, MBA
 
09 Machine Learning - Introduction Support Vector Machines
09 Machine Learning - Introduction Support Vector Machines09 Machine Learning - Introduction Support Vector Machines
09 Machine Learning - Introduction Support Vector MachinesAndres Mendez-Vazquez
 
Going native with less coupling: Dependency Injection in C++
Going native with less coupling: Dependency Injection in C++Going native with less coupling: Dependency Injection in C++
Going native with less coupling: Dependency Injection in C++Daniele Pallastrelli
 
In-Memory Database Performance on AWS M4 Instances
In-Memory Database Performance on AWS M4 InstancesIn-Memory Database Performance on AWS M4 Instances
In-Memory Database Performance on AWS M4 InstancesSingleStore
 
Machine learning support vector machines
Machine learning   support vector machinesMachine learning   support vector machines
Machine learning support vector machinesSjoerd Maessen
 

Andere mochten auch (20)

Toothpick & Dependency Injection
Toothpick & Dependency InjectionToothpick & Dependency Injection
Toothpick & Dependency Injection
 
Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014
Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014
Bye Bye Charles, Welcome Odo, Android Meetup Berlin May 2014
 
Unit Testing on Android: why and how? DevFest Romania, Bucharest 2016
Unit Testing on Android: why and how? DevFest Romania, Bucharest 2016Unit Testing on Android: why and how? DevFest Romania, Bucharest 2016
Unit Testing on Android: why and how? DevFest Romania, Bucharest 2016
 
Agile for Embedded & System Software Development : Presented by Priyank KS
Agile for Embedded & System Software Development : Presented by Priyank KS Agile for Embedded & System Software Development : Presented by Priyank KS
Agile for Embedded & System Software Development : Presented by Priyank KS
 
3.7 heap sort
3.7 heap sort3.7 heap sort
3.7 heap sort
 
Interfaces to ubiquitous computing
Interfaces to ubiquitous computingInterfaces to ubiquitous computing
Interfaces to ubiquitous computing
 
iBeacons: Security and Privacy?
iBeacons: Security and Privacy?iBeacons: Security and Privacy?
iBeacons: Security and Privacy?
 
Dependency Injection with Apex
Dependency Injection with ApexDependency Injection with Apex
Dependency Injection with Apex
 
Agile London: Industrial Agility, How to respond to the 4th Industrial Revolu...
Agile London: Industrial Agility, How to respond to the 4th Industrial Revolu...Agile London: Industrial Agility, How to respond to the 4th Industrial Revolu...
Agile London: Industrial Agility, How to respond to the 4th Industrial Revolu...
 
HUG Ireland Event Presentation - In-Memory Databases
HUG Ireland Event Presentation - In-Memory DatabasesHUG Ireland Event Presentation - In-Memory Databases
HUG Ireland Event Presentation - In-Memory Databases
 
Agile Methodology PPT
Agile Methodology PPTAgile Methodology PPT
Agile Methodology PPT
 
Skiena algorithm 2007 lecture07 heapsort priority queues
Skiena algorithm 2007 lecture07 heapsort priority queuesSkiena algorithm 2007 lecture07 heapsort priority queues
Skiena algorithm 2007 lecture07 heapsort priority queues
 
Privacy Concerns and Social Robots
Privacy Concerns and Social Robots Privacy Concerns and Social Robots
Privacy Concerns and Social Robots
 
ScrumGuides training: Agile Software Development With Scrum
ScrumGuides training: Agile Software Development With ScrumScrumGuides training: Agile Software Development With Scrum
ScrumGuides training: Agile Software Development With Scrum
 
Design & Analysis of Algorithms Lecture Notes
Design & Analysis of Algorithms Lecture NotesDesign & Analysis of Algorithms Lecture Notes
Design & Analysis of Algorithms Lecture Notes
 
Final Year Project-Gesture Based Interaction and Image Processing
Final Year Project-Gesture Based Interaction and Image ProcessingFinal Year Project-Gesture Based Interaction and Image Processing
Final Year Project-Gesture Based Interaction and Image Processing
 
09 Machine Learning - Introduction Support Vector Machines
09 Machine Learning - Introduction Support Vector Machines09 Machine Learning - Introduction Support Vector Machines
09 Machine Learning - Introduction Support Vector Machines
 
Going native with less coupling: Dependency Injection in C++
Going native with less coupling: Dependency Injection in C++Going native with less coupling: Dependency Injection in C++
Going native with less coupling: Dependency Injection in C++
 
In-Memory Database Performance on AWS M4 Instances
In-Memory Database Performance on AWS M4 InstancesIn-Memory Database Performance on AWS M4 Instances
In-Memory Database Performance on AWS M4 Instances
 
Machine learning support vector machines
Machine learning   support vector machinesMachine learning   support vector machines
Machine learning support vector machines
 

Ähnlich wie Demystifying dependency Injection: Dagger and Toothpick

2013 DevFest Vienna - Bad Tests, Good Tests
2013 DevFest Vienna - Bad Tests, Good Tests2013 DevFest Vienna - Bad Tests, Good Tests
2013 DevFest Vienna - Bad Tests, Good TestsTomek Kaczanowski
 
Object Oriented JavaScript
Object Oriented JavaScriptObject Oriented JavaScript
Object Oriented JavaScriptJulie Iskander
 
Ian 20150116 java script oop
Ian 20150116 java script oopIan 20150116 java script oop
Ian 20150116 java script oopLearningTech
 
The Groovy Way of Testing with Spock
The Groovy Way of Testing with SpockThe Groovy Way of Testing with Spock
The Groovy Way of Testing with SpockNaresha K
 
AST Transformations at JFokus
AST Transformations at JFokusAST Transformations at JFokus
AST Transformations at JFokusHamletDRC
 
Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018
Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018
Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018Codemotion
 
Object-Oriented Javascript
Object-Oriented JavascriptObject-Oriented Javascript
Object-Oriented Javascriptkvangork
 
Object-Oriented JavaScript
Object-Oriented JavaScriptObject-Oriented JavaScript
Object-Oriented JavaScriptkvangork
 
Design patterns in javascript
Design patterns in javascriptDesign patterns in javascript
Design patterns in javascriptMiao Siyu
 
Testdrevet javautvikling på objektorienterte skinner
Testdrevet javautvikling på objektorienterte skinnerTestdrevet javautvikling på objektorienterte skinner
Testdrevet javautvikling på objektorienterte skinnerTruls Jørgensen
 
JavaScript Classes and Inheritance
JavaScript Classes and InheritanceJavaScript Classes and Inheritance
JavaScript Classes and Inheritancemarcheiligers
 
srcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docx
srcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docxsrcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docx
srcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docxwhitneyleman54422
 
JCConf 2015 - 輕鬆學google的雲端開發 - Google App Engine入門(上)
JCConf 2015  - 輕鬆學google的雲端開發 - Google App Engine入門(上)JCConf 2015  - 輕鬆學google的雲端開發 - Google App Engine入門(上)
JCConf 2015 - 輕鬆學google的雲端開發 - Google App Engine入門(上)Simon Su
 
Js 单元测试框架介绍
Js 单元测试框架介绍Js 单元测试框架介绍
Js 单元测试框架介绍louieuser
 
Having a problem figuring out where my errors are- The code is not run.pdf
Having a problem figuring out where my errors are- The code is not run.pdfHaving a problem figuring out where my errors are- The code is not run.pdf
Having a problem figuring out where my errors are- The code is not run.pdfNicholasflqStewartl
 

Ähnlich wie Demystifying dependency Injection: Dagger and Toothpick (20)

Java.lang.object
Java.lang.objectJava.lang.object
Java.lang.object
 
2013 DevFest Vienna - Bad Tests, Good Tests
2013 DevFest Vienna - Bad Tests, Good Tests2013 DevFest Vienna - Bad Tests, Good Tests
2013 DevFest Vienna - Bad Tests, Good Tests
 
Object Oriented JavaScript
Object Oriented JavaScriptObject Oriented JavaScript
Object Oriented JavaScript
 
Architecure components by Paulina Szklarska
Architecure components by Paulina SzklarskaArchitecure components by Paulina Szklarska
Architecure components by Paulina Szklarska
 
Ian 20150116 java script oop
Ian 20150116 java script oopIan 20150116 java script oop
Ian 20150116 java script oop
 
The Groovy Way of Testing with Spock
The Groovy Way of Testing with SpockThe Groovy Way of Testing with Spock
The Groovy Way of Testing with Spock
 
AST Transformations at JFokus
AST Transformations at JFokusAST Transformations at JFokus
AST Transformations at JFokus
 
Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018
Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018
Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018
 
Object-Oriented Javascript
Object-Oriented JavascriptObject-Oriented Javascript
Object-Oriented Javascript
 
Object-Oriented JavaScript
Object-Oriented JavaScriptObject-Oriented JavaScript
Object-Oriented JavaScript
 
Rd
RdRd
Rd
 
OOP Lab Report.docx
OOP Lab Report.docxOOP Lab Report.docx
OOP Lab Report.docx
 
Design patterns in javascript
Design patterns in javascriptDesign patterns in javascript
Design patterns in javascript
 
Testdrevet javautvikling på objektorienterte skinner
Testdrevet javautvikling på objektorienterte skinnerTestdrevet javautvikling på objektorienterte skinner
Testdrevet javautvikling på objektorienterte skinner
 
JavaScript Classes and Inheritance
JavaScript Classes and InheritanceJavaScript Classes and Inheritance
JavaScript Classes and Inheritance
 
srcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docx
srcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docxsrcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docx
srcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docx
 
JCConf 2015 - 輕鬆學google的雲端開發 - Google App Engine入門(上)
JCConf 2015  - 輕鬆學google的雲端開發 - Google App Engine入門(上)JCConf 2015  - 輕鬆學google的雲端開發 - Google App Engine入門(上)
JCConf 2015 - 輕鬆學google的雲端開發 - Google App Engine入門(上)
 
Js 单元测试框架介绍
Js 单元测试框架介绍Js 单元测试框架介绍
Js 单元测试框架介绍
 
Having a problem figuring out where my errors are- The code is not run.pdf
Having a problem figuring out where my errors are- The code is not run.pdfHaving a problem figuring out where my errors are- The code is not run.pdf
Having a problem figuring out where my errors are- The code is not run.pdf
 
Mockito intro
Mockito introMockito intro
Mockito intro
 

Mehr von Danny Preussler

We aint got no time - Droidcon Nairobi
We aint got no time - Droidcon NairobiWe aint got no time - Droidcon Nairobi
We aint got no time - Droidcon NairobiDanny Preussler
 
Test Driven Development on Android (Kotlin Kenya)
Test Driven Development on Android (Kotlin Kenya)Test Driven Development on Android (Kotlin Kenya)
Test Driven Development on Android (Kotlin Kenya)Danny Preussler
 
TDD on android. Why and How? (Coding Serbia 2019)
TDD on android. Why and How? (Coding Serbia 2019)TDD on android. Why and How? (Coding Serbia 2019)
TDD on android. Why and How? (Coding Serbia 2019)Danny Preussler
 
TDD on Android (Øredev 2018)
TDD on Android (Øredev 2018)TDD on Android (Øredev 2018)
TDD on Android (Øredev 2018)Danny Preussler
 
Junit5: the next gen of testing, don't stay behind
Junit5: the next gen of testing, don't stay behindJunit5: the next gen of testing, don't stay behind
Junit5: the next gen of testing, don't stay behindDanny Preussler
 
All around the world, localization and internationalization on Android (Droid...
All around the world, localization and internationalization on Android (Droid...All around the world, localization and internationalization on Android (Droid...
All around the world, localization and internationalization on Android (Droid...Danny Preussler
 
(Android) Developer Survival in Multiscreen World, MobCon Sofia 2016
(Android) Developer Survival in Multiscreen World, MobCon Sofia 2016(Android) Developer Survival in Multiscreen World, MobCon Sofia 2016
(Android) Developer Survival in Multiscreen World, MobCon Sofia 2016Danny Preussler
 
Unit testing on Android (Droidcon Dubai 2015)
Unit testing on Android (Droidcon Dubai 2015)Unit testing on Android (Droidcon Dubai 2015)
Unit testing on Android (Droidcon Dubai 2015)Danny Preussler
 
Clean code on Android (Droidcon Dubai 2015)
Clean code on Android (Droidcon Dubai 2015)Clean code on Android (Droidcon Dubai 2015)
Clean code on Android (Droidcon Dubai 2015)Danny Preussler
 
More android code puzzles
More android code puzzlesMore android code puzzles
More android code puzzlesDanny Preussler
 
Abgeschottete Realität - Testen im Emulator, Mobile Testing Days 2014, Berlin
Abgeschottete Realität - Testen im Emulator, Mobile Testing Days 2014, BerlinAbgeschottete Realität - Testen im Emulator, Mobile Testing Days 2014, Berlin
Abgeschottete Realität - Testen im Emulator, Mobile Testing Days 2014, BerlinDanny Preussler
 
Rockstar Android Testing (Mobile TechCon Munich 2014)
Rockstar Android Testing (Mobile TechCon Munich 2014)Rockstar Android Testing (Mobile TechCon Munich 2014)
Rockstar Android Testing (Mobile TechCon Munich 2014)Danny Preussler
 
Android Code Puzzles (DroidCon Amsterdam 2012)
Android Code Puzzles (DroidCon Amsterdam 2012)Android Code Puzzles (DroidCon Amsterdam 2012)
Android Code Puzzles (DroidCon Amsterdam 2012)Danny Preussler
 

Mehr von Danny Preussler (13)

We aint got no time - Droidcon Nairobi
We aint got no time - Droidcon NairobiWe aint got no time - Droidcon Nairobi
We aint got no time - Droidcon Nairobi
 
Test Driven Development on Android (Kotlin Kenya)
Test Driven Development on Android (Kotlin Kenya)Test Driven Development on Android (Kotlin Kenya)
Test Driven Development on Android (Kotlin Kenya)
 
TDD on android. Why and How? (Coding Serbia 2019)
TDD on android. Why and How? (Coding Serbia 2019)TDD on android. Why and How? (Coding Serbia 2019)
TDD on android. Why and How? (Coding Serbia 2019)
 
TDD on Android (Øredev 2018)
TDD on Android (Øredev 2018)TDD on Android (Øredev 2018)
TDD on Android (Øredev 2018)
 
Junit5: the next gen of testing, don't stay behind
Junit5: the next gen of testing, don't stay behindJunit5: the next gen of testing, don't stay behind
Junit5: the next gen of testing, don't stay behind
 
All around the world, localization and internationalization on Android (Droid...
All around the world, localization and internationalization on Android (Droid...All around the world, localization and internationalization on Android (Droid...
All around the world, localization and internationalization on Android (Droid...
 
(Android) Developer Survival in Multiscreen World, MobCon Sofia 2016
(Android) Developer Survival in Multiscreen World, MobCon Sofia 2016(Android) Developer Survival in Multiscreen World, MobCon Sofia 2016
(Android) Developer Survival in Multiscreen World, MobCon Sofia 2016
 
Unit testing on Android (Droidcon Dubai 2015)
Unit testing on Android (Droidcon Dubai 2015)Unit testing on Android (Droidcon Dubai 2015)
Unit testing on Android (Droidcon Dubai 2015)
 
Clean code on Android (Droidcon Dubai 2015)
Clean code on Android (Droidcon Dubai 2015)Clean code on Android (Droidcon Dubai 2015)
Clean code on Android (Droidcon Dubai 2015)
 
More android code puzzles
More android code puzzlesMore android code puzzles
More android code puzzles
 
Abgeschottete Realität - Testen im Emulator, Mobile Testing Days 2014, Berlin
Abgeschottete Realität - Testen im Emulator, Mobile Testing Days 2014, BerlinAbgeschottete Realität - Testen im Emulator, Mobile Testing Days 2014, Berlin
Abgeschottete Realität - Testen im Emulator, Mobile Testing Days 2014, Berlin
 
Rockstar Android Testing (Mobile TechCon Munich 2014)
Rockstar Android Testing (Mobile TechCon Munich 2014)Rockstar Android Testing (Mobile TechCon Munich 2014)
Rockstar Android Testing (Mobile TechCon Munich 2014)
 
Android Code Puzzles (DroidCon Amsterdam 2012)
Android Code Puzzles (DroidCon Amsterdam 2012)Android Code Puzzles (DroidCon Amsterdam 2012)
Android Code Puzzles (DroidCon Amsterdam 2012)
 

Kürzlich hochgeladen

Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 

Kürzlich hochgeladen (20)

Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 

Demystifying dependency Injection: Dagger and Toothpick

Hinweis der Redaktion

  1. A code base, one activity, needed a tracker Needed in in a testable way
  2. A code base, one activity, needed a tracker Needed in in a testable way
  3. A code base, one activity, needed a tracker Needed in in a testable way
  4. A code base, one activity, needed a tracker Needed in in a testable way
  5. A code base, one activity, needed a tracker Needed in in a testable way
  6. A code base, one activity, needed a tracker Needed in in a testable way
  7. Same as before
  8. Same as before
  9. Todo split Show inject interface TODO show singleton! But needs lazy loading then! TODO in code!
  10. Known as @Inject
  11. Todo split Show inject interface TODO show singleton! But needs lazy loading then! TODO in code!
  12. Todo split Show inject interface TODO show singleton! But needs lazy loading then! TODO in code!
  13. Todo split Show inject interface TODO show singleton! But needs lazy loading then! TODO in code!
  14. Todo split Show inject interface TODO show singleton! But needs lazy loading then! TODO in code!
  15. Todo split Show inject interface TODO show singleton! But needs lazy loading then! TODO in code!
  16. Todo split Show inject interface TODO show singleton! But needs lazy loading then! TODO in code!
  17. Todo split Show inject interface TODO show singleton! But needs lazy loading then! TODO in code!
  18. Same as before
  19. Same as before
  20. Same as before
  21. Same as before
  22. Same as before
  23. Same as before
  24. Same as before
  25. Same as before
  26. Same as before
  27. Same as before
  28. RobGuice
  29. RobGuice
  30. Cheated a bit with some newer reflection methods
  31. Google slide NOI
  32. Problem google said don’t use Relfection is slow!
  33. Problem google said don’t use Relfection is slow!
  34. Problem google said don’t use Relfection is slow!
  35. Problem google said don’t use Relfection is slow!
  36. Add street figher
  37. Not in JSR
  38. Google slide NOI
  39. Same!
  40. Same!
  41. Lets try anway
  42. Lets try anway
  43. Dagger is heavy weight, top down, annotation porn, compile safe, faster, not for unit tests TP is light weight, bottom up, reduced boilerplate, runtime bases scopes, JSR conform, testing focused
  44. Dagger is heavy weight, top down, annotation porn, compile safe, faster, not for unit tests TP is light weight, bottom up, reduced boilerplate, runtime bases scopes, JSR conform, testing focused
  45. Dagger is heavy weight, top down, annotation porn, compile safe, faster, not for unit tests TP is light weight, bottom up, reduced boilerplate, runtime bases scopes, JSR conform, testing focused
  46. Dagger is heavy weight, top down, annotation porn, compile safe, faster, not for unit tests TP is light weight, bottom up, reduced boilerplate, runtime bases scopes, JSR conform, testing focused