SlideShare ist ein Scribd-Unternehmen logo
1 von 63
1. It is hard to change because every change affects too many other parts
of the system. (Rigidity - Starr)
2. When you make a change, unexpected parts of the system break.
(Fragility - Zerbrechlich)
3. It is hard to reuse in another application because it cannot be
disentangled from the current application. (Immobility - Unbeweglich)
Quelle: http://www.objectmentor.com/resources/articles/dip.pdf
A B X
• Basistechnologien (.Net, Java, Ruby, …)
• Basisdatentypen (int, string, char…)
• Datenhaltungsklassen und Transferobjekte
• Domänen spezifische Algorithmen und Datenbanken
• UI Logik
• …
beständig
unbeständig
User Interface
Business Layer
Data Access Layer
Cross
Cutting
Concerns
User Interface
Business Layer
Data Access Layer
Cross
Cutting
Concerns
A B Xb
?
Robert C. Martin
(Uncle Bob)
The SOLID principles are not rules. They are not laws.
They are not perfect truths. They are statements on
the order of “An apple a day keeps the doctor away.”
This is a good principle, it is good advice, but it’s not a
pure truth, nor is it a rule.
“
”
Quelle: https://sites.google.com/site/unclebobconsultingllc/getting-a-solid-start
ingle Responsibility Principle
pen Closed Principle
iskov Substitution Principle
nterface Segregation Principle
ependency Inversion Principle
S
O
L
I
D
ingle Responsibility Principle
pen Closed Principle
iskov Substitution Principle
nterface Segregation Principle
ependency Inversion Principle
S
O
L
I
D
Eine Klasse sollte nur eine Verantwortlichkeit
haben.
Quelle: http://www.clean-code-developer.de/
ingle Responsibility Principle
pen Closed Principle
iskov Substitution Principle
nterface Segregation Principle
ependency Inversion Principle
S
O
L
I
D
Eine Klasse sollte offen für Erweiterungen, jedoch
geschlossen für Modifikationen sein.
Quelle: http://www.clean-code-developer.de/
ingle Responsibility Principle
pen Closed Principle
iskov Substitution Principle
nterface Segregation Principle
ependency Inversion Principle
S
O
L
I
D
Abgeleitete Klassen sollten sich so verhalten wie es
von ihren Basistypen erwartet wird.
Quelle: http://www.clean-code-developer.de/
ingle Responsibility Principle
pen Closed Principle
iskov Substitution Principle
nterface Segregation Principle
ependency Inversion Principle
S
O
L
I
D
Interfaces sollten nur die Funktionalität
wiederspiegeln die ihre Klienten erwarten.
Quelle: http://www.clean-code-developer.de/
ingle Responsibility Principle
pen Closed Principle
iskov Substitution Principle
nterface Segregation Principle
ependency Inversion Principle
S
O
L
I
D
High-Level Klassen sollen nicht von Low-Level Klassen abhängig
sein, sondern beide von Abstraktionen.
Abstraktionen sollen nicht von Details abhängig sein, sondern
Details von Abstraktionen.
Quelle: Wikipedia.org
High-Level Klassen sollen nicht von Low-Level
Klassen abhängig sein, sondern beide von
Abstraktionen.
Abstraktionen sollen nicht von Details abhängig sein,
sondern Details von Interfaces.
High-Level Klassen sollen nicht von Low-Level Klassen abhängig sein…
Klient
Leistungs-
träger
High-Level Low-Level
High-Level Klassen sollen nicht von Low-Level Klassen abhängig sein…
Klient
Leistungs-
träger
High-Level Low-Level
…
…
…
High-Level Klassen sollen nicht von Low-Level Klassen abhängig sein…
Person Bauer
High-Level Low-Level
Süßer
Apfel
Person
Boskoop
Bauer
High-Level Low-Level
Süßer
Apfel
GetBoskoop!
High-Level Klassen sollen nicht von Low-Level Klassen abhängig sein…
High-Level Klassen sollen nicht von Low-Level
Klassen abhängig sein, sondern beide von
Abstraktionen.
Abstraktionen sollen nicht von Details abhängig sein,
sondern Details von Interfaces.
High-Level Klassen sollen nicht von Low-Level
Klassen abhängig sein, sondern beide von
Abstraktionen.
Abstraktionen sollen nicht von Details abhängig sein,
sondern Details von Interfaces.
Person
Boskoop
Bauer
High-Level Low-Level
Süßer
Apfel
GetBoskoop
High-Level Klassen sollen nicht von Low-Level Klassen abhängig sein, sondern beide von Abstraktionen…
!
Person Obsthändler
Pink Lady
Bauer
Boskoop
Bauer
Granny
Smith Bauer
High-Level Low-Level
Süßer
Apfel
High-Level Klassen sollen nicht von Low-Level Klassen abhängig sein, sondern beide von Abstraktionen…
High-Level Klassen sollen nicht von Low-Level
Klassen abhängig sein, sondern beide von
Abstraktionen.
Abstraktionen sollen nicht von Details abhängig sein,
sondern Details von Abstraktionen.
High-Level Klassen sollen nicht von Low-Level
Klassen abhängig sein, sondern beide von
Abstraktionen.
Abstraktionen sollen nicht von Details abhängig sein,
sondern Details von Abstraktionen.
Person Obsthändler
Pink Lady
Bauer
Boskoop
Bauer
Granny
Smith Bauer
High-Level Low-Level
Süßer
Apfel
Abstraktionen sollen nicht von Details abhängig sein, sondern Details von Abstraktionen.
GetBoskoop!
Person Obsthändler
High-Level Low-Level
Süßer
Apfel
Abstraktionen sollen nicht von Details abhängig sein, sondern Details von Abstraktionen.
GetApfel
Pink Lady
Bauer
Boskoop
Bauer
Granny
Smith Bauer
Person IObsthändler
Low-Level
GetApfel
Obsthändler
B
Obsthändler
A
Obsthändler
C
Süßer
Apfel
Abstraktionen sollen nicht von Details abhängig sein, sondern Details von Abstraktionen.
High-Level
Was ist Inversion of Control???
Person IObsthändler
Low-Level
GetApfel
Obsthändler
B
Obsthändler
A
Obsthändler
C
Süßer
Apfel
ohne IoC mit IoC
DIP IoC
Low-Level
Creation
Inversion
Flow
Inversion
Interface
Inversion
DIP IoC
Low-Level
Creation
Inversion
Flow
Inversion
Interface
Inversion
Flow
Inversion
Publisher Subscriber
Flow
Inversion
Subscriber
Subscriber
Publisher
Publisher
Publisher Event Aggregator Subscriber
Flow
Inversion
DIP IoC
Low-Level
Creation
Inversion
Flow
Inversion
Interface
Inversion
Request Factory Typdefinition
Creation
Inversion
Request Typdefinition
Subscriber
Subscriber
Request IoC Container Typdefinitionen
Creation
Inversion
public class StudentContext : DbContext
{
public StudentContext() : base()
{}
public DbSet<StudentEntity> Students { get; set; }
}
Creation
Inversion
public class StudentContext : DbContext, IStudentContext
{
public StudentContext() : base()
{}
public DbSet<StudentEntity> Students { get; set; }
}
public class IStudentContext
{
DbSet<StudentEntity> Students { get; set; }
}
Creation
Inversion
Creation
Inversion
public class StudentManagementViewModel
{
StudentContext context;
public StudentEntity Student { get; set; }
public StudentManagementViewModel()
{
this.context = new StudentContext();
}
public void ShowStudent(string name)
{
this.Student =
this.context.Students.FirstOrDefault<StudentEntity>
(s => s.StudentName == name);
}
}
Creation
Inversion
public class StudentManagementViewModel
{
IStudentContext context;
public StudentEntity Student { get; set; }
public StudentManagementViewModel()
{
this.context = ServiceLocator.Create<IStudentContext>();
}
public void ShowStudent(string name)
{
this.Student =
this.context.Students.FirstOrDefault<StudentEntity>
(s => s.StudentName == name);
}
}
Creation
Inversion
public class StudentManagementViewModel
{
IStudentContext context;
public StudentEntity Student { get; set; }
public StudentManagementViewModel(IStudentContext context)
{
this.context = context;
}
public void ShowStudent(string name)
{
this.Student =
this.context.Students.FirstOrDefault<StudentEntity>
(s => s.StudentName == name);
}
}
DIP IoC
Low-Level
Creation
Inversion
Flow
Inversion
Interface
Inversion
public class StudentContext : DbContext, IStudentContext
{
public StudentContext() : base()
{}
public DbSet<StudentEntity> Students { get; set; }
}
public class IStudentContext
{
DbSet<StudentEntity> Students { get; set; }
}
Interface
Inversion
public class IStudentRepository
{
IQueryable<StudentEntity> Students { get; set; }
}
Interface
Inversion
public class StudentContext : DbContext, IStudentRepository
{
public StudentContext() : base()
{
// ...
}
private DbSet<StudentEntity> students;
public IQueryable<StudentEntity> Students { get{ return this.students} }
}
[Table("StudentInfo")]
public class StudentEntity
{
public StudentEntity() { }
[Key]
public int SID { get; set; }
[Column("Name", TypeName = "ntext")]
[MaxLength(20)]
public string StudentName { get; set; }
[Column("BDate", TypeName = "datetime")]
public DateTime BirthDate { get; set; }
[NotMapped]
public int? Age { get;}
}
Interface
Inversion
public class Student
{
public int SID { get; set; }
public string Name { get; set; }
public DateTime BirthDate { get; set; }
public int? Age { get; }
}
Interface
Inversion
public class IStudentRepository
{
IQueryable<Student> Students { get; set; }
}
[Table("StudentInfo")]
public class StudentEntity
{
[Key]
public int SID { get; set; }
[Column("Name", TypeName = "ntext")]
[MaxLength(20)]
public string StudentName { get; set; }
[Column("BDate", TypeName = "datetime")]
public DateTime BirthDate { get; set; }
}
Interface
Inversion
public class StudentManagementViewModel
{
IStudentContext context;
public StudentEntity Student { get; set; }
public StudentManagementViewModel(IStudentContext context)
{
this.context = context;
}
public void ShowStudent(string name)
{
this.Student =
this.context.Students.FirstOrDefault<StudentEntity>
(s => s.StudentName == name);
}
}
Interface
Inversion
public class StudentManagementViewModel
{
IStudentRepository repository;
public Student Student { get; set; }
public StudentManagementViewModel(IStudentRepository repository)
{
this.repository = repository;
}
public void ShowStudent(string name)
{
this.Student =
this.repository.Students.FirstOrDefault<Student>
(s => s.StudentName == name);
}
}
var student = this.repository.Students.Single(s => s.StudentName == name);
Student student = this.repository.Students.Single(s => s.StudentName == name);
Student stud = this.repository.Students.Single(s => s.StudentName == name);
Interface
Inversion
Interface
Inversion
internal class StudentsFromDatabase : IManageStudents, DbSet {...}
public class IStudentRepository
{
IQueryable<Student> Students { get; set; }
}
public interface IManageStudents : IQueryable<Student>
{
Student Create();
void Add(Student student);
...
}
Siehe auch: cessor.de
this.Student = this.students.FirstOrDefault(s => s.StudentName == name);
Header Interfaces
public interface IManageStudents : IQueryable<Student>
{
Student Create();
Student GetStudent(string name)
void Add(Student student);
...
}
public class IStudentContext
{
DbSet<StudentEntity> Students { get; set; }
}
Role Interfaces
Interface
Inversion
DIP IoC
Low-Level
Creation
Inversion
Flow
Inversion
Interface
Inversion
Test
Implementierung
Refaktorisierung
Test
Implementierung
Refaktorisierung
Systemtest
UI
BL
DA
UI
BL
DA
Quelle: http://jeffreypalermo.com/blog/the-onion-architecture-part-1/
Application
Services
Domain
Services
Domain
Model
User Interface
File
DB
Web
Service
•
•
•
•
„The real problem is that programmers have spent far too
much time worrying about efficiency in the wrong places and
at the wrong times; premature optimization is the root of all
evil (or at least most of it) in programming.“
Quelle: https://en.wikiquote.org/wiki/Donald_Knuth
Donald Knuth
Der Code bestimmt
die Schnittstellen.
Der Konsument
bestimmt die
Schnittstellen.
Lose gekoppelt wie nie: DI vs. IoC

Weitere ähnliche Inhalte

Ähnlich wie Lose gekoppelt wie nie: DI vs. IoC

Qualität, aber bitte agil.
Qualität, aber bitte agil.Qualität, aber bitte agil.
Qualität, aber bitte agil.Hendrik Lösch
 
Lightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPALightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPAmh0708
 
Dependency injection
Dependency injectionDependency injection
Dependency injectionMario Müller
 
Workshop zu Hibernate 3.2.2 GA
Workshop zu Hibernate 3.2.2 GAWorkshop zu Hibernate 3.2.2 GA
Workshop zu Hibernate 3.2.2 GAOliver Belikan
 
Sensitive Daten in der Oracle Datenbank
Sensitive Daten in der Oracle DatenbankSensitive Daten in der Oracle Datenbank
Sensitive Daten in der Oracle DatenbankUlrike Schwinn
 
Neue Features der Java EE 6
Neue Features der Java EE 6Neue Features der Java EE 6
Neue Features der Java EE 6GFU Cyrus AG
 
MicroProfile 2.x: Der alternative Standard
MicroProfile 2.x: Der alternative StandardMicroProfile 2.x: Der alternative Standard
MicroProfile 2.x: Der alternative StandardOPEN KNOWLEDGE GmbH
 
JPA – Der Persistenz-­Standard in der Java EE und SE
JPA – Der Persistenz-­Standard in der Java EE und SEJPA – Der Persistenz-­Standard in der Java EE und SE
JPA – Der Persistenz-­Standard in der Java EE und SEhwilming
 
Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?Josef Adersberger
 
Cloud Native & Java EE: Freund oder Feind?
Cloud Native & Java EE: Freund oder Feind?Cloud Native & Java EE: Freund oder Feind?
Cloud Native & Java EE: Freund oder Feind?QAware GmbH
 
Schnelle Winkel: 10x schnellere Webapps mit AngularJS und JEE
Schnelle Winkel: 10x schnellere Webapps mit AngularJS und JEESchnelle Winkel: 10x schnellere Webapps mit AngularJS und JEE
Schnelle Winkel: 10x schnellere Webapps mit AngularJS und JEEBenjamin Schmid
 
Warum ich so auf das c von cdi stehe
Warum ich so auf das c von cdi steheWarum ich so auf das c von cdi stehe
Warum ich so auf das c von cdi steheSven Ruppert
 
Advanced Refactoring Patterns
Advanced Refactoring PatternsAdvanced Refactoring Patterns
Advanced Refactoring PatternsHendrik Lösch
 
Advanced Refactoring Patterns - Dev Day 2018
Advanced Refactoring Patterns - Dev Day 2018Advanced Refactoring Patterns - Dev Day 2018
Advanced Refactoring Patterns - Dev Day 2018Hendrik Lösch
 
Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)
Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)
Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)Michael Kurz
 

Ähnlich wie Lose gekoppelt wie nie: DI vs. IoC (20)

Qualität, aber bitte agil.
Qualität, aber bitte agil.Qualität, aber bitte agil.
Qualität, aber bitte agil.
 
Lightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPALightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPA
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
OOP Principles
OOP PrinciplesOOP Principles
OOP Principles
 
Workshop zu Hibernate 3.2.2 GA
Workshop zu Hibernate 3.2.2 GAWorkshop zu Hibernate 3.2.2 GA
Workshop zu Hibernate 3.2.2 GA
 
Sensitive Daten in der Oracle Datenbank
Sensitive Daten in der Oracle DatenbankSensitive Daten in der Oracle Datenbank
Sensitive Daten in der Oracle Datenbank
 
Neue Features der Java EE 6
Neue Features der Java EE 6Neue Features der Java EE 6
Neue Features der Java EE 6
 
MicroProfile 2.x: Der alternative Standard
MicroProfile 2.x: Der alternative StandardMicroProfile 2.x: Der alternative Standard
MicroProfile 2.x: Der alternative Standard
 
JPA – Der Persistenz-­Standard in der Java EE und SE
JPA – Der Persistenz-­Standard in der Java EE und SEJPA – Der Persistenz-­Standard in der Java EE und SE
JPA – Der Persistenz-­Standard in der Java EE und SE
 
Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?
 
Cloud Native & Java EE: Freund oder Feind?
Cloud Native & Java EE: Freund oder Feind?Cloud Native & Java EE: Freund oder Feind?
Cloud Native & Java EE: Freund oder Feind?
 
PHP Sucks?!
PHP Sucks?!PHP Sucks?!
PHP Sucks?!
 
Schnelle Winkel: 10x schnellere Webapps mit AngularJS und JEE
Schnelle Winkel: 10x schnellere Webapps mit AngularJS und JEESchnelle Winkel: 10x schnellere Webapps mit AngularJS und JEE
Schnelle Winkel: 10x schnellere Webapps mit AngularJS und JEE
 
GWT – Google Web Toolkit in der Praxis
GWT – Google Web Toolkit in der PraxisGWT – Google Web Toolkit in der Praxis
GWT – Google Web Toolkit in der Praxis
 
MVVM mit WPF
MVVM mit WPFMVVM mit WPF
MVVM mit WPF
 
Warum ich so auf das c von cdi stehe
Warum ich so auf das c von cdi steheWarum ich so auf das c von cdi stehe
Warum ich so auf das c von cdi stehe
 
Advanced Refactoring Patterns
Advanced Refactoring PatternsAdvanced Refactoring Patterns
Advanced Refactoring Patterns
 
Advanced Refactoring Patterns - Dev Day 2018
Advanced Refactoring Patterns - Dev Day 2018Advanced Refactoring Patterns - Dev Day 2018
Advanced Refactoring Patterns - Dev Day 2018
 
Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)
Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)
Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)
 
CDI
CDICDI
CDI
 

Mehr von Hendrik Lösch

Why (most) softwareprojects fail silently
Why (most) softwareprojects fail silentlyWhy (most) softwareprojects fail silently
Why (most) softwareprojects fail silentlyHendrik Lösch
 
We (don't) need a software architect!?!
We (don't) need a software architect!?!We (don't) need a software architect!?!
We (don't) need a software architect!?!Hendrik Lösch
 
Restrukturierung einer industriellen Großapplikation
Restrukturierung einer industriellen GroßapplikationRestrukturierung einer industriellen Großapplikation
Restrukturierung einer industriellen GroßapplikationHendrik Lösch
 
Vom Monolith zum Modulith
Vom Monolith zum ModulithVom Monolith zum Modulith
Vom Monolith zum ModulithHendrik Lösch
 
Der Software auf den Zahn gefühlt - Einstieg in die Architekturbewertung
Der Software auf den Zahn gefühlt - Einstieg in die ArchitekturbewertungDer Software auf den Zahn gefühlt - Einstieg in die Architekturbewertung
Der Software auf den Zahn gefühlt - Einstieg in die ArchitekturbewertungHendrik Lösch
 
„Wie reden Sie denn mit mir?!?“ – Stakeholder überzeugen als Softwarearchitekt
„Wie reden Sie denn mit mir?!?“ – Stakeholder überzeugen als Softwarearchitekt„Wie reden Sie denn mit mir?!?“ – Stakeholder überzeugen als Softwarearchitekt
„Wie reden Sie denn mit mir?!?“ – Stakeholder überzeugen als SoftwarearchitektHendrik Lösch
 
Software ist was du draus machst!
Software ist was du draus machst!Software ist was du draus machst!
Software ist was du draus machst!Hendrik Lösch
 
Einstieg in das Vueniverse
Einstieg in das VueniverseEinstieg in das Vueniverse
Einstieg in das VueniverseHendrik Lösch
 
Survivalkit für Codehausmeister
Survivalkit für CodehausmeisterSurvivalkit für Codehausmeister
Survivalkit für CodehausmeisterHendrik Lösch
 
Confessions of a Codehausmeister
Confessions of a CodehausmeisterConfessions of a Codehausmeister
Confessions of a CodehausmeisterHendrik Lösch
 
WPF Dos n Don'ts - der WPF Rundumschlag
WPF Dos n Don'ts - der WPF RundumschlagWPF Dos n Don'ts - der WPF Rundumschlag
WPF Dos n Don'ts - der WPF RundumschlagHendrik Lösch
 
Clean mit visual studio
Clean mit visual studioClean mit visual studio
Clean mit visual studioHendrik Lösch
 
Der Healthcheck für Softwareprojekte
Der Healthcheck für SoftwareprojekteDer Healthcheck für Softwareprojekte
Der Healthcheck für SoftwareprojekteHendrik Lösch
 

Mehr von Hendrik Lösch (20)

Why (most) softwareprojects fail silently
Why (most) softwareprojects fail silentlyWhy (most) softwareprojects fail silently
Why (most) softwareprojects fail silently
 
We (don't) need a software architect!?!
We (don't) need a software architect!?!We (don't) need a software architect!?!
We (don't) need a software architect!?!
 
Restrukturierung einer industriellen Großapplikation
Restrukturierung einer industriellen GroßapplikationRestrukturierung einer industriellen Großapplikation
Restrukturierung einer industriellen Großapplikation
 
Vom Monolith zum Modulith
Vom Monolith zum ModulithVom Monolith zum Modulith
Vom Monolith zum Modulith
 
Der Software auf den Zahn gefühlt - Einstieg in die Architekturbewertung
Der Software auf den Zahn gefühlt - Einstieg in die ArchitekturbewertungDer Software auf den Zahn gefühlt - Einstieg in die Architekturbewertung
Der Software auf den Zahn gefühlt - Einstieg in die Architekturbewertung
 
„Wie reden Sie denn mit mir?!?“ – Stakeholder überzeugen als Softwarearchitekt
„Wie reden Sie denn mit mir?!?“ – Stakeholder überzeugen als Softwarearchitekt„Wie reden Sie denn mit mir?!?“ – Stakeholder überzeugen als Softwarearchitekt
„Wie reden Sie denn mit mir?!?“ – Stakeholder überzeugen als Softwarearchitekt
 
Software ist was du draus machst!
Software ist was du draus machst!Software ist was du draus machst!
Software ist was du draus machst!
 
Modular mit .NET
Modular mit .NETModular mit .NET
Modular mit .NET
 
.NET zu .NET Core
.NET zu .NET Core.NET zu .NET Core
.NET zu .NET Core
 
Workshop Vue js
Workshop Vue jsWorkshop Vue js
Workshop Vue js
 
Migrationsstrategien
MigrationsstrategienMigrationsstrategien
Migrationsstrategien
 
Einstieg in das Vueniverse
Einstieg in das VueniverseEinstieg in das Vueniverse
Einstieg in das Vueniverse
 
Survivalkit für Codehausmeister
Survivalkit für CodehausmeisterSurvivalkit für Codehausmeister
Survivalkit für Codehausmeister
 
Confessions of a Codehausmeister
Confessions of a CodehausmeisterConfessions of a Codehausmeister
Confessions of a Codehausmeister
 
Hey, wie geht es dir?
Hey, wie geht es dir?Hey, wie geht es dir?
Hey, wie geht es dir?
 
WPF Dos n Don'ts - der WPF Rundumschlag
WPF Dos n Don'ts - der WPF RundumschlagWPF Dos n Don'ts - der WPF Rundumschlag
WPF Dos n Don'ts - der WPF Rundumschlag
 
Clean mit visual studio
Clean mit visual studioClean mit visual studio
Clean mit visual studio
 
Codesmells
CodesmellsCodesmells
Codesmells
 
Der Healthcheck für Softwareprojekte
Der Healthcheck für SoftwareprojekteDer Healthcheck für Softwareprojekte
Der Healthcheck für Softwareprojekte
 
Ionic 3
Ionic 3Ionic 3
Ionic 3
 

Kürzlich hochgeladen

Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...OPEN KNOWLEDGE GmbH
 
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die CloudFrom Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die CloudOPEN KNOWLEDGE GmbH
 
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...Markus Unterauer
 
Slides (1) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
Slides (1) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...Slides (1) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
Slides (1) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...DNUG e.V.
 
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data ImputationFEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data ImputationOPEN KNOWLEDGE GmbH
 
Slides (2) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
Slides (2) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...Slides (2) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
Slides (2) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...DNUG e.V.
 

Kürzlich hochgeladen (6)

Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
 
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die CloudFrom Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
 
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
 
Slides (1) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
Slides (1) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...Slides (1) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
Slides (1) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
 
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data ImputationFEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
 
Slides (2) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
Slides (2) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...Slides (2) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
Slides (2) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
 

Lose gekoppelt wie nie: DI vs. IoC

Hinweis der Redaktion

  1. https://de.fotolia.com/id/69069066
  2. Rigidity – Starrheit Fragility – Zerbrechlichkeit Immobility - UNbeweglichkeit
  3. Auch das Dependency Inversion Principle (DIP) ist ein SOLID Prinzip. Es besagt folgendes: High-Level Klassen sollen nicht von Low-Level Klassen abhängig sein, sondern beide von Interfaces. Interfaces sollen nicht von Details abhängig sein, sondern Details von Interfaces. Verwendet eine High-Level Klasse eine Low-Level Klasse unmittelbar, so ergibt sich eine starke Kopplung zwischen beiden. Spätestens beim Versuch, die High-Level Klasse isoliert zu testen, wird man auf Schwierigkeiten stoßen. Aus diesem Grund sollte die High-Level Klasse von einem Interface abhängig sein, das wiederum von der Low-Level Klasse implementiert wird. So kann die Low-Level Klasse im Unit Test durch ein Mockup ersetzt werden. Um zur Laufzeit die invertierte, abstrakte Abhängigkeit mit einem konkreten Objekt aufzulösen, bieten sich im Prinzip drei Möglichkeiten: mittels Konstruktorparameter "per Hand" Einsatz eines Inversion of Control Containers (IoC Container) wie etwa Castle Windsor Dependency Lookup
  4. Auch das Dependency Inversion Principle (DIP) ist ein SOLID Prinzip. Es besagt folgendes: High-Level Klassen sollen nicht von Low-Level Klassen abhängig sein, sondern beide von Interfaces. Interfaces sollen nicht von Details abhängig sein, sondern Details von Interfaces. Verwendet eine High-Level Klasse eine Low-Level Klasse unmittelbar, so ergibt sich eine starke Kopplung zwischen beiden. Spätestens beim Versuch, die High-Level Klasse isoliert zu testen, wird man auf Schwierigkeiten stoßen. Aus diesem Grund sollte die High-Level Klasse von einem Interface abhängig sein, das wiederum von der Low-Level Klasse implementiert wird. So kann die Low-Level Klasse im Unit Test durch ein Mockup ersetzt werden. Um zur Laufzeit die invertierte, abstrakte Abhängigkeit mit einem konkreten Objekt aufzulösen, bieten sich im Prinzip drei Möglichkeiten: mittels Konstruktorparameter "per Hand" Einsatz eines Inversion of Control Containers (IoC Container) wie etwa Castle Windsor Dependency Lookup
  5. Auch das Dependency Inversion Principle (DIP) ist ein SOLID Prinzip. Es besagt folgendes: High-Level Klassen sollen nicht von Low-Level Klassen abhängig sein, sondern beide von Interfaces. Interfaces sollen nicht von Details abhängig sein, sondern Details von Interfaces. Verwendet eine High-Level Klasse eine Low-Level Klasse unmittelbar, so ergibt sich eine starke Kopplung zwischen beiden. Spätestens beim Versuch, die High-Level Klasse isoliert zu testen, wird man auf Schwierigkeiten stoßen. Aus diesem Grund sollte die High-Level Klasse von einem Interface abhängig sein, das wiederum von der Low-Level Klasse implementiert wird. So kann die Low-Level Klasse im Unit Test durch ein Mockup ersetzt werden. Um zur Laufzeit die invertierte, abstrakte Abhängigkeit mit einem konkreten Objekt aufzulösen, bieten sich im Prinzip drei Möglichkeiten: mittels Konstruktorparameter "per Hand" Einsatz eines Inversion of Control Containers (IoC Container) wie etwa Castle Windsor Dependency Lookup
  6. Auch das Dependency Inversion Principle (DIP) ist ein SOLID Prinzip. Es besagt folgendes: High-Level Klassen sollen nicht von Low-Level Klassen abhängig sein, sondern beide von Interfaces. Interfaces sollen nicht von Details abhängig sein, sondern Details von Interfaces. Verwendet eine High-Level Klasse eine Low-Level Klasse unmittelbar, so ergibt sich eine starke Kopplung zwischen beiden. Spätestens beim Versuch, die High-Level Klasse isoliert zu testen, wird man auf Schwierigkeiten stoßen. Aus diesem Grund sollte die High-Level Klasse von einem Interface abhängig sein, das wiederum von der Low-Level Klasse implementiert wird. So kann die Low-Level Klasse im Unit Test durch ein Mockup ersetzt werden. Um zur Laufzeit die invertierte, abstrakte Abhängigkeit mit einem konkreten Objekt aufzulösen, bieten sich im Prinzip drei Möglichkeiten: mittels Konstruktorparameter "per Hand" Einsatz eines Inversion of Control Containers (IoC Container) wie etwa Castle Windsor Dependency Lookup
  7. Auch das Dependency Inversion Principle (DIP) ist ein SOLID Prinzip. Es besagt folgendes: High-Level Klassen sollen nicht von Low-Level Klassen abhängig sein, sondern beide von Interfaces. Interfaces sollen nicht von Details abhängig sein, sondern Details von Interfaces. Verwendet eine High-Level Klasse eine Low-Level Klasse unmittelbar, so ergibt sich eine starke Kopplung zwischen beiden. Spätestens beim Versuch, die High-Level Klasse isoliert zu testen, wird man auf Schwierigkeiten stoßen. Aus diesem Grund sollte die High-Level Klasse von einem Interface abhängig sein, das wiederum von der Low-Level Klasse implementiert wird. So kann die Low-Level Klasse im Unit Test durch ein Mockup ersetzt werden. Um zur Laufzeit die invertierte, abstrakte Abhängigkeit mit einem konkreten Objekt aufzulösen, bieten sich im Prinzip drei Möglichkeiten: mittels Konstruktorparameter "per Hand" Einsatz eines Inversion of Control Containers (IoC Container) wie etwa Castle Windsor Dependency Lookup
  8. Auch das Dependency Inversion Principle (DIP) ist ein SOLID Prinzip. Es besagt folgendes: High-Level Klassen sollen nicht von Low-Level Klassen abhängig sein, sondern beide von Interfaces. Interfaces sollen nicht von Details abhängig sein, sondern Details von Interfaces. Verwendet eine High-Level Klasse eine Low-Level Klasse unmittelbar, so ergibt sich eine starke Kopplung zwischen beiden. Spätestens beim Versuch, die High-Level Klasse isoliert zu testen, wird man auf Schwierigkeiten stoßen. Aus diesem Grund sollte die High-Level Klasse von einem Interface abhängig sein, das wiederum von der Low-Level Klasse implementiert wird. So kann die Low-Level Klasse im Unit Test durch ein Mockup ersetzt werden. Um zur Laufzeit die invertierte, abstrakte Abhängigkeit mit einem konkreten Objekt aufzulösen, bieten sich im Prinzip drei Möglichkeiten: mittels Konstruktorparameter "per Hand" Einsatz eines Inversion of Control Containers (IoC Container) wie etwa Castle Windsor Dependency Lookup
  9. Rigidity – Starrheit Fragility – Zerbrechlichkeit Immobility - Unbeweglichkeit
  10. Was bringt uns Inversion of Control? Entkopplung der Ausführung einer Aktion von ihrer Implementierung. Fokussierung von Bestandteilen auf deren eigentliche Aufgabe. Grundstrukturen werden durch Verträge festgehalten. Zulieferer können einfacher durch andere ersetzt werden.