SlideShare una empresa de Scribd logo
1 de 63
Descargar para leer sin conexión
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
?
public class A
{
IB b;
public A(IB b)
{
this.b = b;
}
}
User Interface
Business Layer
Data Access Layer
Cross
Cutting
Concerns
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
User Interface
Business Layer
Data Access Layer
Cross
Cutting
Concerns
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 Lösung.
Der Konsument
bestimmen den
Code.
DevDay 2016: Hendrik Lösch - Lose gekoppelt wie nie: DI vs. IoC

Más contenido relacionado

Similar a DevDay 2016: Hendrik Lösch - Lose gekoppelt wie nie: DI vs. IoC

Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Stephan Hochdörfer
 
2009 03 17 Spring101
2009 03 17 Spring1012009 03 17 Spring101
2009 03 17 Spring101
gueste4be40
 
Lightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPALightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPA
mh0708
 

Similar a DevDay 2016: Hendrik Lösch - Lose gekoppelt wie nie: DI vs. IoC (20)

Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
 
2009 03 17 Spring101
2009 03 17 Spring1012009 03 17 Spring101
2009 03 17 Spring101
 
javaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevelsjavaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevels
 
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
 
Qualität, aber bitte agil.
Qualität, aber bitte agil.Qualität, aber bitte agil.
Qualität, aber bitte agil.
 
Neue Features der Java EE 6
Neue Features der Java EE 6Neue Features der Java EE 6
Neue Features der Java EE 6
 
Legacy Code refaktorisieren
Legacy Code refaktorisierenLegacy Code refaktorisieren
Legacy Code refaktorisieren
 
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
 
OOP Principles
OOP PrinciplesOOP Principles
OOP Principles
 
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
 
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)
 
Warum empfehle ich meinen Kunden das Spring Framework?
Warum empfehle ich meinen Kunden das Spring Framework? Warum empfehle ich meinen Kunden das Spring Framework?
Warum empfehle ich meinen Kunden das Spring Framework?
 
Sensitive Daten in der Oracle Datenbank
Sensitive Daten in der Oracle DatenbankSensitive Daten in der Oracle Datenbank
Sensitive Daten in der Oracle Datenbank
 
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?
 
MicroProfile 2.x: Der alternative Standard
MicroProfile 2.x: Der alternative StandardMicroProfile 2.x: Der alternative Standard
MicroProfile 2.x: Der alternative Standard
 
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
 
CDI
CDICDI
CDI
 
Java EE 5
Java EE 5Java EE 5
Java EE 5
 

Más de DevDay Dresden

Más de DevDay Dresden (20)

The Architecture of Uncertainty - Kevlin Henney
The Architecture of Uncertainty - Kevlin HenneyThe Architecture of Uncertainty - Kevlin Henney
The Architecture of Uncertainty - Kevlin Henney
 
Dev Day 2021 - Stephan Pirnbaum - Anwendungsmodernisierung
Dev Day 2021 - Stephan Pirnbaum - AnwendungsmodernisierungDev Day 2021 - Stephan Pirnbaum - Anwendungsmodernisierung
Dev Day 2021 - Stephan Pirnbaum - Anwendungsmodernisierung
 
Tobias Nebel - Herausforderungen und Changen in Full-Stack-IoT-Projekten
Tobias Nebel - Herausforderungen und Changen in Full-Stack-IoT-ProjektenTobias Nebel - Herausforderungen und Changen in Full-Stack-IoT-Projekten
Tobias Nebel - Herausforderungen und Changen in Full-Stack-IoT-Projekten
 
Andreas Roth - GraphQL erfolgreich im Backend einsetzen
Andreas Roth - GraphQL erfolgreich im Backend einsetzenAndreas Roth - GraphQL erfolgreich im Backend einsetzen
Andreas Roth - GraphQL erfolgreich im Backend einsetzen
 
Alexander Reelsen - Seccomp for Developers
Alexander Reelsen - Seccomp for DevelopersAlexander Reelsen - Seccomp for Developers
Alexander Reelsen - Seccomp for Developers
 
DevDay 19 Accessibility: Praxistipps für Entwickler
DevDay 19 Accessibility: Praxistipps für EntwicklerDevDay 19 Accessibility: Praxistipps für Entwickler
DevDay 19 Accessibility: Praxistipps für Entwickler
 
Dev Day 2019: Phillip Krenn – Aggregierte Logging Patterns
Dev Day 2019: Phillip Krenn – Aggregierte Logging PatternsDev Day 2019: Phillip Krenn – Aggregierte Logging Patterns
Dev Day 2019: Phillip Krenn – Aggregierte Logging Patterns
 
Dev Day 2019: Mirko Seifert – Next Level Integration Testing mit Docker und T...
Dev Day 2019: Mirko Seifert – Next Level Integration Testing mit Docker und T...Dev Day 2019: Mirko Seifert – Next Level Integration Testing mit Docker und T...
Dev Day 2019: Mirko Seifert – Next Level Integration Testing mit Docker und T...
 
Dev Day 2019: Nathan Mattes – Kommunikation ist wichtig, scheiße wichtig und ...
Dev Day 2019: Nathan Mattes – Kommunikation ist wichtig, scheiße wichtig und ...Dev Day 2019: Nathan Mattes – Kommunikation ist wichtig, scheiße wichtig und ...
Dev Day 2019: Nathan Mattes – Kommunikation ist wichtig, scheiße wichtig und ...
 
Dev Day 2019: Stephan Birnbaum – Die Glaskugel hat ausgedient, wir machen Sof...
Dev Day 2019: Stephan Birnbaum – Die Glaskugel hat ausgedient, wir machen Sof...Dev Day 2019: Stephan Birnbaum – Die Glaskugel hat ausgedient, wir machen Sof...
Dev Day 2019: Stephan Birnbaum – Die Glaskugel hat ausgedient, wir machen Sof...
 
Dev Day 2019: Markus Winand – Die Mutter aller Abfragesprachen: SQL im 21. Ja...
Dev Day 2019: Markus Winand – Die Mutter aller Abfragesprachen: SQL im 21. Ja...Dev Day 2019: Markus Winand – Die Mutter aller Abfragesprachen: SQL im 21. Ja...
Dev Day 2019: Markus Winand – Die Mutter aller Abfragesprachen: SQL im 21. Ja...
 
Dev Day 2019: Kay Grebenstein – Wie wir müssen das noch testen? - design for ...
Dev Day 2019: Kay Grebenstein – Wie wir müssen das noch testen? - design for ...Dev Day 2019: Kay Grebenstein – Wie wir müssen das noch testen? - design for ...
Dev Day 2019: Kay Grebenstein – Wie wir müssen das noch testen? - design for ...
 
Dev Day 2019: Kathrin Friedrich/Michael Kunze – Design better together - Styl...
Dev Day 2019: Kathrin Friedrich/Michael Kunze – Design better together - Styl...Dev Day 2019: Kathrin Friedrich/Michael Kunze – Design better together - Styl...
Dev Day 2019: Kathrin Friedrich/Michael Kunze – Design better together - Styl...
 
Dev Day 2019: Benjamin Wolf – "Some fixes" - Commit Message 101
Dev Day 2019: Benjamin Wolf – "Some fixes" - Commit Message 101Dev Day 2019: Benjamin Wolf – "Some fixes" - Commit Message 101
Dev Day 2019: Benjamin Wolf – "Some fixes" - Commit Message 101
 
Dev Day 2019: Lucas Fiedler – DevOps-Dashboard: Transparenz für DevOps-Teams
Dev Day 2019: Lucas Fiedler – DevOps-Dashboard: Transparenz für DevOps-TeamsDev Day 2019: Lucas Fiedler – DevOps-Dashboard: Transparenz für DevOps-Teams
Dev Day 2019: Lucas Fiedler – DevOps-Dashboard: Transparenz für DevOps-Teams
 
Dev Day 2019: Ulrich Deiters – Offene Daten und IT-Lösungen für den Radverkehr
Dev Day 2019: Ulrich Deiters – Offene Daten und IT-Lösungen für den RadverkehrDev Day 2019: Ulrich Deiters – Offene Daten und IT-Lösungen für den Radverkehr
Dev Day 2019: Ulrich Deiters – Offene Daten und IT-Lösungen für den Radverkehr
 
Dev Day 2019: Alexander Lichter - JAMstack - Eine neuartige Webanwendungs-Arc...
Dev Day 2019: Alexander Lichter - JAMstack - Eine neuartige Webanwendungs-Arc...Dev Day 2019: Alexander Lichter - JAMstack - Eine neuartige Webanwendungs-Arc...
Dev Day 2019: Alexander Lichter - JAMstack - Eine neuartige Webanwendungs-Arc...
 
Dev Day 2019: Martin Schurz - Manual Work Is A Bug!
Dev Day 2019: Martin Schurz - Manual Work Is A Bug!Dev Day 2019: Martin Schurz - Manual Work Is A Bug!
Dev Day 2019: Martin Schurz - Manual Work Is A Bug!
 
Dev Day 2019: Stefan Schleyer: How to build an cloud-based IoT application“
Dev Day 2019: Stefan Schleyer: How to build an cloud-based IoT application“Dev Day 2019: Stefan Schleyer: How to build an cloud-based IoT application“
Dev Day 2019: Stefan Schleyer: How to build an cloud-based IoT application“
 
Dev Day 2019: Mirko Zeibig – "Hallo " <> "Elixir"
Dev Day 2019: Mirko Zeibig – "Hallo " <> "Elixir"Dev Day 2019: Mirko Zeibig – "Hallo " <> "Elixir"
Dev Day 2019: Mirko Zeibig – "Hallo " <> "Elixir"
 

DevDay 2016: Hendrik Lösch - Lose gekoppelt wie nie: DI vs. IoC