1
00:00:00,610 --> 00:00:02,440
Wie oft hast du schon Code 
geschrieben? 

2
00:00:02,450 --> 00:00:05,390
Der ist schwer zu ändern, schwer
zu erweitern oder zu testen war,

3
00:00:05,590 --> 00:00:07,820
weil er von anderen Objekten 
abhängig war. 

4
00:00:08,090 --> 00:00:10,180
Wie oft hast du dir gewünscht, 
dass deine Objekte einfach 

5
00:00:10,190 --> 00:00:13,190
auszutauschen und zu 
konfigurieren sind, ohne deinen 

6
00:00:13,200 --> 00:00:16,440
ganzen Code zu ändern? 
Wenn du diese Fragen mit ja 

7
00:00:16,450 --> 00:00:19,160
beantwortet hast, dann ist diese
Folge etwas für dich. 

8
00:00:24,780 --> 00:00:30,070
Und damit herzlich willkommen zu
Folge 75 des to Dive Loper 

9
00:00:30,080 --> 00:00:32,270
Podcasts heiratet Manuel, wie 
gehts dir? 

10
00:00:32,439 --> 00:00:35,730
Dreimal so Grüß dich haben wir 
schon wieder eine technische 

11
00:00:35,740 --> 00:00:38,240
Herausforderungen nochmal, da 
schneiden wir alles raus, kriegt

12
00:00:38,250 --> 00:00:41,630
davon nichts mit und ihr habt 
uns n bisschen früher, weil sie 

13
00:00:41,640 --> 00:00:46,830
hier vor dem Mikrofon. 
Ja, die Stimmung ist gut, trotz 

14
00:00:46,840 --> 00:00:51,880
trübem Herbstwetter, weil wir 
zum einen wieder ein. 

15
00:00:51,990 --> 00:00:54,510
Wunsch eines Hörers aufgreifen 
können wir wieder über ein 

16
00:00:54,520 --> 00:00:57,550
technisches Thema zu sprechen. 
Wir tauschen uns heute über die 

17
00:00:57,560 --> 00:01:01,290
Pence Injection aus und zum 
anderen freuen wir uns darüber, 

18
00:01:01,300 --> 00:01:04,810
dass auch wieder Kaffee 
Einladung eingetrudelt sind und 

19
00:01:04,819 --> 00:01:08,270
zwar haben wir 2 Kaffee von 
Julia und 5 Kaffee von Daniel 

20
00:01:08,280 --> 00:01:11,750
bekommen, an dieser Stelle 
herzlichen Dank dafür. 

21
00:01:12,220 --> 00:01:15,270
Bevor wir ins Thema einsteigen, 
vielleicht ein kleiner Rückblick

22
00:01:15,280 --> 00:01:19,070
beziehungsweise ein Ver Feedback
was wir von euch bekommen haben.

23
00:01:19,080 --> 00:01:20,870
Wir haben eine Mail bekommen von
Claudia. 

24
00:01:21,440 --> 00:01:22,950
Ja, wir haben ganz viele Mails 
bekommen. 

25
00:01:23,020 --> 00:01:25,770
Tatsächlich, wir haben ja letzte
Folge über unseren Werdegang 

26
00:01:25,780 --> 00:01:28,850
gesprochen und ein bisschen 
erzählt, sowas malte und ich für

27
00:01:28,860 --> 00:01:33,520
Stationen auf unserem Lebenslauf
schon durchlebt haben und da kam

28
00:01:33,530 --> 00:01:36,140
super viel Reaktionen darauf und
wir haben auch ganz viele Mails 

29
00:01:36,150 --> 00:01:40,780
bekommen von Leuten, die ganz 
verschiedenste Werdegänge 

30
00:01:40,790 --> 00:01:43,650
irgendwie durchlebt haben und 
jetzt trotzdem alle irgendwie 

31
00:01:43,660 --> 00:01:49,610
gemeinsam in der IT mit uns hier
arbeiten und leben und das hat 

32
00:01:49,620 --> 00:01:52,980
uns sehr gefreut, dass wir auch 
so viele persönliche Geschichten

33
00:01:53,020 --> 00:01:55,430
von euch. 
Zu hören bekommen durften. 

34
00:01:56,020 --> 00:01:58,930
Und der eine hat uns ganz 
besonders berührt, die kam von 

35
00:01:58,970 --> 00:02:02,470
Claudia, die wirklich einen sehr
ungewöhnlichen Werdegang 

36
00:02:02,510 --> 00:02:05,790
gegangen ist und jetzt aber auch
als Zuhörerinnen und 

37
00:02:05,800 --> 00:02:10,380
softwareentwicklerinnen. 
Und mit uns unterwegs ist auf 

38
00:02:10,389 --> 00:02:13,220
dieser Reise und der Geschichte 
würde ich gerne einmal kurz 

39
00:02:13,230 --> 00:02:14,700
vorlesen. 
Wir haben ein bisschen mehr 

40
00:02:14,710 --> 00:02:16,170
hingeschrieben, ob das in 
Ordnung ist. 

41
00:02:17,010 --> 00:02:19,360
Und Claudia hat etwa eine hat 
geschrieben, dass sie etwas 

42
00:02:19,830 --> 00:02:22,390
komplizierte Laufbahn hat, sie 
es genannt, hingelegt hat. 

43
00:02:22,400 --> 00:02:25,770
Also sie wusste lange nicht, was
sie werden wollte, hat dann in 

44
00:02:25,810 --> 00:02:27,460
der 12. 
Klasse im zweiten Halbjahr, das 

45
00:02:27,470 --> 00:02:32,100
war 1980 damals, das Wahlfach 
Informatik belegt und war dann 

46
00:02:32,110 --> 00:02:33,980
irgendwie total begeistert vom 
Programmieren. 

47
00:02:34,760 --> 00:02:37,460
Und schreibt, dass sie dann eine
Ausbildung zur 

48
00:02:37,930 --> 00:02:42,040
Datenverarbeitungs Kauffrau mit 
COBOL gemacht hat. 

49
00:02:42,050 --> 00:02:44,640
Und danach? 
Pioniere ne also. 

50
00:02:44,690 --> 00:02:48,220
Ja, tatsächlich ne und 
eigentlich auch Kobold ist ja 

51
00:02:49,300 --> 00:02:52,920
glaube ich wenig neue Projekte 
noch damit, aber war damals ganz

52
00:02:52,930 --> 00:02:55,380
groß im Rennen, gerade bei 
großrechnern, Banken, 

53
00:02:55,390 --> 00:02:57,960
Versicherungen und so weiter und
wird auch heute noch dort 

54
00:02:57,970 --> 00:03:01,270
händeringend gesucht. 
Schreibt weiter, dass sie dann 

55
00:03:01,280 --> 00:03:07,420
bis 1997 in der gearbeitet hat 
und dann ne Schwangerschaft und 

56
00:03:07,430 --> 00:03:10,540
eine Selbstständigkeit mit einer
Entwicklungs Firma hinter sich 

57
00:03:10,550 --> 00:03:14,260
hat, die leider mit der IT Blase
dann wohl auch geplatzt ist und 

58
00:03:14,270 --> 00:03:16,520
nicht funktioniert hat. 
Aber dafür konnte sich 

59
00:03:16,530 --> 00:03:18,960
wenigstens TLCSS und P 
beibringen. 

60
00:03:20,490 --> 00:03:22,150
Konnte das hat mich sehr 
überrascht. 

61
00:03:22,160 --> 00:03:24,920
Bei dieser Nachricht konnte dann
keine Stelle mehr in der IT 

62
00:03:24,930 --> 00:03:30,060
finden und hat wohl ganz viele 
Absagen bekommen mit dem Thema, 

63
00:03:30,070 --> 00:03:34,230
sie sei zu alt fürs Team und sie
war zu dem Zeitpunkt irgendwie 

64
00:03:34,240 --> 00:03:37,220
36 Jahre alt und ist also halte 
ich für ganz ganz groben 

65
00:03:37,230 --> 00:03:40,080
Quatsch, dass man 36 Jahre 
irgendwie zu alt ich würde mich 

66
00:03:40,090 --> 00:03:42,960
eher freuen, weil das ja 
wahrscheinlich darauf hinweist, 

67
00:03:42,970 --> 00:03:45,150
dass da sich jemand etwas 
seniores bewirbt, der auch ein 

68
00:03:45,160 --> 00:03:47,710
bisschen Erfahrung. 
Mitbringt. 

69
00:03:48,770 --> 00:03:52,280
Also fand ich, das fand ich so 
mit den verwirrenden Teil. 

70
00:03:52,750 --> 00:03:57,280
Jetzt kommt so ein bisschen, 
jetzt kommt n bisschen ne 

71
00:03:57,290 --> 00:04:00,260
härtere Phase, dann dann für 
sie, also nach einer Scheidung, 

72
00:04:00,710 --> 00:04:04,180
einem Zusammenbruch mit 
Depressionen und auch 2 Klinik 

73
00:04:04,190 --> 00:04:08,500
Aufenthalten. 
Hat sie dann. 

74
00:04:09,180 --> 00:04:11,810
Mitte August wieder neu 
gestartet. 

75
00:04:11,820 --> 00:04:13,600
Also erstmal herzlichen 
Glückwunsch. 

76
00:04:13,610 --> 00:04:19,010
Schaffen, dann wieder neu zu 
starten und dann innerhalb von 3

77
00:04:19,019 --> 00:04:22,400
Monaten. 
In Teilzeit quasi. 

78
00:04:23,040 --> 00:04:26,050
Boot Camps entdeckt und dort 
einfach die Möglichkeit haben, 

79
00:04:26,060 --> 00:04:29,870
auch wieder in neue IT Themen 
und Programmier Fähigkeiten 

80
00:04:30,260 --> 00:04:33,830
einzusteigen. 
Und hat da sehr viele Dinge 

81
00:04:33,840 --> 00:04:37,670
gelernt, die noch nicht wusste 
und hat dann im Januar diesen 

82
00:04:37,680 --> 00:04:41,880
Jahres quasi über auch diese 
Boot Camps eine Teilzeitstelle 

83
00:04:41,920 --> 00:04:45,430
gefunden und dort arbeitet sie 
jetzt wieder mit 54 in ihrem 

84
00:04:45,440 --> 00:04:48,050
Traumberuf als 
Softwareentwicklerin, also gar 

85
00:04:48,060 --> 00:04:53,180
nicht typisch auch mit einigen 
tiefen und auch sehr viel Kraft 

86
00:04:53,190 --> 00:04:55,970
sich da wieder raus zu kämpfen, 
also dafür erstmal ganz großen 

87
00:04:55,980 --> 00:04:57,620
Respekt und Herzlichen 
Glückwunsch. 

88
00:04:58,470 --> 00:05:01,920
Aber fand ich auch super 
spannend, solche Wege von euch 

89
00:05:01,930 --> 00:05:05,570
im Prinzip zu hören und zu 
lesen, wo vielleicht die 

90
00:05:05,580 --> 00:05:08,450
Laufbahn nicht so. 
Gradlinig waren, wie das bei uns

91
00:05:08,460 --> 00:05:10,330
beiden, glaube ich. 
Wir haben letzte Folge doch 

92
00:05:10,340 --> 00:05:12,180
erzählt, dass wir relativ früh 
wussten, dass wir in der 

93
00:05:12,190 --> 00:05:15,170
Informatik unterwegs sein wollen
und dann auch ganz recht 

94
00:05:15,180 --> 00:05:19,020
geradlinige Lebensläufe, glaube 
ich, beide gehabt, und das hat 

95
00:05:19,030 --> 00:05:21,610
auch wieder gesagt, dass nicht 
immer geradlinig ist, auch ganz 

96
00:05:21,620 --> 00:05:25,120
viele Möglichkeiten, also auch 
unkonventionelle Möglichkeiten, 

97
00:05:25,130 --> 00:05:30,070
wie zum Beispiel solche Camps, 
gibt sich da wieder einzufinden 

98
00:05:30,080 --> 00:05:33,060
und jetzt auch quasi, wenn sie, 
wenn sie schreibt, dass ihr 

99
00:05:33,070 --> 00:05:37,120
Traumberuf ist. 
Das ist natürlich schon große, 

100
00:05:37,950 --> 00:05:41,360
was ganz wenige Menschen in 
einem Traumberuf zu arbeiten. 

101
00:05:42,340 --> 00:05:45,530
Mhm. 
Von daher vielen Dank für das 

102
00:05:45,540 --> 00:05:47,330
Feedback. 
Und auch wenn ihr uns 

103
00:05:47,340 --> 00:05:50,510
Rückmeldung geben wollt, immer 
gerne per E-Mail. 

104
00:05:50,550 --> 00:05:53,060
Sagt uns gerne dazu, ob wir 
darüber sprechen dürfen oder 

105
00:05:53,070 --> 00:05:56,030
nicht, mit Claudia haben wir das
entsprechend abgestimmt, aber 

106
00:05:56,040 --> 00:05:58,630
wir würden uns auch freuen von 
euch natürlich weiterhin 

107
00:05:58,640 --> 00:06:01,600
Feedback zu bekommen. 
Wie schaffen wir jetzt den auf 

108
00:06:01,610 --> 00:06:04,680
unser eigenes Thema? 
Von diesem eher emotionalen 

109
00:06:04,690 --> 00:06:09,210
Thema auf ein technisches Thema,
was wir dieses Mal haben und ich

110
00:06:09,220 --> 00:06:12,730
glaube n guter guter Übergang 
ist hier sich damit 

111
00:06:12,770 --> 00:06:15,390
auseinanderzusetzen, wie kommt 
man halt aus so einer 

112
00:06:15,610 --> 00:06:18,270
Technologie Kobold in moderne 
Entwicklungs Technologien und 

113
00:06:18,280 --> 00:06:21,180
das sind so Dinge die man sich 
dann aneignen muss und dazu 

114
00:06:21,190 --> 00:06:25,750
gehören natürlich auch Entwurfs,
Muster die man gerade zum 

115
00:06:25,760 --> 00:06:29,480
Beispiel in objektorientierten 
Programmierungssprachen umsetzen

116
00:06:29,490 --> 00:06:33,480
kann, umsetzen muss, um halt. 
Eine Software zu entwickeln, die

117
00:06:33,490 --> 00:06:37,740
Halt gut wart, bar gut testbar 
ist und die entsprechend sich 

118
00:06:37,750 --> 00:06:42,090
für große Projekte eignet. 
Und da sind wir in den letzten 

119
00:06:42,100 --> 00:06:45,060
Jahren immer wieder über das 
Thema Dependency Injection 

120
00:06:45,070 --> 00:06:48,480
gestolpert, vom eigenen Einsatz,
aber auch in vielen Gesprächen, 

121
00:06:48,490 --> 00:06:50,920
es kommt immer wieder hoch und 
ist auch immer wieder ein Thema,

122
00:06:50,930 --> 00:06:54,840
was durchaus etwas ist, was 
eigentlich tagtäglich von ganz 

123
00:06:54,850 --> 00:06:56,490
vielen eingesetzt wird, aber 
immer wenn der Begriff 

124
00:06:56,500 --> 00:06:59,460
hochkommt, dann kämpft man 
bisschen damit, dass einfach 

125
00:06:59,620 --> 00:07:02,490
auch zu logisch zu erklären, 
deswegen gehen bisschen 

126
00:07:02,500 --> 00:07:04,670
strukturiert. 
Durch und versuchen das Thema n 

127
00:07:04,680 --> 00:07:07,760
bisschen einzuführen, um auch 
denen, die gerade jetzt mit der 

128
00:07:07,770 --> 00:07:10,110
objektorientierten 
Programmierung einsteigen oder 

129
00:07:10,120 --> 00:07:13,150
schon länger damit arbeiten, 
aber noch nicht mit solchen 

130
00:07:13,160 --> 00:07:16,000
Entwurfs mustern arbeiten, 
einfach ein Einstieg zu geben. 

131
00:07:16,100 --> 00:07:20,710
Was verbirgt sich einfach hinter
diesem Fancy Begriff, weil 

132
00:07:20,720 --> 00:07:25,480
letzten Endes ist das Prinzip 
dahinter relativ einfach 

133
00:07:25,490 --> 00:07:29,460
nachzuvollziehen, wenn man 
einmal strukturiert durchgeht 

134
00:07:29,510 --> 00:07:32,160
und hilft uns letzten Endes, 
wenn wir es verstanden haben, 

135
00:07:32,440 --> 00:07:35,700
unsere Software letzten Endes. 
Ware zu machen, einfacher zu 

136
00:07:35,710 --> 00:07:38,570
testen, einfacher Testbar zu 
machen und auch einfacher 

137
00:07:38,580 --> 00:07:42,430
erweiterbar zu machen. 
Und von daher liegen wir 

138
00:07:42,440 --> 00:07:46,260
vielleicht los damit. 
Was bedeutet letzten Endes auch 

139
00:07:46,530 --> 00:07:49,200
der Wort Begriff Dependency 
Injection? 

140
00:07:51,690 --> 00:07:53,520
Ja. 
Können wir mal versuchen, 

141
00:07:53,530 --> 00:07:57,060
bisschen zu definieren? 
Also ich glaube, geprägt hat das

142
00:07:57,070 --> 00:08:01,060
Wort Martin Fowler in Jahr 2004 
hat er zumindestens längeren 

143
00:08:01,070 --> 00:08:03,780
blogspot darüber geschrieben, 
den wir unten verlinken. 

144
00:08:03,790 --> 00:08:07,020
Martin Fowler sollte vielen in 
der Industrie ein Begriff sein, 

145
00:08:07,320 --> 00:08:09,740
hat ganz bedeutende Bücher wie 
Clean Coal und Clean 

146
00:08:09,750 --> 00:08:13,450
Architecture und sowas 
geschrieben, ist auch sehr, ist 

147
00:08:13,460 --> 00:08:15,940
auch sehr öffentlich 
öffentlichkeitswirksam 

148
00:08:15,950 --> 00:08:18,460
unterwegs, schreibt sehr viele 
blogspot, schreibt wirklich 

149
00:08:18,470 --> 00:08:22,240
guten Contents, allen möglichen 
Fragen der Software Entwicklung.

150
00:08:22,910 --> 00:08:26,120
Und der hat das erste Mal glaube
ich 2004 oder so wirklich in 

151
00:08:26,130 --> 00:08:29,100
diese Worte. 
Dependency Injection und auch in

152
00:08:29,110 --> 00:08:31,970
ein zweites Wort, was ganz 
wichtig ist in Inversion of 

153
00:08:31,980 --> 00:08:37,490
Control gepackt und damit diese 
Worte geprägt, die gehören 

154
00:08:37,780 --> 00:08:40,730
zwangsläufig zusammen, also 
dependency Action und Inversion 

155
00:08:40,740 --> 00:08:43,190
of Control gleich nochmal dran, 
was genau das ist. 

156
00:08:44,100 --> 00:08:46,890
Wir können gleich hören, 
zwangsweise zusammen. 

157
00:08:47,180 --> 00:08:49,450
Man sagt aber mittlerweile 
eigentlich fast nur noch die 

158
00:08:49,460 --> 00:08:51,590
Pension, weil es eben so 
zusammengehört. 

159
00:08:52,820 --> 00:08:56,660
Was ist es? 
Es gibt jede Menge Prinzipien in

160
00:08:56,670 --> 00:09:01,990
der Softwareentwicklung, die 
Code sauberer, Erwartbarer 

161
00:09:02,030 --> 00:09:04,490
machen. 
Also das ist Solid Prinzip. 

162
00:09:04,500 --> 00:09:08,040
Zum Beispiel ist vielleicht 
einigen ein Begriff und da kommt

163
00:09:08,050 --> 00:09:11,960
darin vor, dass einzelne Klassen
in der objektorientierten 

164
00:09:11,970 --> 00:09:15,450
Programmierung eines Single 
Responsibility verfolgen, das 

165
00:09:15,460 --> 00:09:19,270
heißt einen einzelnen Zweck 
haben, und das bedeutet, wenn 

166
00:09:19,280 --> 00:09:22,390
ich mehrere, wenn meine 
Anwendungen irgendwann so 

167
00:09:22,400 --> 00:09:26,030
komplex wird, dass ich eben in 
ganz viele verschiedene 

168
00:09:26,040 --> 00:09:29,890
Bereiche. 
In Bereichen Code unterteilen 

169
00:09:29,900 --> 00:09:31,720
muss, dann sollte ich das in 
verschiedenen Klassen 

170
00:09:31,730 --> 00:09:34,440
unterteilen. 
Ganz klassisches Beispiel, ich 

171
00:09:34,450 --> 00:09:37,820
habe einen Service, also eine 
Klasse, die Business Logik 

172
00:09:37,830 --> 00:09:42,000
enthält, die mit Daten irgendwie
die Daten verarbeitet und diese 

173
00:09:42,010 --> 00:09:44,500
die sollte vielleicht nicht 
direkt mit meiner Datenbank 

174
00:09:44,510 --> 00:09:47,840
kommunizieren, sondern für die 
Kommunikation meiner Datenbank 

175
00:09:47,850 --> 00:09:50,280
baue ich eine weitere Klasse, 
man nennt das auch ein 

176
00:09:50,290 --> 00:09:54,250
Repository Pattern, baue also 
eine Klasse, die dann für mich 

177
00:09:54,260 --> 00:09:57,640
weiß, Ah okay meine Datenbank 
ist zum Beispiel Mongo DB und 

178
00:09:57,650 --> 00:10:00,650
die benutzt dann die Mongo DB 
SDK und mit der mit der 

179
00:10:00,660 --> 00:10:03,920
Datenbank zu kommunizieren. 
Und in der Realität sieht dann 

180
00:10:03,930 --> 00:10:07,720
so aus, dass man Service, der 
diese Business Logik erhält, 

181
00:10:08,110 --> 00:10:11,840
eine Abhängigkeit auf meine auf 
meinen Datenbank Repository 

182
00:10:11,850 --> 00:10:15,000
Cluster hat und einfach sagt 
Pass auf wenn immer ich Daten 

183
00:10:15,010 --> 00:10:17,960
brauche rede ich nicht direkt 
mit der Datenbank sondern auch 

184
00:10:17,970 --> 00:10:22,520
eine Instanz von diesem 
Datenbank Repository und da in 

185
00:10:22,530 --> 00:10:25,260
dieser Instanz wird es dann 
Funktionen geben wie gib mir 

186
00:10:25,270 --> 00:10:28,580
alle Elemente für ein neues 
Element hinzu Löschen Element, 

187
00:10:28,590 --> 00:10:34,000
bearbeite ein Update, ein 
Element und so weiter und der 

188
00:10:34,010 --> 00:10:38,230
erste intuitivste Teil, den auch
viele Junior Entwickler machen, 

189
00:10:38,240 --> 00:10:41,600
die das erste Mal tun. 
Die ersten von diesen Clean Code

190
00:10:41,610 --> 00:10:45,580
Prinzipien lesen und lernen. 
Würde ich sagen, ist der erste 

191
00:10:45,590 --> 00:10:48,320
intuitive Schritt zu sagen, OK, 
das heißt, wenn ich jetzt diese 

192
00:10:48,330 --> 00:10:51,960
Service Klasse die meine 
Business Logik hat habe, dann 

193
00:10:51,970 --> 00:10:55,610
gehe ich da einfach hin und als 
allererstes im Constructor bevor

194
00:10:55,620 --> 00:10:58,320
ich hier überhaupt irgendwas 
anderes mache instanziiert ich 

195
00:10:58,330 --> 00:11:02,260
jetzt erstmal einen eine neue 
Instanz von dieser Repository 

196
00:11:02,270 --> 00:11:07,390
klasse wahrscheinlich sowie 
Database equals new. 

197
00:11:08,490 --> 00:11:12,580
Database repository. 
Und Speicher mir die die 

198
00:11:12,880 --> 00:11:15,980
Speicher mir die dann in einer 
privaten Variable weg, sodass 

199
00:11:15,990 --> 00:11:18,690
ich in meinen Funktionen wo ich 
Daten verarbeiten kann, eben auf

200
00:11:18,700 --> 00:11:22,060
diese eigene Instanz meine 
Repository klasse zugreifen 

201
00:11:22,070 --> 00:11:24,580
kann. 
Das ist so ein bisschen der 

202
00:11:24,590 --> 00:11:27,430
Standard weg, der den meisten 
Leuten erstmal in den Sinn 

203
00:11:27,440 --> 00:11:30,300
kommt. 
Und was die Pendants Injection, 

204
00:11:30,310 --> 00:11:33,420
Universe of Control jetzt sagt, 
ist nein, nein, nein, nein, 

205
00:11:33,430 --> 00:11:37,910
nein, mach das nicht so. 
Was du willst, nicht dass deine 

206
00:11:38,160 --> 00:11:40,220
Service klasse dir eine 
Abhängigkeit auf diese 

207
00:11:40,230 --> 00:11:43,310
Repository Cluster hat. 
Selber eine Instanz von dieser 

208
00:11:43,320 --> 00:11:46,610
Daten von diesem Datenbank 
Repository erstellt, sondern du 

209
00:11:46,620 --> 00:11:50,210
willst, dass die Instanz des 
Datenbank Repositorys dieses 

210
00:11:50,220 --> 00:11:54,440
Service Klasse verwenden soll 
von außen herein gegeben wird im

211
00:11:54,450 --> 00:11:58,130
Idealfall es gibt verschiedene 
Funktionen aber die Geläufigste 

212
00:11:58,140 --> 00:12:03,210
ist eigentlich als Parameter im 
Constructor, das heißt wenn 

213
00:12:03,220 --> 00:12:06,590
immer ich eine eine neue Instanz
von meiner Service Klasse. 

214
00:12:06,660 --> 00:12:10,340
Stellen muss, muss ich quasi in 
Constructor auch mitgeben. 

215
00:12:10,790 --> 00:12:13,870
Stand die bereits im Voraus 
erstellte Instanz von all ihren 

216
00:12:13,880 --> 00:12:16,660
Dependencies. 
Man s deswegen inversion of 

217
00:12:16,670 --> 00:12:20,410
control, weil die. 
Die Service Klasse die Business 

218
00:12:20,420 --> 00:12:26,660
Logik enthält dann nicht mehr 
selber in Control ist diese 

219
00:12:27,200 --> 00:12:30,730
diese Dependency zu 
instanziieren sondern eine 

220
00:12:30,740 --> 00:12:33,090
bereits instanziierte 
dependency. 

221
00:12:33,100 --> 00:12:37,170
Sie bitte dann verwenden soll 
von außen herein gegeben 

222
00:12:37,180 --> 00:12:39,170
bekommt. 
Also das ist diese Inversion, 

223
00:12:39,180 --> 00:12:42,070
dass sie nicht selber das macht,
sondern dass von außen jemand 

224
00:12:42,080 --> 00:12:46,430
anders diese Dependency rein 
gibt, üblicherweise über den 

225
00:12:46,440 --> 00:12:49,510
Constructor und die dann einfach
verwendet werden kann. 

226
00:12:50,410 --> 00:12:53,900
Du hast vorhin gesagt, einer der
Gründe, warum wir das machen, 

227
00:12:53,910 --> 00:12:56,320
ist diese Single Responsibility 
Prinzip. 

228
00:12:56,330 --> 00:13:02,000
Das heißt eine Klasse soll nur 
eine Funktion haben und diese 

229
00:13:02,010 --> 00:13:04,820
Funktion soll auch in sich 
geschlossen nutzbar sein. 

230
00:13:04,830 --> 00:13:08,080
Großer Vorteil ist, wir können 
das dann auch unabhängig von 

231
00:13:08,090 --> 00:13:13,030
anderen Komponenten testen und 
das ganze Thema Inversion of 

232
00:13:13,040 --> 00:13:17,850
Control und die Action hilft uns
natürlich dabei, das Ganze nicht

233
00:13:17,860 --> 00:13:20,280
nur in sich geschlossen zu 
halten, sondern auch. 

234
00:13:20,690 --> 00:13:23,530
Bestimmte Dinge austauschbar und
flexibel zu halten. 

235
00:13:23,540 --> 00:13:26,640
Du hast gerade das Beispiel 
genannt, den Zugriff auf eine 

236
00:13:26,650 --> 00:13:29,300
Datenbank, aber was ist letzten 
Endes eine Datenbank? 

237
00:13:29,310 --> 00:13:31,980
Es gibt unterschiedliche 
Datenbank Typen und wenn ich 

238
00:13:31,990 --> 00:13:34,360
jetzt natürlich die 
Instanzierung dieser Datenbank 

239
00:13:34,370 --> 00:13:37,700
direkt in meinem Service mache, 
dann bin ich natürlich 

240
00:13:37,710 --> 00:13:42,920
festgelegt oder hab dort ganz 
viele Varianten in diesem 

241
00:13:42,930 --> 00:13:45,340
Konstruktor, welche Art von 
Daten Bankverbindung ich dort 

242
00:13:45,350 --> 00:13:47,600
aufbauen möchte. 
Wenn ich jetzt natürlich das von

243
00:13:47,610 --> 00:13:51,560
außen rein gebe, dann habe ich 
die Möglichkeit hier auch. 

244
00:13:51,760 --> 00:13:55,820
Unterschiedliche Varianten von 
Datenbank Implementierung zu und

245
00:13:55,830 --> 00:14:00,410
deswegen Dependency Injection zu
Injection Hereinzugeben und 

246
00:14:00,420 --> 00:14:03,810
damit diese Abhängigkeiten, die 
man Service benötigt, nämlich 

247
00:14:03,820 --> 00:14:06,840
den Zugriff auf die Datenbank 
flexibel zu gestalten und ich 

248
00:14:06,850 --> 00:14:12,350
kann damit zum einen die 
einzelnen Datenbank Operationen 

249
00:14:12,360 --> 00:14:15,810
individuell testen, für jede 
vielleicht Datenbank Variante 

250
00:14:15,820 --> 00:14:19,250
die ich habe als auch meinen 
Service den ich hier anbiete, 

251
00:14:19,700 --> 00:14:23,490
diesen Repository Service und 
dort. 

252
00:14:23,850 --> 00:14:27,520
Kann ich dann entsprechend auch 
zum Beispiel eine gemobbte 

253
00:14:27,530 --> 00:14:29,840
Datenbank hinterlegen, um Dinge 
vielleicht auch testen zu 

254
00:14:29,850 --> 00:14:32,300
können, wenn diese reale 
Datenbank mir in diesen Test 

255
00:14:32,310 --> 00:14:37,220
cases gar nicht zur Verfügung 
steht und ein Prinzip, was in 

256
00:14:37,230 --> 00:14:40,680
einer Informatik Vorlesungen in 
der Uni auch immer gepredigt 

257
00:14:40,690 --> 00:14:44,120
wurde, ist das Prinzip der 
geringen Kopplung, das heißt, 

258
00:14:44,130 --> 00:14:47,850
wenn wir einzelne Komponenten 
entwickeln, egal ob es jetzt 

259
00:14:47,970 --> 00:14:51,620
einzelne Services sind oder 
einzelne Klassen, sollten diese 

260
00:14:51,830 --> 00:14:55,120
möglichst unabhängig voneinander
nutzbar. 

261
00:14:55,190 --> 00:14:58,730
Sein und sich gegenseitig 
verwenden. 

262
00:14:58,740 --> 00:15:02,610
Aber nicht unbedingt. 
Gegenseitig bedingen, das heißt,

263
00:15:02,620 --> 00:15:05,410
ich kann sie auch unabhängig 
voneinander verwenden. 

264
00:15:05,420 --> 00:15:08,630
Und wenn ich jetzt wirklich eine
neue Instanz dieses Services 

265
00:15:08,640 --> 00:15:11,870
erstelle, kann ich dort 
unterschiedliche Dinge 

266
00:15:11,880 --> 00:15:15,250
entdeckten, um halt verschiedene
Use Cases zu adressieren. 

267
00:15:16,330 --> 00:15:18,980
Genau, ich stelle. 
Stell dir vor, ich möchte andere

268
00:15:18,990 --> 00:15:22,390
Datenbank Technologie in Zukunft
verwenden, also nicht mongo DB, 

269
00:15:22,400 --> 00:15:24,660
sondern ich möchte irgendwie 
migrieren auf irgendwas anderes,

270
00:15:25,010 --> 00:15:28,240
dann würde ich ja völlig 
ausreichen nur dieses Datenbank 

271
00:15:28,250 --> 00:15:32,290
Repository im Code anzupassen 
und der Service die Business 

272
00:15:32,300 --> 00:15:35,210
Logik erhält kriegt im Idealfall
davon überhaupt gar nichts mit, 

273
00:15:35,370 --> 00:15:38,270
weil der ja ohnehin einfach nur 
vom Repository Methoden gibt mir

274
00:15:38,280 --> 00:15:41,160
alle Elemente für ein neues 
Element zu löschen, Element und 

275
00:15:41,170 --> 00:15:44,710
so weiter verwendet, aber das 
hat jetzt nichts geändert, so 

276
00:15:44,720 --> 00:15:47,890
dass generell einfach solid lose
Kopplung und und. 

277
00:15:47,960 --> 00:15:50,970
T Code. 
Und was Sie beachten aber sagt 

278
00:15:50,980 --> 00:15:54,210
ist das solltest du ESO machen 
und dann aber halt eben von 

279
00:15:54,250 --> 00:15:58,380
außen eine Instanz reingeben und
es gibt auch ganz viel Kritik 

280
00:15:58,390 --> 00:16:01,520
daran, da können wir auch gleich
nochmal zu, aber die Testbarkeit

281
00:16:01,530 --> 00:16:04,540
die du gerade angesprochen hast,
die ist für mich auch so der 

282
00:16:04,580 --> 00:16:07,980
größte Punkt warum ich das zum 
Beispiel in all meinen Projekten

283
00:16:08,210 --> 00:16:11,220
auch schon seit langer, langer 
Zeit immer so mache, das finde 

284
00:16:11,230 --> 00:16:14,010
ich, schlägt für mich auch alle 
Kritikpunkte, die wir gleich 

285
00:16:14,020 --> 00:16:17,460
noch mal besprechen ist, dass 
diese große Testbarkeit jedoch 

286
00:16:17,470 --> 00:16:20,200
reinkam, reinkommt, da sich eine
wie du gesagt hast. 

287
00:16:20,270 --> 00:16:23,570
Fake eine Mark Datenbank in den 
Test Reihen geben kann. 

288
00:16:23,580 --> 00:16:26,110
Wenn ich meine Business Logik 
Klasse teste und gar nicht 

289
00:16:26,120 --> 00:16:28,260
wirklich gegen eine Datenbank 
kommunizieren, sondern einfach 

290
00:16:28,270 --> 00:16:31,910
faken kann, was passieren soll, 
wenn E wenn diese wenn diese 

291
00:16:31,970 --> 00:16:34,070
wenn diese Business Logik 
einfach mir alle Elemente 

292
00:16:34,080 --> 00:16:37,250
aufruft, dass ich das eben ganz 
isoliert testen kann, ist für 

293
00:16:37,260 --> 00:16:41,150
mich einer der größten Benefits 
von Dependency Injection. 

294
00:16:42,190 --> 00:16:45,070
Ein Beispiel einfach, ob das 
greifbarer zu machen, was ich 

295
00:16:45,080 --> 00:16:49,950
gerne geben würde, was ich super
gut fand in dem youtube Video zu

296
00:16:49,960 --> 00:16:53,790
dependency injection. 
Vom David Thielke eine Analogie 

297
00:16:53,830 --> 00:16:56,680
zum Einkaufen, das heißt eben 
nicht, ein Einkaufs Service 

298
00:16:56,840 --> 00:16:59,390
baue. 
Dann kann ich diesen Service 

299
00:16:59,400 --> 00:17:03,250
sagen, was soll der? 
Der Service letzten Endes für 

300
00:17:03,260 --> 00:17:08,310
Produkte beschaffen und am Ende 
möchte ich aber völlig flexibel 

301
00:17:08,319 --> 00:17:11,410
sein in denen, wo letzten Endes 
dieser Einkaufs stattfindet. 

302
00:17:11,420 --> 00:17:14,950
Das heißt, wenn ich dir sage, 
bitte kauf mir eine Cola, dann 

303
00:17:14,960 --> 00:17:18,250
möchte ich nicht, dass du immer 
in dem gleichen Laden läufst, 

304
00:17:18,300 --> 00:17:21,260
sondern du sollst frei 
entscheiden, welcher Laden ist. 

305
00:17:21,270 --> 00:17:23,550
Derjenige, der gerade bei dir am
nächsten ist. 

306
00:17:23,599 --> 00:17:26,540
Weil sobald ich das Hard Code in
dieser Einkaufs Klasse zum 

307
00:17:26,550 --> 00:17:31,630
Beispiel kaufe, Cola bei Lidl, 
dann musst du immer nach Lidl 

308
00:17:31,640 --> 00:17:33,300
gehen, auch wenn der nächste 
Supermarkt. 

309
00:17:33,370 --> 00:17:36,390
Netto oder Aldi ist. 
Und wenn ich jetzt eine klasse 

310
00:17:36,400 --> 00:17:40,000
Bau, wo ich diese Abhängigkeit, 
nämlich wo letzten Endes der 

311
00:17:40,010 --> 00:17:43,990
Einkauf stattfindet, injection 
kann, dann kann ich je nach 

312
00:17:44,000 --> 00:17:47,570
Szenario wo wir uns gerade 
befinden, die den Auftrag geben 

313
00:17:47,580 --> 00:17:49,450
G einkaufen. 
Und wenn du dann halt 

314
00:17:49,460 --> 00:17:52,610
zufälligerweise einen Lidl zur 
Verfügung hast, kann ich dann 

315
00:17:52,760 --> 00:17:55,740
den Lidl Service Injection und 
wenn du in der Nähe vom Aldi 

316
00:17:55,750 --> 00:17:58,670
bist kann ich den Aldi Service 
Injection, das heißt ich kann 

317
00:17:58,680 --> 00:18:03,170
dann wirklich sehr flexibel auch
auf verschiedene Laufzeit 

318
00:18:03,180 --> 00:18:06,440
Umgebung reagieren. 
Und mich darauf entsprechend 

319
00:18:06,450 --> 00:18:08,950
einstellen. 
Und wenn ich teste, kann ich 

320
00:18:08,960 --> 00:18:11,290
eben irgendein Fake Supermarkt 
in checken. 

321
00:18:11,300 --> 00:18:14,020
Wenn ich genau weiß, wie er in 
die sich in diesem Test verhält,

322
00:18:14,490 --> 00:18:16,220
weil ich ja gar nicht testen 
will, ob der Supermarkt 

323
00:18:16,230 --> 00:18:18,580
funktioniert, sondern ob ein 
Einkaufs Service funktioniert. 

324
00:18:18,750 --> 00:18:21,000
Ne, und das ist ja 
Dienstbarkeit, aber man merkt 

325
00:18:21,010 --> 00:18:23,600
schon in den meisten 
Programmiersprachen läuft das 

326
00:18:23,610 --> 00:18:27,000
aber dann darauf hinaus, dass 
man das, was auch immer da rein 

327
00:18:27,010 --> 00:18:30,980
injected wird, gar nicht genau 
definiert, sondern dass einfach 

328
00:18:30,990 --> 00:18:33,140
eine Abstraktion von irgendwas 
ist. 

329
00:18:33,150 --> 00:18:35,970
Also in der Java und dot net 
heißt, das Interface zum 

330
00:18:35,980 --> 00:18:38,240
Beispiel ne, also dass ich 
einfach sage, ich definiere. 

331
00:18:38,590 --> 00:18:41,930
Was eine Abhängigkeit können 
muss, ist eigentlich Interface. 

332
00:18:41,940 --> 00:18:45,640
Nichts als Vertrag definiert, 
was auch immer du mir da rein 

333
00:18:45,650 --> 00:18:48,580
gibst. 
Muss eine Funktion haben. 

334
00:18:49,730 --> 00:18:53,440
Alle Elemente abholen, ein 
Element löschen, Element Update 

335
00:18:53,450 --> 00:18:57,180
und ein neues Element hinzufügen
und wie du das Implementierst. 

336
00:18:57,190 --> 00:19:00,140
Ob das jetzt wirklich gegen 
Mongo DB geht, ob du das Fakest,

337
00:19:00,150 --> 00:19:02,510
ob das gegen andere Datenbank 
geht interessiert mich nicht. 

338
00:19:03,010 --> 00:19:05,740
Alles was wir vereinbart haben 
ist, ich bekomme von dir 

339
00:19:05,790 --> 00:19:09,780
irgendwas rein injected also i 
eine eine Implementierung eines 

340
00:19:09,790 --> 00:19:12,380
Interfaces wenn man in diesen 
Sprachen bleibt bekomme ich von 

341
00:19:12,390 --> 00:19:17,160
der E rein injected und solange 
das diese Methoden anbietet die 

342
00:19:17,170 --> 00:19:19,930
ich erwarte weiß meine Business 
Logik. 

343
00:19:20,000 --> 00:19:22,220
Gar nicht, was da jetzt wirklich
passiert. 

344
00:19:22,230 --> 00:19:24,570
Und in diesem Supermarkt 
Analogie zu bleiben, das heißt, 

345
00:19:24,580 --> 00:19:28,620
ich definiere einmal, was kann 
ein Supermarkt, also ich kann da

346
00:19:28,890 --> 00:19:33,340
ein Item aus dem Regal nehmen, 
ich kann einem ein bestimmtes 

347
00:19:33,350 --> 00:19:36,820
Item suchen, also einen Apfel 
suchen, den aus denen egal 

348
00:19:36,830 --> 00:19:39,060
nehme, ich kann zur Kasse 
bringen, ich kann den bezahlen, 

349
00:19:39,070 --> 00:19:42,620
dann habe ich den, und dass 
diese Anforderungen erfüllen ja 

350
00:19:43,050 --> 00:19:45,880
nahezu alle Supermärkte da 
draußen, das heißt, ich kann 

351
00:19:45,890 --> 00:19:48,980
meine Business Logik, diese 
Elemente reingeben, wenn meine 

352
00:19:48,990 --> 00:19:51,360
Business Logik jetzt einen 
einkaufszettel. 

353
00:19:51,980 --> 00:19:55,250
Umzuwandeln in tatsächliche Ware
also, die weiß ich nicht. 

354
00:19:55,260 --> 00:19:58,430
Items für den Einkaufszettel 
durchzugehen und dann an den 

355
00:19:58,440 --> 00:20:00,750
Supermarkt die Befehl zu 
schicken, wenn Apfel drauf 

356
00:20:00,760 --> 00:20:03,930
steht, einen Apfel zu nehmen, 
einen Apfel zu bezahlen und so 

357
00:20:03,940 --> 00:20:06,820
weiter. 
Dann ist das ja für meine 

358
00:20:06,830 --> 00:20:08,930
Business Logik völlig 
ausreichend und testen kann ich 

359
00:20:08,940 --> 00:20:11,040
dann natürlich mal simulieren, 
wie es denn wäre, wenn kein 

360
00:20:11,050 --> 00:20:14,660
Apfel zur Verfügung steht oder 
wenn es nur Birnen gibt oder was

361
00:20:14,670 --> 00:20:16,530
weiß ich man Alternativen 
programmiert. 

362
00:20:16,930 --> 00:20:20,360
Deswegen abstrahiert man das in 
der Regel und häufig heißen 

363
00:20:20,370 --> 00:20:22,120
diese Abstraktion neben 
Interfaces. 

364
00:20:22,810 --> 00:20:25,950
Und du hattest gesagt, 
Interfaces haben irgendwie den 

365
00:20:25,990 --> 00:20:30,060
Vertrag, den zugrundeliegenden 
Service, Contract oder Contract,

366
00:20:30,070 --> 00:20:33,120
je nachdem in welcher Sprache 
man sich da befindet und 

367
00:20:33,130 --> 00:20:35,800
definieren Dadrüber welche 
Funktionalitäten hier zur 

368
00:20:35,810 --> 00:20:36,640
Verfügung. 
Verstehen. 

369
00:20:37,060 --> 00:20:41,330
Das bedeutet, wenn ich die Pence
Injection mit einer Sprache 

370
00:20:41,340 --> 00:20:45,370
implementiere, die diese Art von
Interfaces unterstützt, egal ob 

371
00:20:45,380 --> 00:20:48,870
es jetzt irgendwie Java, C, 
Sharp oder andere Sprachen sind,

372
00:20:48,920 --> 00:20:52,270
dann kann ich tatsächlich 
hingehen und mit den Basis 

373
00:20:52,280 --> 00:20:54,670
Funktionalitäten dieser 
objektorientierten 

374
00:20:54,880 --> 00:20:59,360
Programmiersprache die 
Perception implementieren und 

375
00:20:59,370 --> 00:21:01,990
tatsächlich in der Form 
implementieren, wie es 

376
00:21:02,000 --> 00:21:04,560
ursprünglich mal gedacht war. 
Das heißt, ich gehe hin und 

377
00:21:04,600 --> 00:21:06,870
definiere diese Verträge und 
kann dann. 

378
00:21:07,180 --> 00:21:09,420
Bestimmte Klassen 
implementieren, die diesen 

379
00:21:09,430 --> 00:21:13,720
Vertrag erfüllen und kann dann, 
egal ob ich jetzt den Service 

380
00:21:13,730 --> 00:21:17,520
für die Mongo DB oder den 
Service für die Oracle DB habe, 

381
00:21:17,530 --> 00:21:22,610
kann ich diesen dann Injection 
in meinen entsprechenden Dienst?

382
00:21:23,130 --> 00:21:27,080
Natürlich kann ich das manuell 
machen, aber viele die sich 

383
00:21:27,090 --> 00:21:30,140
heute damit beschäftigen und ich
glaube, wenn du jetzt hingehst 

384
00:21:30,150 --> 00:21:34,780
und nach irgendwie dependency 
Injection Programmiersprache X 

385
00:21:34,830 --> 00:21:38,140
suchst, online willst du die 
ersten 20 Ergebnis. 

386
00:21:38,310 --> 00:21:42,000
Ergebnisse bekommen mit 
irgendwelchen Frameworks und 

387
00:21:42,500 --> 00:21:46,240
Tool Kits, die du nutzen kannst,
um in dieser Technologie 

388
00:21:46,680 --> 00:21:49,240
Dependency Injection 
Anführungsstrichen einfacher zu 

389
00:21:49,250 --> 00:21:53,050
machen und ich glaube das ist 
ein Thema, woran sich letzten 

390
00:21:53,060 --> 00:21:58,110
Endes auch n bisschen da die 
Verwirrung rund um den Begriff 

391
00:21:58,440 --> 00:22:03,050
ergibt, weil halt das die Sache 
zumindest für Einsteiger häufig 

392
00:22:03,280 --> 00:22:07,670
eher komplexer als einfacher 
Macht und natürlich da viel 

393
00:22:07,680 --> 00:22:09,730
Abstraktion reinbringt in ein 
Prinzip. 

394
00:22:09,800 --> 00:22:12,810
Das an sich, wir haben es gerade
beschrieben, super simpel ist. 

395
00:22:13,680 --> 00:22:16,430
Genau, denn Dependency Injection
ist eigentlich nichts anderes. 

396
00:22:17,100 --> 00:22:21,630
Als über den Constructor diese 
Dependance mit einzugeben, aber.

397
00:22:22,700 --> 00:22:24,830
Was ist denn jetzt, wenn meine 
Dependencies auch wieder 

398
00:22:24,840 --> 00:22:28,460
dependencies haben, wenn zum 
Beispiel meine, meine, meine 

399
00:22:28,470 --> 00:22:34,230
Datenbank Repository the 
Dependency hat auf das auf das 

400
00:22:34,240 --> 00:22:37,730
Mongo DB SDK und wenn das 
wiederum Dependency irgendwas 

401
00:22:37,740 --> 00:22:41,310
anderes hat, dann können diese 
dependency Graphen sehr komplex 

402
00:22:41,320 --> 00:22:45,090
werden und das bedeutet, ich 
möchte eigentlich gerade nur mal

403
00:22:45,380 --> 00:22:49,830
die, die die Klasse mit meiner 
Business Logik instanzieren muss

404
00:22:49,840 --> 00:22:54,320
aber vorher 5 6 vielleicht 15 
verschiedene andere Klassen. 

405
00:22:54,390 --> 00:22:57,000
Präsentieren die sich dann also 
nicht erst mal 2. 

406
00:22:57,010 --> 00:23:00,340
Klasse Instanziieren, damit ich 
das Mongo DSTK haben, kann ich 

407
00:23:00,350 --> 00:23:03,330
diese beiden Klassen rein gebe, 
dann muss ich dienen, dass die 

408
00:23:03,340 --> 00:23:06,550
Repository klasse Instanzieren 
wo ich dann.de reingehen kann 

409
00:23:06,560 --> 00:23:09,930
und so weiter also heißt es kann
sehr sehr sehr sehr sehr komplex

410
00:23:09,940 --> 00:23:12,870
werden diese großen dependency 
Graphen, gerade wenn ein Projekt

411
00:23:12,880 --> 00:23:17,510
sehr groß und umfänglich ist. 
Und um das Problem zu lösen, 

412
00:23:18,160 --> 00:23:20,790
dass sich das nicht irgendwie 
jedes mal mir 1000 Gedanken 

413
00:23:20,800 --> 00:23:25,900
machen muss, gibt es Frameworks,
die eine automatische Dependency

414
00:23:25,910 --> 00:23:29,250
Action mit sogenannten 
Containern und Service Location 

415
00:23:29,260 --> 00:23:32,040
machen. 
Und was das ist, ist im Prinzip,

416
00:23:32,050 --> 00:23:35,620
ich habe eine große Registry, wo
ich alle meine Klassen, die 

417
00:23:35,660 --> 00:23:37,870
irgendwas mit Dependancen 
Jacksons zu tun haben, also die 

418
00:23:37,880 --> 00:23:42,310
entweder selber dependency sind 
oder die Dependencies haben, an 

419
00:23:42,320 --> 00:23:45,700
einer großen zentralen Stelle 
registriere und dennoch quasi 

420
00:23:45,710 --> 00:23:48,840
sage Pass auf, das war eine 
Klasse, das ist der Constructor,

421
00:23:48,850 --> 00:23:53,010
der verwendet werden soll da. 
Wenn du also damit du die 

422
00:23:53,020 --> 00:23:57,030
eingeben kannst und dann bringen
diese Frameworks einen Service 

423
00:23:57,040 --> 00:24:01,010
locator, so heißt das mit der 
dann quasi sagt dem ich dann 

424
00:24:01,020 --> 00:24:05,080
quasi sagen kann, hey, ich 
möchte jetzt bitte eine Instanz 

425
00:24:05,130 --> 00:24:08,520
von meiner Einkaufs Klasse haben
oder von meiner von meinem 

426
00:24:08,530 --> 00:24:12,070
Service der meine Business Logik
haben und was dann dieser 

427
00:24:12,080 --> 00:24:14,690
Service Locator macht ist er 
schaut sich den Constructor an, 

428
00:24:14,890 --> 00:24:18,260
weiß also welche Dependencies 
ich brauche, schaut ob die auch 

429
00:24:18,270 --> 00:24:21,400
alle vorher irgendwo irgendwo 
registriert waren in dieser 

430
00:24:21,410 --> 00:24:24,680
Registry wenn ja schaut sich an 
welche Dependencies diese 

431
00:24:24,690 --> 00:24:26,870
brauchen. 
Und Instanziiert dann diese 

432
00:24:26,880 --> 00:24:30,640
Kette einen Schritt nach dem 
anderen durch und gib mir dann 

433
00:24:30,650 --> 00:24:32,890
nachher einfach eine fertige 
Instanz von meiner Business 

434
00:24:32,900 --> 00:24:35,630
Logik klasse rein oder 
vielleicht sogar eine Singleton,

435
00:24:35,640 --> 00:24:37,630
wenn nicht definiert habe, dass 
ich davon nur eine einzige 

436
00:24:37,640 --> 00:24:39,570
Instanz globale meinem System 
haben möchte. 

437
00:24:39,790 --> 00:24:43,050
Da gibt es mir Dienstag heraus, 
wenn ich danach frage, aber 

438
00:24:43,060 --> 00:24:46,210
diese diese Frameworks nehmen 
wir einfach dann die große 

439
00:24:46,220 --> 00:24:49,160
Arbeit ab, dass ich, dass ich 
nicht diese dependency chain 

440
00:24:49,170 --> 00:24:51,990
jedesmal manuell wieder auflösen
muss, sondern dass ich einfach 

441
00:24:52,080 --> 00:24:55,250
einmal alles registriere, Sage, 
was sind die zu verwendenden 

442
00:24:55,260 --> 00:24:57,570
Constructor. 
Und dann kann ich eben diese 

443
00:24:57,580 --> 00:25:01,410
Frameworks einfach fragen nach 
Hey, gib mir doch mal bitte eine

444
00:25:01,420 --> 00:25:04,310
Instanz von meiner sowieso 
klasse und unter der 

445
00:25:04,320 --> 00:25:06,350
Voraussetzung, dass alle 
Dependencies und deren 

446
00:25:06,360 --> 00:25:09,070
Dependencies und deren 
Dependencies registriert habe in

447
00:25:09,080 --> 00:25:11,330
dieser Registry. 
Diese Container macht man 

448
00:25:11,340 --> 00:25:12,930
üblicherweise, wenn die App 
startet. 

449
00:25:13,590 --> 00:25:16,130
Unter der Voraussetzung, dass da
eben alles registriert ist, 

450
00:25:16,140 --> 00:25:19,060
bekomme ich dann auch eine 
fertig richtig instanziierte 

451
00:25:19,070 --> 00:25:22,040
Instanz und kann dadurch 
natürlich auch steuern. 

452
00:25:22,550 --> 00:25:24,700
Wenn ich jetzt morgen die 
Datenbank Technologie wechsle, 

453
00:25:25,010 --> 00:25:27,390
könnte ich einfach eine andere 
Datenbank Technologien der 

454
00:25:27,400 --> 00:25:30,300
Registry registrieren und 
trotzdem würde alles weiterhin 

455
00:25:30,310 --> 00:25:34,880
aufgelöst werden. 
Die Frage ist jetzt, brauche ich

456
00:25:34,950 --> 00:25:38,340
solche Frameworks oder kann ich 
letzten Endes das Ganze auch 

457
00:25:38,350 --> 00:25:42,100
händisch implementieren. 
Und ich glaube es wie bei allen 

458
00:25:42,110 --> 00:25:46,440
Abstraktionen die Frage, wie 
groß und komplex ist meine 

459
00:25:46,450 --> 00:25:49,850
Anwendung, lohnt es sich, dass 
ich mich in so einer Technologie

460
00:25:49,860 --> 00:25:52,300
eine zusätzliche Technologie, 
eine zusätzliche Attraktion 

461
00:25:52,340 --> 00:25:56,870
einarbeiten, um dann letzten 
Endes in der Entwicklung und in 

462
00:25:56,880 --> 00:25:59,540
der Wartung Komplexität 
rauszunehmen, aber am Anfang 

463
00:25:59,550 --> 00:26:01,760
muss ich mich in diese neue 
Technologie einarbeiten. 

464
00:26:01,960 --> 00:26:03,600
Man muss natürlich auch dazu 
sagen, dass bestimmte 

465
00:26:03,610 --> 00:26:06,900
technologienwie.net. 
Vor halt das Prinzip von 

466
00:26:06,910 --> 00:26:09,860
Dependency Injection schon out 
of the Box mitbringen. 

467
00:26:10,290 --> 00:26:13,410
Das heißt, viele Dinge 
funktionieren da schon Bild in, 

468
00:26:14,710 --> 00:26:17,540
aber die Frage ist, an welchem 
Punkt sollte ich mir jetzt 

469
00:26:17,550 --> 00:26:21,590
darüber Gedanken machen, solche.
Ja, solche Abstraktionen 

470
00:26:21,600 --> 00:26:24,990
einzusetzen und mein Projekt 
darum zu ergänzen. 

471
00:26:25,880 --> 00:26:28,730
Mhm. 
Ich würde erst mal anfangen, wie

472
00:26:28,740 --> 00:26:31,850
immer. 
Also ich persönlich verfolge 

473
00:26:31,890 --> 00:26:33,730
eigentlich immer gerne die 
Strategie, dass so ein 

474
00:26:33,740 --> 00:26:36,720
Framework, dass ich so frag, 
erst dann holen sollte, wenn 

475
00:26:36,730 --> 00:26:39,100
das, wenn ich das Problem habe, 
was löst. 

476
00:26:39,110 --> 00:26:41,650
Wenn ich jetzt, wenn ich ein 
sehr simpler dependency Graphen 

477
00:26:41,660 --> 00:26:44,050
habe, brauche ich das in der 
Regel nicht. 

478
00:26:45,330 --> 00:26:49,140
Und das ist auch eigentlich so. 
Also die Hauptkritik, es gibt 

479
00:26:49,150 --> 00:26:53,270
sehr viel Kritik an diesen 
Frameworks, die meiste Kritik 

480
00:26:53,280 --> 00:26:56,190
richtet sich aber eigentlich 
immer gegen diese Container und 

481
00:26:56,200 --> 00:27:00,350
Service locator, wenn man Kritik
an Dependency Injection und 

482
00:27:00,360 --> 00:27:02,860
Inversion of Control hört, ist 
eigentlich fast immer ein 

483
00:27:02,870 --> 00:27:05,420
Framework gemeint. 
Ich glaube, es steht außer 

484
00:27:05,430 --> 00:27:07,580
Frage, dass man die Panels 
Injection macht. 

485
00:27:08,170 --> 00:27:12,660
Ob ich das aber mit einem 
Framework mache, das hängt 

486
00:27:12,670 --> 00:27:16,660
wahrscheinlich daran, wie 
komplex meine Dependency Chain 

487
00:27:16,670 --> 00:27:21,160
ist und viele sagen auch eine 
Komplexe, eine sehr eine zu 

488
00:27:21,170 --> 00:27:25,660
komplexe Dependency Chain ist 
schon ein Anti Pattern, bedeutet

489
00:27:25,670 --> 00:27:28,890
schon schlechte Kapselung und 
werfen diesen Frameworks 

490
00:27:28,900 --> 00:27:31,520
natürlich vor, dass sie gerade 
unerfahrene Entwickler innen und

491
00:27:31,530 --> 00:27:35,360
Entwicklern genau das fördern, 
indem ich einfach total egal wie

492
00:27:35,370 --> 00:27:37,340
komplex. 
Deine Dependency Chain wird 

493
00:27:37,380 --> 00:27:39,000
registriert. 
Einfach alles an dir alles 

494
00:27:39,010 --> 00:27:42,100
einmal an diesem Container und 
dann kannst du einfach den 

495
00:27:42,110 --> 00:27:45,390
Service rausnehmen, wird dann 
richtig zusammengebaut und das 

496
00:27:45,900 --> 00:27:48,930
ja, das bedeutet manchmal 
vielleicht, dass sich ein 2 

497
00:27:48,940 --> 00:27:52,140
Gedanken zu wenig macht im 
zumindest an der Perspektive von

498
00:27:52,150 --> 00:27:55,450
den Kritikern davon und dann 
einfach sagen, ja, vielleicht 

499
00:27:55,460 --> 00:27:57,970
solltest du auch mal schauen 
warum dependency Graphen so 

500
00:27:57,980 --> 00:28:00,600
verdammt komplex ist, dass 
dieses Framework brauchst. 

501
00:28:00,640 --> 00:28:03,470
Vielleicht ist das aber auch 
schon ein Fehler und eine eine 

502
00:28:03,480 --> 00:28:06,830
Komplexität, die du verstecken 
kannst mit diesen Frameworks. 

503
00:28:07,070 --> 00:28:09,210
Die aber trotzdem Code Smell 
ist, die aber trotzdem 

504
00:28:09,220 --> 00:28:12,820
vielleicht eine Wartbarkeit 
irgendwie nicht ganz, also nicht

505
00:28:12,830 --> 00:28:17,300
nicht wirklich fördert. 
Weil du eben diese Frameworks 

506
00:28:17,310 --> 00:28:18,940
einfach diese Magic für dich 
machen. 

507
00:28:20,370 --> 00:28:23,400
Und ich glaube, gerade wenn man 
in eine Technologie neu 

508
00:28:23,410 --> 00:28:27,420
einsteigt, ist es immer 
sinnvoll, möglichst viel auch 

509
00:28:27,430 --> 00:28:30,820
selber zu implementieren. 
Von diesen Patterns und sich da 

510
00:28:30,830 --> 00:28:33,580
nicht auf zu viel Magie zu 
verlassen, weil das natürlich 

511
00:28:33,590 --> 00:28:36,800
einiges weg abstrahiert, was 
einem dann letzten Endes nicht 

512
00:28:36,810 --> 00:28:40,320
ermöglicht, wirklich auch den 
Mehrwert eines bestimmten 

513
00:28:40,330 --> 00:28:45,140
Entwurfs Musters auch zu 
erlernen und auch auszunutzen 

514
00:28:45,610 --> 00:28:49,520
und einen Punkt gerade bei 
dependency Action ist natürlich,

515
00:28:49,530 --> 00:28:53,130
dass wir höchst testbare. 
Komponenten bauen wollen. 

516
00:28:53,140 --> 00:28:55,930
Und wenn wir da natürlich über 
solche Frameworks arbeiten, 

517
00:28:55,940 --> 00:28:58,710
machen wir uns das testen auch 
wieder schwieriger. 

518
00:28:59,180 --> 00:29:02,350
Das bedeutet, ich muss dann auch
das berücksichtigen, wenn ich 

519
00:29:02,360 --> 00:29:04,430
dann solche Technologien 
einsetze. 

520
00:29:05,040 --> 00:29:06,430
Total. 
Das ist ein, das ist ein richtig

521
00:29:06,440 --> 00:29:09,840
guter Punkt. 
Ich mache also, weil es ist 

522
00:29:09,850 --> 00:29:12,730
einfach schwierig, diese 
Frameworks zu testen, ich es 

523
00:29:12,740 --> 00:29:15,470
eigentlich fast nicht möglich, 
diesen also schon möglich, aber 

524
00:29:15,480 --> 00:29:20,610
einfach ja nicht ganz trivial 
und auch nicht immer wird nicht 

525
00:29:20,620 --> 00:29:22,770
immer gemacht, dass eben dieses 
Framework diesen Locator 

526
00:29:22,780 --> 00:29:25,160
wirklich selber. 
Teste, und das ist ja eigentlich

527
00:29:25,170 --> 00:29:29,290
die freie Sicht, muss aber 
eigentlich muss ich testen, ob 

528
00:29:29,300 --> 00:29:32,360
ich denn da alle Dependencies 
richtig registriert habe und ich

529
00:29:32,370 --> 00:29:35,420
muss eigentlich auch testen, ob 
das ob der richtige Konstruktor 

530
00:29:35,430 --> 00:29:37,400
verwendet wird beim 
Zusammenbauen dieser 

531
00:29:37,410 --> 00:29:41,040
Dependencies und sowas und das 
ist auch einer der großen 

532
00:29:41,050 --> 00:29:43,360
Kritikpunkte, dass das alles 
wegfällt, denn. 

533
00:29:44,840 --> 00:29:47,650
Das ist auch problematisch und 
das ist mir auch schon passiert.

534
00:29:48,790 --> 00:29:52,540
Ein großes Problem von diesem 
Service Location ist das 

535
00:29:52,550 --> 00:29:56,660
fehlende Registrierungen daran 
oft erst zur Runtime auffallen. 

536
00:29:56,750 --> 00:29:59,850
Also das ist ne der wenn ich das
Kompilieren sieht das alles gut 

537
00:29:59,860 --> 00:30:02,720
aus und in dem Moment wo mein 
Code das erste Mal so eine 

538
00:30:02,730 --> 00:30:05,840
Klasse zusammenbauen möchte über
einen Service locator und dann 

539
00:30:05,850 --> 00:30:09,210
aber die eine irgendeine 
Dependency oder Sub dependency 

540
00:30:09,220 --> 00:30:13,000
oder sub dependency nicht 
registriert ist knallt das gibt 

541
00:30:13,010 --> 00:30:15,740
mir Exception und mein ganzes 
irgendwann ganze Programm stürzt

542
00:30:15,780 --> 00:30:19,560
ab wenn ich halt selber diese 
Dependency zusammenbauen. 

543
00:30:19,630 --> 00:30:21,810
Dann kann ich natürlich im 
Konstruktor sicherstellen, dass 

544
00:30:21,820 --> 00:30:24,500
alles da ist, weil ich ja diese 
Variablen selber. 

545
00:30:25,150 --> 00:30:28,770
Natürlich definiere, wohingegen 
ich mich darauf verlassen muss, 

546
00:30:28,780 --> 00:30:32,640
dass das auch richtig, richtig 
registriert wurde, denn es fällt

547
00:30:32,650 --> 00:30:34,900
erst zur Runtime auf. 
Es fällt üblicherweise nicht in 

548
00:30:34,910 --> 00:30:37,610
Unit oder integrations Tests 
auf, sondern wirklich erst wenn 

549
00:30:37,620 --> 00:30:40,210
das Ding gestartet ist. 
Weil ich bei Unit und 

550
00:30:40,220 --> 00:30:42,470
Integration Tests ohnehin 
vielleicht sogar ohne Locator 

551
00:30:42,480 --> 00:30:47,330
mache, weil ich mir die selber 
reingeben möchte, das heißt das 

552
00:30:47,340 --> 00:30:49,280
ist auf jeden Fall ein Punkt, 
den man im Hintergrund sollte, 

553
00:30:49,290 --> 00:30:51,990
wie teste ich das, wie stell ich
denn sicher, dass sich alle 

554
00:30:52,000 --> 00:30:55,730
meine mal alle meine Services 
auch richtig instanziieren 

555
00:30:55,740 --> 00:30:59,120
lassen? 
Ich glaube, zusammenfassend 

556
00:30:59,130 --> 00:31:02,140
lässt sich sagen und du hattest 
vorhin schon erwähnt, dependency

557
00:31:02,150 --> 00:31:06,090
und in Inversion of Control sind
Dinge, die man tun sollte. 

558
00:31:06,210 --> 00:31:10,320
Man kann einfacher testen, von 
daher auf jeden Fall anschauen 

559
00:31:10,330 --> 00:31:13,200
und machen, wenn man es noch 
nicht tut, aber bei den 

560
00:31:13,210 --> 00:31:15,970
Frameworks sollte man schauen, 
hilft es mir wirklich, also 

561
00:31:16,010 --> 00:31:19,780
hilft es mir die Komplexität zu 
reduzieren oder erzeuge ich 

562
00:31:19,790 --> 00:31:23,170
dadurch einfach durch die 
Abstraktion Mehraufwand für mich

563
00:31:23,460 --> 00:31:27,030
und ich glaube das muss man 
individuell nach jedem Projekt 

564
00:31:27,070 --> 00:31:28,890
für jedes Projekt selber 
entscheiden und ich fand 

565
00:31:28,900 --> 00:31:31,280
eigentlich gerade das was du 
gesagt hattest sehr gut. 

566
00:31:31,330 --> 00:31:34,000
Erstmal ohne zu starten und an 
dem Punkt wo man eine 

567
00:31:34,120 --> 00:31:36,060
Herausforderung erreicht und 
sagt, jetzt habe ich ein 

568
00:31:36,070 --> 00:31:39,060
Problem, was ich so nicht so 
einfach lösen kann, sich 

569
00:31:39,070 --> 00:31:42,200
anzuschauen ist dann so eine 
Technologie so ein Framework das

570
00:31:42,580 --> 00:31:46,620
richtige finde ich finde ich 
super spannend und hat mir auf 

571
00:31:46,630 --> 00:31:49,020
jeden Fall jetzt auch noch ein 
bisschen geholfen das Thema 

572
00:31:49,030 --> 00:31:52,160
einfach nochmal zu reflektieren,
weil mittlerweile ist es in 

573
00:31:52,170 --> 00:31:54,840
vielen Technologien einfach 
irgendwie auch schon weg 

574
00:31:54,850 --> 00:31:58,070
abstrahiert oder ist es 
irgendwie so zum Standard Pfad 

575
00:31:58,080 --> 00:32:00,470
geworden den man so mit lernt 
wenn man eine Technologie 

576
00:32:00,730 --> 00:32:03,420
einsteigt und sich das einfach 
noch mal so bewusst vor Augen zu

577
00:32:03,430 --> 00:32:06,660
führen, so wie man es vielleicht
tut, wenn man zum ersten Mal an 

578
00:32:06,700 --> 00:32:09,370
eine neue objektorientierte 
Programmiersprache kennenlernt, 

579
00:32:09,440 --> 00:32:12,800
fand ich in dem Fall sehr 
hilfreich und da würde uns 

580
00:32:12,810 --> 00:32:16,390
natürlich interessieren, ist das
für euch spannend, wollt ihr 

581
00:32:16,400 --> 00:32:20,410
auch weitere Folgen haben zu den
Thema Architektur Patterns 

582
00:32:20,840 --> 00:32:23,860
entwicklungsmuster, dann 
schreibt uns gerne e Mail oder 

583
00:32:23,870 --> 00:32:27,160
hinterlassen Kommentar geht auf 
Spotify relativ einfach das zu 

584
00:32:27,170 --> 00:32:29,790
wissen was welches Thema 
interessiert euch sollen wir 

585
00:32:29,800 --> 00:32:33,150
mehr über solche Themen sprechen
oder ist das etwas, was ihr 

586
00:32:33,160 --> 00:32:37,050
ohnehin schon jeden Tag einsetzt
und das war jetzt für euch? 

587
00:32:37,120 --> 00:32:39,170
Super langweilig, interessiert 
und so einfach. 

588
00:32:40,050 --> 00:32:42,660
Genau und generell immer daran 
denken, so Debatten um so 

589
00:32:42,670 --> 00:32:45,350
Frameworks, die werden sehr 
emotional geführt und da gibt es

590
00:32:45,360 --> 00:32:49,860
auch alle möglichen Artikel und 
Videos, gerade aus Miguel Casa, 

591
00:32:49,870 --> 00:32:53,880
der großer Verfechter davon, 
dass das alles, dass das voll, 

592
00:32:53,890 --> 00:32:58,220
das dass der Teufel das gemacht 
hat, ich glaube, da ist schon 

593
00:32:58,680 --> 00:33:02,750
relativ klar, dependency Action 
sich o sind absolute No Brauner,

594
00:33:02,760 --> 00:33:04,560
allein schon wegen der 
Testbarkeit hatte ich eingangs 

595
00:33:04,570 --> 00:33:07,340
erwähnt und Debatte um so 
Frameworks, das muss man sich 

596
00:33:07,350 --> 00:33:11,220
selber angucken, ich bin ich 
gerne so bisschen Punkt OK also.

597
00:33:11,290 --> 00:33:15,370
Ne, wenn es zu viel Magic ist, 
ist das für mich schwierig, denn

598
00:33:15,860 --> 00:33:17,930
Magic ist cool, wenn sie 
funktioniert und die absolute, 

599
00:33:17,940 --> 00:33:21,350
wenn sie nicht funktioniert und 
Magic macht es auch hart Bugs zu

600
00:33:21,360 --> 00:33:23,510
finden und irgendwelche Dinge zu
meinen. 

601
00:33:23,880 --> 00:33:26,380
Wenn man das Gefühl, dass man 
das gut kontrolliert, kann man 

602
00:33:26,390 --> 00:33:30,160
das einsetzen, ist aber auch was
an neuen Entwicklerteam 

603
00:33:30,170 --> 00:33:33,290
natürlich bringen muss, wenn man
Framework verwendet, aber 

604
00:33:33,300 --> 00:33:36,490
generell mal ohne starten und 
dann einfach schauen, aber 

605
00:33:36,500 --> 00:33:39,590
generell halb so wild, die 
Debatte wird wie immer in der IT

606
00:33:39,600 --> 00:33:41,730
sehr emotional geführt, sehr 
religiös. 

607
00:33:42,230 --> 00:33:44,770
Steht da irgendwo den heiligen 
Schriften von Spring Boot und 

608
00:33:44,780 --> 00:33:49,210
von USB und dass man das 
verwenden muss, einfach mal 

609
00:33:49,920 --> 00:33:51,710
vielleicht einen Blick 
entwickeln. 

610
00:33:52,660 --> 00:33:55,230
Sehr cool. 
Und wenn ihr euch diese Folge 

611
00:33:55,240 --> 00:33:58,070
genauso gut gefallen hat wie 
mir, lass uns gerne eine 

612
00:33:58,080 --> 00:34:01,410
Bewertung, da könnt ihr auf 
Spotify oder Apple Podcasts 

613
00:34:01,420 --> 00:34:04,950
machen und natürlich freuen wir 
uns auch sehr über alle, die uns

614
00:34:04,960 --> 00:34:07,750
wie vorhin schon genannt, auf 
einen Kaffee einladen. 

615
00:34:08,120 --> 00:34:12,800
Das ist etwas, wo wir uns immer 
extrem freuen, falls ihr lieber.

616
00:34:12,870 --> 00:34:15,590
Und anders, was Gutes tun wollt,
schaut mal in unseren Shop rein,

617
00:34:15,600 --> 00:34:17,400
da gibt es auch unsere 
Kaffeetassen. 

618
00:34:17,440 --> 00:34:20,570
Findet ihr natürlich wie immer 
in der Beschreibung. 

619
00:34:22,350 --> 00:34:26,060
Dann bleibt uns nicht viel zu 
sagen übrig, als zu sagen, heute

620
00:34:26,070 --> 00:34:28,500
ist der Wurm drin, dann bleibt 
uns nicht viel übrig, als zu 

621
00:34:28,510 --> 00:34:32,469
sagen, vielen Dank fürs Zuhören,
habt eine gute Zeit, genießt die

622
00:34:32,480 --> 00:34:35,150
nächsten 2 Wochen, denn der 
Tochter scheint alle 2 Wochen 

623
00:34:35,159 --> 00:34:39,820
jeden Montag bis dahin viel Spaß
mit die Pension schreibt R Code 

624
00:34:39,830 --> 00:34:42,440
und Hub gezeigt. 
Bis dahin.

