Latest / Coding Buddies | Tech & Dev-Mindset / Warum SOLID deinen Code rettet (und dich auch)
Transcript
- 0:00Zu Kellner mäßig und Kellner, also Roboter, Kellner, so
- 0:06Roboter, Kellner klingt wieso ein Film Ey Coding Buddies Dein
- 0:10Podcast rund um Softwareentwicklung und
- 0:12aktueller Tech News. Herzlich Willkommen.
- 0:27Halli Hallo und herzlich Willkommen zur neuen Folge des
- 0:29Coding Buddies Podcast. Schön, dass du wieder
- 0:31eingeschaltet hast, deine Gastgeber.
- 0:33Und wie soll es anders sein? Meine Wenigkeit, der Tino und
- 0:36der fantastische Fabi, der mich hier angrinst, schon der hat
- 0:39Bock. Ich seh es schon förmlich.
- 0:40Ich begrüße dich, fabi, was geht ab, was geht ab, Tino, wie
- 0:44geht's hier steht's alles gut, alles fit, alles.
- 0:47Super. Ich hab für die Anmoderation ja.
- 0:49War richtig energiegeladen. Ich bin so reingerannt weißt du
- 0:52immer so? Jaja, geklappt, so yeah, was
- 0:54geht, was geht, was geht so ganz alleine durch den Raum gerannt,
- 0:57das. Geht in meinem Kopf vor.
- 1:01Nein, also ich seh wir haben Bock ich hab.
- 1:04Doch ein geiles Thema, aber 1 vorweg noch ganz kurz Werbung in
- 1:08eigener Sache und zwar, liebe Zuhörerin, lieber Zuhörer, falls
- 1:12du noch auf der Suche nach einer richtig geilen id i bist,
- 1:15empfehlen wir dir wärmstens die Jet Brains ID is.
- 1:18Die haben für sämtliche Sprachenlösungen, die Mega geil
- 1:20sind, die wir auch selbst verwenden kannst dich gerne
- 1:23davon überzeugen, in einem von unseren Livestreams auf Twitch,
- 1:26da verwenden wir sie auch immer. Und warum merke ich das an?
- 1:29Weil du mit dem Code Coding Buddies 25% auf die
- 1:34Jahreslizenzen sparen kannst und das sogar Stacked mit deinen
- 1:37vielleicht vorhandenen Ersparnissen, die du eh schon
- 1:40hast, weil nach einem Jahr zum Beispiel kriegt man eh schon
- 1:43Rabatte. Ganz genau.
- 1:45Und der Code ist auf jeden Fall noch mal den Shownotes verlinkt,
- 1:47findet ihr aber auch auf unserer Website.
- 1:50Also einfach mal reingucken und Spaß haben mit einer.
- 1:54Jetbank schaut euch mal an. Genau.
- 1:56Werbung Ende jetzt kommen wir zum eigentlichen Thema Fabi.
- 2:01Es ist ne Weile her, schon da haben wir uns um so Coding
- 2:06Principles gekümmert, was heißt gekümmert sie besprochen zum
- 2:10Beispiel das jagni Prinzip. Kiss zum Beispiel.
- 2:13Kiss hatten wir gemacht, genau und da würde ich heute gerne
- 2:17noch mal ansetzen und ein sehr bekanntes und verbreitetes
- 2:21Prinzip. Noch mal besprechen mit dir
- 2:24heute, aber es geht n bisschen mehr in die Architekturrichtung
- 2:28bei dem Thema. Deswegen an der Stelle ne
- 2:32Triggerwarnung für alle, die Objektorientierung nicht so geil
- 2:35finden. Heute wird es n bisschen
- 2:38objektorientiert hier und wir versuchen es natürlich mit
- 2:40Analogien und einfach zu erklären, werden aber nicht drum
- 2:44rum kommen das auch so n bisschen an vereinfachten
- 2:47Codebeispielen zu erklären. Und zwar fabi.
- 2:50Was ist das Thema, Hau mal raus. Das Thema Es geht um Solid, das
- 2:55sind ja quasi mehrere Prinzipien in der Softwareentwicklung, die
- 3:01kommen auch von Robert C. Martin, also Onkel Bob, Wir
- 3:06hatten ja auch mal über. Onkel Bob?
- 3:09Ja, geil. Wir hatten ja auch mal eine
- 3:11cleancode Reihe gehabt hier im Podcast und da kann man
- 3:17vielleicht ne also. Der ist ja auch der Verfechter
- 3:20Gründer von Clean Code. Genau deswegen noch mal sei, sei
- 3:25das noch mal angemerkt, wenn dich das interessiert, dir liebe
- 3:27zuhören, hör auch gern mal in die Reihe in die Clean Code
- 3:31Reihe von uns rein, ganz genau und solid sind ja wie ich meinte
- 3:37mehrere Prinzipien und es sind quasi jeder Buchstabe steht für
- 3:42ein Prinzip. Ja.
- 3:45Und da würd ich sagen, lass uns doch einfach mal durchgehen
- 3:48durch die einzelnen Prinzipien. Das sind ja im Endeffekt sind
- 3:51das ja 5 ne, also einmal für das SOLID und dann gehen wir einfach
- 3:56mal durch, nehmen uns jeden Buchstaben raus, geben
- 3:59vielleicht ne kleine Analogie dazu, dass man sich es erstmal
- 4:02schön entspannt vorstellen kann, was das ist, beschreiben, worum
- 4:05es da geht, gehen halt auch mal n bisschen auf so n paar
- 4:08Codebeispiele, vereinfacht wie du meintest ein ja und ja, ja
- 4:13das ist der Fahrplan. Ja, würde ich sagen, solide
- 4:17vorgestellt, Fabi, sorry, der muss so sein.
- 4:21Ich würde aber noch mal noch so ganz kurz um das Thema so ein
- 4:24bisschen smooth einzutauchen, noch sagen, warum ist es denn
- 4:29überhaupt wichtig, eine gute Softwarearchitektur zu haben,
- 4:32also weil das Prinzip oder die 5 wie du gesagt hast, zielen ja
- 4:35ganz klar darauf ab, genau das zu verbessern, also wirklich
- 4:39eine gute Architektur umzusetzen um gewisse Vorteile daraus zu
- 4:43ziehen. Und fällt dir zum Beispiel n
- 4:47Beispiel, fällt dir zum Beispiel ein Beispiel ein.
- 4:50Meine Güte, wo du gemerkt hast, ey, hätte ich es mal vielleicht
- 4:54nach so einem Prinzipien umgesetzt, wo du gemerkt hast,
- 4:57so an diesem Projekt ist die Architektur wirklich echt nicht
- 5:00vorteilhaft, ich stoß hier gerade so an Grenzen, was wären
- 5:03so typische Grenzen, die man da, auf die man stoßen könnte, das
- 5:07wäre vielleicht mal so das Ganze noch n bisschen motivieren.
- 5:11Gute Frage, da muss ich natürlich erstmal mein Gehirn
- 5:14rumkramen also ich, ich glaube, dass man auf jeden Fall, gerade
- 5:19wenn man irgendwann anfängt und immer weiter sag ich jetzt mal
- 5:23ne, also unser Weg ja zum Beispiel Studium, da hat man ja
- 5:28auch angefangen Programme zu machen, Programme zu
- 5:31implementieren, die jetzt aber noch nicht so ne Architektur
- 5:35benötigt haben. Sag ich jetzt mal, weil das
- 5:38waren halt kleine Programme. Je größer dann ne Anwendung
- 5:42Programm ne Anwendung wird, desto wichtiger ist es natürlich
- 5:44sich um eben die die die Architektur zu kümmern, dass man
- 5:50halt auch wirklich die Möglichkeit hat zu sagen, ich
- 5:53verändere jetzt was an meiner Software, ohne dass ich aber
- 5:57gleich die ganze Software umkrempeln muss und das ist ja
- 6:03im Endeffekt, darauf zielen ja eigentlich diese Prinzipien ab.
- 6:07Und ich überlege gerade, wo ich so was mal hatte.
- 6:10Also ich hatte auf jeden Fall diese, diese diese Situation
- 6:13schon mal, dass du wirklich gesagt hast, ey, ich habe jetzt
- 6:16zum Beispiel eine Klasse und möchte jetzt irgendwie eine
- 6:18Klasse ändern, oder ich will da noch was hinzupacken, also
- 6:22angenommen, du hast vielleicht irgendwann mal eine Klasse
- 6:24gehabt, die hieß zum Beispiel weiß nicht Payment Service oder
- 6:30so was auch immer und und darüber wird bezahlt, so und
- 6:33dann hast du einen. Payment, was du irgendwie also
- 6:36eine Möglichkeit zu bezahlen und das reicht erstmal.
- 6:39Und dann fügst du irgendwann noch mal was hinzu und dann
- 6:42denkst du so ja OK das das passt auch erstmal so und dann sagst
- 6:45du aber hast du irgendwie so n IF Else und sagst ja gut wenn es
- 6:48wenn zum Beispiel der Kunde Variante 1 auswählt, dann bezahl
- 6:52halt mit Variante 1 Else ne also ansonsten bezahl mit Variante 2
- 6:56so und dann kommt man irgendwann relativ schnell in so n struggle
- 6:59und sagt Na OK warte mal aber jetzt muss ich vielleicht
- 7:02irgendwie. Noch 1 hinzufügen und dann bist
- 7:06du bei einem IF LS if LS, dann sieht es irgendwie eklig aus.
- 7:10Dann hast du vielleicht noch andere Verhaltensweisen, wie
- 7:13sich so n bezahlservice dann im Endeffekt wirklich verhält und
- 7:17dann codest du alles in ein so ne Klasse rein und denkst dir
- 7:19irgendwann. Oh Gott, wenn ich das jetzt
- 7:21anfasse, warte mal. Ich hab jetzt hier ne private
- 7:23Funktion, die aber überall aufgerufen wird und wenn ich die
- 7:26verändere, dann verändere ich ja vielleicht irgendwas anderes in
- 7:29in einer Bezahlmethode, was ich gar nicht.
- 7:30Möchte aber nicht genau. Also nur mal als Beispiel jetzt
- 7:33ne, also es war jetzt nicht explizit das was ich erlebt
- 7:35hatte, aber sowas ähnliches ne, dass du erst mal anfängst sagst
- 7:38OK ich hab jetzt das so und so und.
- 7:42Also ich hab jetzt eine bestimmte Sache, die muss dann
- 7:44erweitert werden und dann aufgrund von muss man dann sagen
- 7:48früher aufgrund fehlendem Wissens hat man erstmal drauf
- 7:51los programmiert bis man dann irgendwann gemerkt hat oder bis
- 7:55ich dann irgendwann gemerkt hab boah ey, das skaliert ja
- 7:57überhaupt nicht ne. Und das ist halt auch schon
- 8:00Gutes. Stichwort Skalierbarkeit und
- 8:03Wartbarkeit. Ich mein, die Worte fallen sehr
- 8:05oft bei uns im Podcast, weil sie halt in der Softwareentwicklung
- 8:07so unfassbar wichtig sind. Und das sind halt so die
- 8:10Erfahrung, die man glaub ich gerade als Einsteiger macht und
- 8:13vielleicht auch in den ersten Projekten, wie du so schön
- 8:16sagtest. So kleine Programme oder
- 8:19vielleicht so kleine Prototypen und Du entwickelst sie immer
- 8:21weiter, dann kommt halt noch mehr Anforderungen dazu, mehr
- 8:24Funktionalität und du kommst irgendwann an den Punkt, wo du
- 8:27dir denkst, oh mein Gott, jetzt ist das wirklich so.
- 8:29N Spaghetti Spaghetti Code geworden, es ist so
- 8:31verschachtelt und wenn ich jetzt an der Stelle die Funktion
- 8:34änder. Soll sich aber nur auf A und B
- 8:37auswirken, aber nicht auf C und D.
- 8:39Aber so wie das hier gerade umgesetzt ist, zieht sich das
- 8:42durch die ganze Software und ich hab eigentlich schon gar keinen
- 8:44Überblick mehr was passiert, wenn ich jetzt diese Funktion
- 8:47anfasse und das sind so Klassiker und sowas haben wir
- 8:51auf jeden Fall selbst erlebt. Also wenn du dann noch keine
- 8:54Tochter hast, wenn du dann noch keine Test eieieiei und die
- 8:58hatte ich damals auf jeden Fall nicht.
- 9:00Ich ja auch nicht. Und da denkt man sich so, ha,
- 9:04wie hätte man das denn besser machen können?
- 9:05Also wie hätte ich von Anfang an dafür sorgen können, nicht in
- 9:09diese Falle zu laufen oder quasi mit dem Rücken zur Wand zu
- 9:13stehen und sich zu denken, ich glaub ich muss von vorne
- 9:15anfangen, ich bin an einem Punkt wo das erweitern schwieriger
- 9:20wird als das vielleicht von Grund auf noch mal neu zu
- 9:22entwickeln weißt du also ich mein da, deshalb gibt es ja auch
- 9:25Neuentwicklung, weil du an diesen Punkt kommen kannst, dass
- 9:28es zeitlich oder vom Aufwand her gesehen.
- 9:31Besser ist es, neu zu machen, als irgendwie zu versuchen, da
- 9:34noch was reinzufriemeln so in dem was du hast in der Codebasis
- 9:38definitiv. Hat man auch schon öfter mal
- 9:40erlebt oder kennt man vielleicht auch, hat man gehört.
- 9:43Wie auch immer, aber gerade bei bei den Solid ich find das
- 9:47lustig weil wie du meintest ne. Man, man wusste das vielleicht
- 9:52nicht, oder? Oder wie kann man sowas
- 9:54vermeiden und zu dem Zeitpunkt wo ich jetzt meinen Riesen
- 9:58payment Service geschrieben hab ne wo ich Milliarden verloren
- 10:01hab nein wie gesagt war ja nicht genau das Beispiel ich mir kommt
- 10:06das Beispiel nicht mehr richtig in den Kopf aber deswegen hab
- 10:08ich jetzt versucht das sozusagen nachzukonstruieren mit einem
- 10:11anderen Beispiel aber. Ich, ich kannte zum Beispiel
- 10:15Solid zu dem Zeitpunkt noch gar nicht.
- 10:16Ne, also diese Prinzipien, beispielsweise ne und
- 10:19irgendwann, das fand ich noch ganz lustig, da hatte ich
- 10:21irgendwann mal so n Moment, da stand stand ich so ne Runde ne
- 10:24mit auch so alten Kollegen irgendwo und dann meinte einer
- 10:26so ja und auf jeden Fall solid dies und das und alle so hm ja
- 10:31ja ja so solid ja ist auf jeden Fall wichtig danach ne und so.
- 10:35Und jeder im Kopf. So was ist solid, verdammt, das
- 10:38war ich, das war ich in dem. Moment, und dafür so ja, warte
- 10:41mal erst mal aufschreiben, gucken.
- 10:43Was soll das eigentlich? Ist so, während du noch Nickst
- 10:47im Kreis das Handy rausgeholt, gegoogelt und das war so finde
- 10:52ich so lustige Situation ne auch noch mal zum puncto Poster
- 10:56Syndrom ich dachte mir in dem Moment natürlich ey du kennst
- 10:58mal wieder gar nichts hier, alle anderen kennen das, aber ich
- 11:01mein ich hab ja auch genickt so nach dem Motto so ja.
- 11:03Ja, auf jeden Fall. Also vielleicht, vielleicht
- 11:06waren da ja so 50% der Leute dabei, die auch sich dachten,
- 11:09das muss ich mal nachgucken. Ja, sicherlich sicherlich sehr
- 11:14witzig, ja, aber kenn ich so ne Situation?
- 11:16Man muss natürlich sagen, die Prinzipien die wir jetzt gleich
- 11:19erklären werden, also gleich geht es wirklich los, sind ja
- 11:24unter dem Namen Solid bekannt, aber was dahinter steckt kennen
- 11:28manche vielleicht auch ohne an Solid zu denken oder zu wissen,
- 11:31dass das so in Solid alles zusammengefasst ist.
- 11:35Also dann das noch mal so als Anmerkung ne, also ich denke,
- 11:38dass du die Prinzipien zu dem Zeitpunkt schon kanntest, dass
- 11:42man darauf achten sollte, aber vielleicht nicht als diese
- 11:45Zusammenfassung und trotzdem stehst.
- 11:47Steht man dann in dem Moment da, oh mein Gott, was ist das denn
- 11:49jetzt schon wieder euch? Oh mein Gott, da klickt dann
- 11:52wirklich so das imposter Syndrom wieder.
- 11:54Aber dann kommt er noch dazu, kurz noch bevor wir jetzt ruhig
- 11:57reinstarten da kommt er noch dazu, dass man es vielleicht
- 12:00kennt, aber nicht anwenden kann so.
- 12:02Ja. Der oder denn halt wirklich
- 12:04nicht im Hinterkopf hat. Und genau das wollen wir jetzt
- 12:06schärfen, denn jetzt geht es los, also kommen wir mal zum
- 12:10Solid Prinzip, es ist halt wirklich sehr verbreitet und
- 12:13bekannt und es wurde auch schon viel thematisiert, also an der
- 12:16Stelle angemerkt, falls du, liebe Zuhörer, liebe Zuhörer
- 12:19nach dieser. Grundlegenden Folge heute noch
- 12:22Fragen dazu hast, kannst du dich erstens gerne bei uns dann
- 12:25melden über die Podcast Mail, ansonsten können wir auch
- 12:28empfehlen, einfach mal auf youtube nach dem Prinzip zu
- 12:30gucken, da gibt es auch viele Videos, die das erklären und
- 12:32veranschaulichen darstellen ist auch immer noch eine coole
- 12:35Ergänzung und deswegen jetzt geht es los, Fabi erster
- 12:39Buchstabe das S von Solid, wofür steht das?
- 12:42Stell dir erstmal vor, jetzt kommt so das es rein ins Bild
- 12:46Spam es. Genau, es steht für Single
- 12:50Responsibility Principle. Das heißt im Grunde genommen,
- 12:53dass eine Klasse jetzt immer wieder bei Klassen eine Aufgabe
- 12:56übernehmen soll und auch wirklich nur eine und nicht
- 13:00mehrere und das ist, finde ich ganz interessant, weil wenn man
- 13:06sich jetzt mal überlegt und jetzt mal jeder auch für sich
- 13:08Hand aufs Herz, ist es schon mal vorgekommen, dass man vielleicht
- 13:11eine Klasse geschrieben hat, die irgendwie hieß sowas wie.
- 13:16Weiß nicht irgendwas XYZ utils xyz Helper was auch immer
- 13:21irgendwas ne also irgendwas Manager genau setzt das setzt
- 13:25für XYZ irgendwas ein und dann hängen Utils Helper Manager
- 13:29hinten dran und jetzt noch mal Hand aufs Herz ist es auch schon
- 13:33mal jemandem passiert, dass diese Klasse völlig ausgeufert
- 13:37ist und tausende Fachlichkeiten in.
- 13:41In einer Klasse oder in einem Pfeil gebündelt hat und wenn ja,
- 13:45dann wird immer Hand. Heben ja, also 2.
- 13:48Hände sehe ich gerade genau. Also das ist finde ich genau,
- 13:52dass der Knackpunkt an diesem Prinzip, weil es geht wirklich
- 13:56darum, dass du eine Klasse hast, die sich darum kümmert, um genau
- 14:01eine Verantwortlichkeit, also eine oder Fachlichkeit, wie du
- 14:05es nennen möchtest und. Und nicht, dass du mehrere
- 14:08Sachen ineinander sag. Ich jetzt mal verbandelst.
- 14:12Also wenn du jetzt noch mal, weil wir gesagt hatten, wir
- 14:14versuchen mal eine Analogie zu geben, angenommen, du hast ein
- 14:17Werkzeug, ne und dieses Werkzeug ist ein Multifunktions alles
- 14:21Werkzeug, du kannst damit du kannst damit schneiden, sägen,
- 14:24schrauben, bohren, du kannst alles machen so.
- 14:27Also bohren ist krass. Bis eben wollte ich noch sagen,
- 14:29so typisches Schweizer Taschenmesser.
- 14:31Ne, das Bohren wäre krasser, das ist noch viel viel.
- 14:34Krasser. Damit kannst du wirklich alles
- 14:36machen und. Und jetzt geht dir auf einmal
- 14:38der Bohrer kaputt und du denkst dir so, ah misten echt blöd, ich
- 14:43kauf mir halt wieder dieses super multifunktionale Ding,
- 14:47weil es gibt ja auch nur das muss man sich natürlich
- 14:49vorstellen, es gibt nur das ne, dann kaufst du dir natürlich den
- 14:51Bohrer noch mal, kannst wieder bohren, aber hast dazu natürlich
- 14:54noch mal wieder ne Säge und du hast wieder weiß nicht n was hab
- 14:57ich gesagt akkubohrer frag mich nicht, ich weiß selber wieder
- 15:00was drin war, du hast also quasi alles noch mal doppelt, obwohl
- 15:03du ja eigentlich nur den Bohrer gebraucht hättest.
- 15:06Ne. So, und jetzt wär es ja viel
- 15:08cleverer ne einfach zu sagen ey ich mach n eigenes Werkzeug was
- 15:11n Bohrer ist und n eigenes Werkzeug was ne Säge ist und so
- 15:14weiter ne Oh Wunder gibt es auch, ist tatsächlich in der
- 15:18Realität so und das ist halt genau der Punkt.
- 15:22Du willst ja wenn dir irgendwas kaputt geht beispielsweise nicht
- 15:25noch mal das Ganze dann sozusagen nachbestellen, in
- 15:28diesem Fall ne ja. Das ist ne ganz gute, ne gute
- 15:32Analogie. Jetzt kann sich natürlich der
- 15:34eine oder andere denken, ja, aber ich möchte so n Schweizer
- 15:36Taschenmesser haben, weil da halt alles dran ist und das
- 15:38schön kompakt ist. Ja klar, das ist in dieser
- 15:41Analogie der Vorteil, aber wenn wir das jetzt mal auf n Code
- 15:44Münzen, dieses Beispiel erkennt man, dass es halt
- 15:47architekturtechnisch gesehen schon Sinn macht diese
- 15:51Verantwortlichkeiten aufzusplitten.
- 15:54Ich würd mal als Beispiel was reinhauen, was was vielleicht
- 15:58der ein oder andere kennt. Mal angenommen du hast so ne Art
- 16:01Report Klasse oder log klasse oder irgendwas mit
- 16:05Textverarbeitung ja. Stell dir vor, du erzeugst jetzt
- 16:09ne Klasse Report und sagst ja gut was.
- 16:11Was muss die jetzt können und du fängst an und sagst na ja ich
- 16:15möchte, ich krieg das Halt in einem gewissen Format und möchte
- 16:19das jetzt in einem für mein Programm lesbares Format
- 16:23formatieren, ne, also du kriegst zum Beispiel jetzt n String rein
- 16:28und willst das jetzt aufsplitten in ein Format was du.
- 16:32Verarbeiten kannst. Das heißt, du hast so ne
- 16:34Formatfunktion zum Beispiel, das heißt Deine Klasse Report hat
- 16:38jetzt ne Formatfunktion und bietet die Funktionalität
- 16:41formatieren an. Soweit so gut ist eine
- 16:44Verantwortlichkeit passt, könnte man jetzt sagen Report der Name
- 16:47vielleicht nicht so gut, aber lassen wir das mal so stehen.
- 16:51Auf einmal denkst du dir aber, na ja, aber diese diese Formate
- 16:54muss ich ja auch mal abspeichern.
- 16:56Ich muss ja irgendwie diese Reports ablegen können.
- 16:59Ja gut, dann ich hab ne reportklasse, dann werd ich
- 17:03jetzt ne safe Funktion einbauen. Klar.
- 17:07Da geb ich n Pfad rein, hab meinen meinen formatierten
- 17:11Bericht ja sozusagen schon und den kann ich jetzt abspeichern.
- 17:14Cool super, ganz Lean, nicht viel Code, kleine Klasse super.
- 17:19Hab jetzt aber schon 2 Verantwortlichkeiten drin.
- 17:22Einmal das Formatieren und das Abspeichern richtig so und dann
- 17:27heißt es auf einmal ja, aber wär irgendwie cool wenn ich über die
- 17:30Software diesen Bericht auch an Kollege XY schicken kann, kannst
- 17:35du das nicht als Mail oder über über ne API rausschicken.
- 17:39Wie auch immer, aber dass du auf einmal noch ne Funktionalität
- 17:42send hast und sagst. Na ja gut, dann bereite ich
- 17:45jetzt die Daten noch mal auf in ein Format, was ich verschicken
- 17:48kann. Ja, so Report ist noch Platz ist
- 17:52noch nicht so groß, die Klasse Hau ich da auch mit 3 sind schon
- 17:543 Verantwortlichkeiten, jetzt kann man sich denken ja gut es
- 17:58ist aber ne sehr übersichtliche Klasse, das Problem ist aber was
- 18:02ist wenn sich das Format ändert wenn du sagst meine
- 18:05Formatfunktion ändert sich weil ich intern meine Daten anders
- 18:08darstellen möchte, dann ändere ich das Format und gleichzeitig
- 18:12wird meine Send. Nicht mehr funktionieren, weil
- 18:15ich nicht mehr von der gleichen Datenbasis in vielleicht diese
- 18:18zu übertragende Format quasi umwandeln kann.
- 18:23Das heißt, du musst dann einfach schon mehrere Funktionen,
- 18:25mehrere Funktionalitäten und Verantwortlichkeiten, wie das
- 18:28Prinzip ja sagt, Anpassen, deshalb wäre es da, um auch
- 18:33Solid einzuhalten, der bessere Ansatz zu sagen, ich splitte das
- 18:37einfach in diese Verantwortlichkeiten auf und hab
- 18:40zum Beispiel ne formata Klasse. Ich hab ne Art Klasse, die das
- 18:45speichern, die Funktionalität und Verantwortlichkeit hab, dass
- 18:49ich zum Beispiel dieses Formatieren und das Abspeichern
- 18:52der Daten oder das Cent was ich jetzt meinte einfach wirklich
- 18:56Kapsel und. Voneinander trenne weil dann
- 18:59spielt es nämlich keine Rolle, wenn ich bei avas änder, dann
- 19:01ist b davon nicht betroffen, richtig und vor allem könntest
- 19:05du auch rein theoretisch in deinem Formata oder wie du den
- 19:07genannt hattest ne, also dieser dieser Formatierer nenn ich den
- 19:10jetzt einfach mal. Könntest du ja auch verschiedene
- 19:15Funktionen einbauen. Zu sagen, ey ich möchte jetzt
- 19:18aber zum Beispiel auch, also wenn du es in verschiedene
- 19:22Formate formatieren möchtest, weißt du, dann kannst du ja zum
- 19:25Beispiel sagen, ey, ich brauch das zum Beispiel fürs Senden,
- 19:28brauch ich das oder ich brauch es zum Beispiel fürs Speichern
- 19:32oder was auch immer, dann kannst du Format for send machen oder
- 19:35Format for for safe oder was auch immer ne also Namen
- 19:39austauschbar, aber du weißt was ich meine.
- 19:42Das heißt, du hast die Möglichkeit zu sagen, okay, du
- 19:43hast etwas, was formatiert für eine bestimmte, also also eine
- 19:50Klasse, die sich nur um das Formatieren kümmert, und du
- 19:53kannst halt sagen, was formatiert, also wie es
- 19:55formatiert werden soll, zum Beispiel genau, es ist auf jeden
- 20:00Fall ein sehr guter Punkt und sehr wichtig, dass man dann
- 20:04genau diese Aufspaltung macht und.
- 20:08Und genau das mein ich auch. Wenn du jetzt zum Beispiel so n,
- 20:11sagen wir mal du also was ich am Anfang eingehends meinte, du
- 20:14hast ne utils Klasse oder so ne und da haust du erstmal alles
- 20:18rein so und denkst dir so ach komm hör mal, ich hab jetzt
- 20:21irgendwie ne utils klasse die ach die benutze ich da noch mal
- 20:24und dann hast du aber nutzt du diese utils Klasse zum Beispiel
- 20:27und du hast ne Funktion da drin Funktion HBC frag mich nicht ne
- 20:33und die wird aber per. Perspektivisch in über über die
- 20:38Zeit der Alterung der Software, so in der in der
- 20:41Implementierungszeit. Je weiter fortgeschritten die
- 20:44Implementierungszeit ist, desto höher ist die
- 20:46Wahrscheinlichkeit, dass diese Funktion ABC auch an ganz vielen
- 20:49Stellen genutzt wird. Und wenn du jetzt aber dann
- 20:52dahin kommst und sagst okay ich muss jetzt aber mal, du bist an
- 20:55einer Stelle im Code anstelle a und sagst ich muss jetzt
- 21:00hierfür, muss ich aber diese Funktion ändern, die Funktion
- 21:02heißt. ABC, aber ich geh da mal rein
- 21:05ABC, ich änder das einfach mal ne ist natürlich keine gute
- 21:08Practice einfach zu sagen ich änder einfach was da drin, aber
- 21:12rein theoretisch könnte es ja sein, dass wenn du ABC änderst
- 21:15an 8 anderen stellen oder an noch mehr stellen im Code das
- 21:20genauso verwendet wird, aber vielleicht nur an dieser einen
- 21:23Stelle A, über die ich gerade geredet hab, es wichtig war,
- 21:25dass eine, dass etwas anderes passiert, dass die Funktion ABC
- 21:30etwas bisschen anders macht, ne? Und das ist natürlich dann
- 21:36schwierig, wenn du sagst, ey, also das, das kann natürlich
- 21:40fehleranfällig sein zu sagen, ich ändere jetzt hier was und
- 21:43alle anderen stellen kriegen diese genau diese gleiche
- 21:46Änderung, aber vielleicht ist diese Änderung, die du
- 21:49eigentlich haben willst, eine fachlich ganz andere und müsste
- 21:52eigentlich in eine ganz andere Klasse, also in Utils 2.
- 21:56In utils 2. Genau.
- 21:58Also weißt du was ich meine und das ist ja genau.
- 22:01Der Punkt zu sagen und ich find das ist sehr sehr wichtig, sich
- 22:04immer wieder zu fragen und das kommt heute auch ja immer noch
- 22:08vor. Es ist ja nicht so, dass du
- 22:09irgendwann sagst, ich weiß sofort, was meine Fachlichkeiten
- 22:12sind, auch noch mal Stichwort refactoring, da kommst du ja
- 22:14relativ schnell hinzu sagen. OK, warte mal.
- 22:16Ich hab jetzt hier was gemacht, aber eigentlich ist das eine
- 22:20Fachlichkeit und das ist ne andere Fachlichkeit.
- 22:22Das heißt irgendwann vielleicht im Verlaufe dein der
- 22:25Implementierung merkst du das sind ja tatsächlich 2
- 22:28fachlichkeiten oder vielleicht kristallisiert sich das über die
- 22:30Zeit heraus, dass du sagst, früher war es eine, aber
- 22:33mittlerweile sind es eigentlich 2.
- 22:35Lasst uns das mal aufsplitten. Ne.
- 22:36Genau also dieses diese Awareness sag ich jetzt mal zu
- 22:40haben. Und zu gucken, also immer daran
- 22:43zu denken und vielleicht auch noch mal mit einem anderen Blick
- 22:46später auf gleiche Klassen zurück zu gucken und sagen muss
- 22:49man die vielleicht auftrennen, sind das mittlerweile vielleicht
- 22:51mehr Verantwortlichkeiten als nur eine, wie es mal war.
- 22:57Ja, das ist ein guter Punkt, dass genau dafür auch
- 23:00refactoring da ist. Und an der Stelle auch noch mal
- 23:02die Anmerkung, dass diese Prinzipien, die wir hier
- 23:05erklären, ja auch Richtlinien sind.
- 23:08Ja, also es heißt nicht, ich muss jetzt jede einzelne
- 23:11Funktion in ne eigene Klasse packen, weil das jetzt
- 23:13unterschiedliche Verantwortlichkeiten sind.
- 23:16So ist es ja nicht, sondern man muss es geschickt clustern und
- 23:19wie du meinst herauskristallisieren, was die
- 23:22Verantwortlichkeiten sind, wo lohnt es sich es zu splitten und
- 23:25wo nicht? Ja also das auch noch mal
- 23:27angemerkt ne, nicht dass man so ins Extreme verfällt, das ist
- 23:30auch bei den Cleancode 3 haben wir das oft erwähnt, das sind
- 23:33Richtlinien und man muss es nicht immer.
- 23:36Ins völlige extreme sag ich mal wirklich übertrieben umsetzen,
- 23:39weil dann gehst du leider wieder ins Negative von von den
- 23:42Benefits her, die bleiben dann aus sag ich mal so genau genau,
- 23:47wir haben ja noch 4 Prinzipien, deswegen geh ich mal direkt zum
- 23:50nächsten Let's go und zwar bei Solid.
- 23:53Das O steht für Open closed principle, also OCP.
- 23:57Und besagt im Prinzip, dass wenn ich ein softwaremodul hab, also
- 24:01beispielsweise jetzt auch wieder unsere Klasse, dass diese offen
- 24:05für Erweiterung sein soll, aber geschlossen für Modifikation.
- 24:10Und das ist eigentlich auch relativ gut zu erklären, da
- 24:13würde ich nämlich noch mal dein Beispiel aufgreifen, was du
- 24:16eingangs quasi gebracht hattest. Vorhin mit mit dem Bezahlen.
- 24:21Wie du meintest, so, es gibt eine Bezahlmöglichkeit.
- 24:23Ja dann hab ich ne Funktion, die heißt Pay in meiner Payment
- 24:27klasse und da bau ich jetzt den Code ein den Ich brauche um
- 24:31dieses Pay auszuführen ne und dann kommst du aber zu dem
- 24:37Punkt, dass du sagst ja ich muss das jetzt erweitern, es gibt
- 24:39jetzt wir binden noch ne Bezahlmöglichkeit an, zum
- 24:42Beispiel keine Ahnung das Erste war Kreditkarte und jetzt machen
- 24:45wir auf Rechnung. Mhm.
- 24:47So ja OK, warte mal. Die Pay Methode ich sehe schon
- 24:50da ist die Kreditkartenzahlung drin.
- 24:53Ich brauche jetzt auf Rechnung ja gut if Aids wie du meintest
- 24:56zum Beispiel so gut OK ist entschieden ich hab jetzt zum
- 24:58Beispiel NI Namen was sagt was quasi identifiziert was für ne
- 25:02Bezahlung und fertig weiter geht es ja OK wäre aber auch echt
- 25:07wirklich cool das Ganze keine Ahnung mit Paypal.
- 25:12Paypal zum Beispiel zu bezahlen. So, dann bist du schon bei 345,
- 25:15was alles noch mit reinkommt, ne und dann kommst du an den Punkt.
- 25:19Was ist wenn jetzt irgendwas in dieser Pay angepasst werden muss
- 25:23was alle betrifft, was nur eine Bezahlmöglichkeit betrifft, dann
- 25:27kommst du halt in Teufelsküche wie man so schön sagt, du musst
- 25:30extrem aufpassen, dass du die anderen Bezahlmöglichkeiten
- 25:34nicht kaputt machst, sage ich mal.
- 25:37Wenn du jetzt zum Beispiel eine ergänzt oder bei einer was
- 25:40abändern muss, die anderen nicht betroffen sind.
- 25:42Du musst dir überlegen, welche sind alle betroffen von meiner
- 25:45Änderung in der Pay Methode und das ist richtig tricky
- 25:49irgendwann und auch wirklich ein heißes Ding so also das ist
- 25:53gefährlich und deswegen sagt dieses Prinzip, du musst dafür
- 25:57sorgen, dass du erweiterbar bist.
- 26:00Also du kannst neue Bezahlmöglichkeiten reinbringen,
- 26:03aber geschlossen für Modifikation.
- 26:05Du darfst nicht die bisherigen Bezahlmöglichkeiten beeinflussen
- 26:09damit, und das kann man denn eigentlich sich auch ganz gut
- 26:12vorstellen, indem du sagst, ich hab jetzt nicht nur ne klasse,
- 26:14wo ne Pay drin ist, sondern ich erzeuge für jede
- 26:18Bezahlmöglichkeiten hab ich eine eigene Klasse, die eine Pay
- 26:22implementiert, das heißt ich hab jetzt zum Beispiel ne Abstrakte.
- 26:26Payment Klasse. Die wird zum Beispiel abstrakt
- 26:28mit einer Methode Pay und ich implementiere jetzt meine
- 26:31Bezahlmöglichkeiten davon und implementiere die Pay und kann
- 26:35denn abhängig von der gewählten Bezahlmöglichkeit die richtige
- 26:38Pay Methode aufrufen. Ich hoffe man konnte das mir
- 26:42folgen. Wie gesagt, die haben ne
- 26:45Triggerwarnung gegeben. Im Endeffekt so ne Art einfach
- 26:48ne Art Interface, was sozusagen implementiert wird dann am Ende.
- 26:52Und dann hab ich den Vorteil, wenn ich jetzt sage, bei der
- 26:54Rechnung muss ich zum Beispiel irgendwie wie ich ne Rechnung da
- 26:59noch mit ranhänge oder wie ich die Ausliefer wie auch wie auch
- 27:01immer, also wirklich was rechnungsspezifisches, muss ich
- 27:03in der Pay jetzt anders aufrufen oder?
- 27:06Kommt, wird komplett abgewandelt, dann betrifft das,
- 27:10betrifft das aber nicht meine anderen Bezahlmöglichkeiten,
- 27:13weil die Pay Methode ja quasi extrahiert ist.
- 27:15Sozusagen. Ja, und das ist halt eine schöne
- 27:18Sache dabei. Das finde ich zum Beispiel noch,
- 27:21um noch mal vielleicht eine kleine Analogie noch mal da zu
- 27:24lassen, falls das jetzt vielleicht zu verwirrend oder zu
- 27:29objektorientier lastig war. Was auch immer.
- 27:33Will nicht sagen, dass man sich versteht.
- 27:35Ich habe es fantastisch verstanden.
- 27:37Aber. Wenn du jetzt zum Beispiel,
- 27:39sagen wir mal, du hast du den Rechner und du willst jetzt zum
- 27:41Beispiel deinen deinen Speicher aufstocken, dann kannst du ja
- 27:44sagen okay, ich möchte meinen Speicher erweitern, so
- 27:46demzufolge kannst du zum Beispiel hast du einen extra
- 27:48Slot dafür und kannst halt eben einen neuen Speicherriegel
- 27:51einsetzen, relativ einfach super ohne Probleme.
- 27:55Ne. Und es ist ja nicht so, dass du
- 27:57erst zum Beispiel sagst, ey, ich muss jetzt aber noch irgendwie
- 28:00mein Motherboard irgendwie auseinander schrauben, da noch
- 28:03was dran löten sozusagen oder vielleicht den vorherigen
- 28:06Speicherriegel, sozusagen die, die die Schnittstelle, wo ich es
- 28:09drauf stecke, sozusagen verändern, weil der gar nicht
- 28:11passt oder so ne, also diese Modifikation sollte ich mein,
- 28:15das ist selbsterklärend bei einem Rechner, dass man das
- 28:18nicht tut, ne, aber? Genau darum geht es halt eben zu
- 28:22sagen. OK, ich kann es erweitern, aber
- 28:24ich will es nicht modifizieren, weil angenommen du modifizierst
- 28:27es würden ja vielleicht deine alten Speicherriegel gar nicht
- 28:30mehr passen und dann hast du auch nichts gewonnen.
- 28:33Und der Vorteil ist natürlich, wenn ne Pay Methode wegfällt,
- 28:36zum Beispiel jetzt noch mal in dem Beispiel, dass du sie
- 28:39einfach. Entfernen kannst und musst nicht
- 28:42in deiner vorherigen globalen Pay Methode gucken.
- 28:45Wo muss ich jetzt überall Codezeilen löschen um diese Pay
- 28:48Methode rauszukriegen und funktionieren die anderen noch
- 28:51zum Beispiel? Also du hast halt diese
- 28:53Erweiterbarkeit, aber natürlich auch den Umkehrschluss, dass du
- 28:56Sachen auch wieder sehr gut, weil sie so Gekapselt sind,
- 28:59entfernen kannst. Richtig genau also wie gesagt,
- 29:04ist natürlich auch wieder. Eine Richtlinie sozusagen ist
- 29:08jetzt kein kein Must have. Es ist aber immer gut.
- 29:12Wie gesagt, bei solchen Dingen daran zu denken und sowas im
- 29:16Hinterkopf zu haben und zu sagen, okay ist es denn
- 29:19vielleicht sinnvoll in diesem Moment, es nach diesem Prinzip,
- 29:23nach diesem o Prinzip, dem OCP oder Open closed principle
- 29:28vielleicht zu betrachten? Beziehungsweise könnte man es
- 29:31einbringen, ist es an der Stelle sinnvoll.
- 29:33Das ist ja sozusagen immer der Gedanke, der dann mitschwingen
- 29:38könnte, sollte vielleicht um es eventuell dann besser zu machen
- 29:41oder vielleicht genau das zu vermeiden, was du eingangs
- 29:44beschrieben hast, sozusagen das Problem an der Sache, an der
- 29:47Sache. Ja, du hast es schon gesagt, es
- 29:50ist so Awareness ne, dass man einfach das im Hinterkopf hat
- 29:52und dran denkt dann. Das wird schon dafür sorgen.
- 29:56Allein wenn man davon gehört hat und das immer im Hinterkopf hat,
- 29:58sorgt schon dafür, fortan bessere Softwarearchitekturen zu
- 30:04erstellen. Definitiv auf jeden Fall, also
- 30:07zumindest aus unserer Erfahrung her, wo wir uns damit, also als
- 30:10wir angefangen haben, uns damit auseinanderzusetzen, hat das
- 30:12dafür gesorgt, bessere Softwarearchitekturen erstellen
- 30:14zu können. Ich finde, was auch auf jeden
- 30:16Fall hilft ist oder was mir auf jeden Fall auch öfter mal
- 30:20geholfen hat, ist einfach mal zu sagen, es gibt so ein Prinzip
- 30:23und ich versuche mir jetzt aber mal.
- 30:24Vom Beispiel zu nehmen, um es einfach mal nach zu
- 30:26programmieren, weil ich finde, es sind es sind immer noch 2
- 30:29Sachen auf der einen Seite, das kenne ich, das okay mehrere
- 30:33Sachen, Entschuldigung, das ist quasi so eine Art Kette, dass du
- 30:37sagst auf der einen Seite kenne ich überhaupt dieses Prinzip,
- 30:40wenn ja Check super Sache, dann weiß ich wie es funktioniert
- 30:44okay alles klar Check habe ich es einfach mal ausprobiert um zu
- 30:47fühlen. Wie das wirklich funktioniert,
- 30:50wie es sich auch anfühlt, im Code ne.
- 30:53Und da ist es dann einfach hilfreich, einfach mal zu sagen,
- 30:56OK, ich nehm mir mal n Beispiel Programmier das einfach mal und
- 31:01kann sozusagen live mitkriegen, wie dann sozusagen.
- 31:06Wie dieses Prinzip dann angewendet aussieht, selbst mal
- 31:09programmiert und so weiter ne, also das ist halt einfach auch
- 31:13noch mal hilfreich klingt finde ich immer sehr trivial zu sagen,
- 31:15ja gut, du weißt doch wie es geht, aber einmal programmieren
- 31:19einmal selber n Beispiel sag ich jetzt mal auf die Beine stellen
- 31:23und dann ist es noch mal n bisschen was anderes, zumindest
- 31:25geht es auf jeden. Fall.
- 31:27So auf jeden Fall das da geh ich mit, so kommen wir mal zum
- 31:31dritten Solid l. Das ist das lisco Substitution
- 31:36Principal und da muss ich sagen das ist das Prinzip von den 5
- 31:41was ich persönlich damals am schwierigsten fand.
- 31:46Zu verstehen und zu verinnerlichen.
- 31:48Deswegen würde ich da auch direkt mit einer Analogie
- 31:50starten, nicht auf n Codebeispiel gehen, in der
- 31:54Hoffnung, dass man es dann n bisschen besser greifen kann.
- 31:57Ich. Bringe danach n Codebeispiel.
- 31:58OK, sehr gut. Dann machen wir es diesmal so
- 32:01rum und zwar möchte ich, liebe Zuhörer, liebe Zuhörer, dass du
- 32:04dir mal vorstellst, wieso eine universelle Steckdose aussieht
- 32:07und wie man sie quasi verwendet. Und dann stell dir vor, du hast
- 32:11jetzt verschiedene Elektrogeräte wie?
- 32:14Ja, was habe ich hier gerade ein Laptop, Ladekabel, ich habe
- 32:18einen Kaffee, also eine Kaffeemaschine noch in der
- 32:20Küche, Staubsauger, Staubsauger auch eine super Sache.
- 32:24Also du hast so verschiedene Elektrogeräte mit ganz
- 32:27unterschiedlichen Anwendungsfällen, die aber die
- 32:30gleiche Steckdose verwenden, das heißt du kannst jedes Gerät in
- 32:35diese Steckdose stecken und verwenden.
- 32:37Also der Laptop lädt, die Kaffeemaschine kann Kaffee
- 32:40machen und der Staubsauger saugt so.
- 32:43Und das ist im Prinzip dann lisco Substitution Principle
- 32:47konform, das heißt jedes Gerät ist untereinander ersetzbar mit
- 32:53dieser Steckdose. Du kannst erst das Laptop
- 32:56Ladekabel ranstecken, dann ziehst du es raus wenn der
- 32:58Laptop geladen ist, dann steckst du die Kaffeemaschine ran,
- 33:01zapfst dir einen Kaffee. Ziehst sie wieder raus, machst
- 33:03einen Staubsauger ran und saugst dein Arbeitszimmer
- 33:05beispielsweise. Das heißt, sie erfüllen alle die
- 33:08gleichen elektrischen Anforderungen, um mit dieser
- 33:11Steckdose verwendet werden zu können.
- 33:14Was ist jetzt jedoch, wenn du beispielsweise ein
- 33:17amerikanisches Gerät hast, was eine andere Spannung benötigt,
- 33:22dann funktioniert das eben nicht mehr, weil wenn.
- 33:26Ja, keine Ahnung, bis zum Kurzschluss, keine Ahnung was
- 33:28passieren kann, aber es verstößt halt gegen dieses Prinzip, weil
- 33:31du die Geräte nicht mehr willkürlich, was heißt
- 33:34willkürlich, also wie du möchtest einfach austauschen
- 33:36kannst, weil dieses amerikanische Gerät eine andere
- 33:40Spezifikation der elektrischen Anforderungen hat und das würde
- 33:44gegen dieses Prinzip verstoßen. Du kannst es halt nicht mehr
- 33:47frei austauschen, es ist halt nicht kompatibel am Ende.
- 33:52Ich mein das System in dem Sinne und so Steckdose ich mein das
- 33:55fängt ja rein theoretisch genau bei der Steckdose schon an, aber
- 33:58selbst wenn du den Stecker gleich machen würdest, würde ja
- 34:02wahrscheinlich trotzdem irgendwas nicht funktionieren,
- 34:04da bin ich kein Elektrotechniker, ich weiß nicht
- 34:05genau was passieren würde, wenn man mehr oder weniger Volt dann
- 34:09da reinstecken würde, du meintest ja Kurzschluss fängt
- 34:12der Staubsauger da an zu brennen, ich weiß.
- 34:14Es nicht versaugt richtig krass. Nein, wir werden es mal nicht so
- 34:19auf die Elektrotechnik Ebene hin, weil davon haben wir keine
- 34:21Ahnung. Aber da genau das ist ne gute
- 34:23Anmerkung selbst. Also meistens ist ja so, dass
- 34:26der Stecker dann schon gar nicht passt.
- 34:27Aber selbst wenn der Stecker passt, würde es halt nicht
- 34:31funktionieren, weil du halt von einer anderen Spezifikation
- 34:34ausgehst. Bei dem Gerät genau als die
- 34:36anderen vorher genannten. Richtig.
- 34:38Und es ist ja im Endeffekt so. Also diese Ersetzbarkeit, worum
- 34:42es ja in diesem Prinzip geht, ne?
- 34:46Da ist es. Es ist, das bedeutet in dem
- 34:48Fall, dass wenn ein Programm ne, also in dem Fall sozusagen jetzt
- 34:53die Steckdose soll, nicht merken ob es quasi ne Oberklasse oder
- 34:59ne Unterklasse verwendet, ne also es ist egal was verwendet
- 35:03wird, es muss funktionieren an dieser Schnittstelle sozusagen
- 35:06ne ja und da geht es quasi. Also das das ist ja im Endeffekt
- 35:11genau diese diese Ersetzbarkeit. Aus Programmsicht natürlich als
- 35:15Programmierer oder Programmieren weißt du natürlich, klar, ich
- 35:18weiß jetzt, was ich da verwende, aber das Programm weiß es zum
- 35:21Beispiel, dann sollte es nicht wissen, ne, also kleines
- 35:25Beispiel, wenn man jetzt zum du hast zum Beispiel so so Vögel so
- 35:31ne vogelklasse ne und? Es ist ja ein richtiges
- 35:35Lehrbuchbeispiel, finde ich. Gut, aber.
- 35:37Pass auf, weil ich finde, ich finde das wirklich gut, weil in.
- 35:40Im Normalfall was. Was können Vögel?
- 35:42Vögel können fliegen, ne so das weiß man so und das können ja
- 35:47eigentlich alle Vögel so, aber es gibt ja zum Beispiel Vögel,
- 35:51die können das dann doch nicht, ne, also sind doch nicht alle
- 35:54so, ja, aber man denkt ja erstmal ne, also wenn er also
- 35:56angenommen man fängt jetzt an und sagt Ey ich brauch jetzt
- 35:59vielleicht für irgendein Game oder so irgendeine irgendeine
- 36:01Klasse ne vogelklasse weil ich will irgendwie Gegner haben, die
- 36:05Fliegen ne so und. Und es soll aber auch irgendwie
- 36:08auf der anderen Seite auch wieder sehr realistisch sein.
- 36:11So, dann fängst du an, denkst du so, ja, ich habe ja die und die
- 36:13Vögel kämpfende Vögel kennt man, fliegen draußen die ganze Zeit
- 36:16nur rum. Ultra aggressiv, immer genau.
- 36:19Aber so, dann hast du halt auf einmal einen Pinguin.
- 36:22So ein Pinguin kann halt vielleicht nicht fliegen, also
- 36:25er kann nicht fliegen, aber vielleicht im Game auch nicht so
- 36:28und dann hast du halt ne also ne du hast jetzt ne Klasse
- 36:33erstellt. Vogel und dieser, diese
- 36:35Vogelklasse, diese Oberklasse, diese Superklasse, die kann halt
- 36:39die Funktion fliegen, so fly ja so und dann hast du jetzt diesen
- 36:45Pinguin, der ja sagt Ey, ich bin aber ein Vogel, also kann ich ja
- 36:49auch Fly aufrufen, weißt du so und dann hast du das Problem,
- 36:54dass du aber an der Stelle ja eigentlich nicht fliegen kannst.
- 36:59Also angenommen es würde ein String zurückkommen, so was wie
- 37:02ja ich kann fliegen, ich bin ein Vogel, dann würde ja beim
- 37:06Pinguin genauso zurückkommen. Ja, ich kann fliegen, ich bin
- 37:08ein Vogel. So was nicht stimmt.
- 37:10Was nicht stimmt. Genau so, das heißt, das wäre ja
- 37:12in dem Fall dann falsch so, also würdest du dich ja dann
- 37:16vielleicht hinstellen und sagen naja, aber ich möchte ja genau
- 37:19in diesem Fall vom Fliegen möchte ich dann vielleicht eine
- 37:22Exception werfen, das heißt, ich überschreibe die Funktion.
- 37:25In der Klasse Pinguin und sage ja gut, pass auf ich wenn wenn
- 37:31Fly aufgerufen wird, dann werf ich einfach ne Exception und
- 37:34sage ja das funktioniert aber nicht weil n Pinguin kann halt
- 37:36nicht fliegen, sorry. Ja, so weißt, dann ist natürlich
- 37:39der Pinguin an der Stelle fein raus und sagt so, ich hab
- 37:41mitgeteilt ich kann nicht fliegen, richtig, aber was ist
- 37:44das Problem wenn ich jetzt in meiner Software mit genau dieser
- 37:47Vogelklasse arbeiten möchte? Genau das ist nämlich das Ding.
- 37:50Angenommen, du hast jetzt dein, also du du.
- 37:53Arbeitest immer mit Vögeln und gehst davon aus.
- 37:56Okay du hast einen Vogel, so und wie gesagt, das Programm soll
- 37:59nicht wissen, ist es eine Oberklasse oder eine Unterklasse
- 38:01eine Subklasse so, das heißt das Programm sagt ich nehme mir halt
- 38:06irgendwas was ein Vogel ist und ruft darauf fly auf und erwarte
- 38:09dann okay ich kriege jetzt, dass der Vogel fliegt, genau dass der
- 38:13Vogel fliegt beziehungsweise ich meinte ja so, du kriegst
- 38:15vielleicht einen String zurück um sich das einfacher
- 38:16vorzustellen, da steht drin ich kann fliegen so das erwartet das
- 38:19Programm und was aber bei einem Pinguin passiert es fliegt eine
- 38:22Exception so. So, das heißt, das Programm kann
- 38:25in dem Moment vielleicht gar nicht damit umgehen, weil man,
- 38:27weil man sich als Programmierer oder Programmiererin gedacht
- 38:30hat, ja, da muss ich eine Ausnahme machen und denkt aber
- 38:33an einer anderen Stelle nicht, vielleicht ist man selbst für
- 38:35diese Stelle gar nicht zuständig, dass da ja dann eine
- 38:38Exception fliegt, die gar nicht behandelt wird und es gar nicht
- 38:41vorgesehen ist, dass da eine Exception behandelt wird.
- 38:44So, und dann hast du halt genau das Problem, und das kann man im
- 38:48Endeffekt, oder? Wenn man sagt okay ich möchte
- 38:50aber dieses Lsp, also so heißt das Prinzip ja abgekürzt, möchte
- 38:54ich konform sein, dann wäre die Lösung an der Stelle zu sagen
- 38:58okay, du hast eine klasse Vogel und du hast vielleicht aber auch
- 39:02noch eine Klasse Flying oder oder fliegbarer Vogel Flying
- 39:08Bird nenne ich das jetzt mal, der sozusagen, also ein Vogel,
- 39:11der Fliegen kann, diese klasse, und die also ein fliegender
- 39:16Vogel ist. Natürlich ein Vogel, das heißt
- 39:18das. Also fliegender Vogel ist eine
- 39:21Unterklasse von Vogel. So weit, so gut.
- 39:23Wenn du jetzt aber zum Beispiel irgendeinen anderen Vogel hast,
- 39:26wie zum Beispiel ein Rabe oder so ne also oder eine Möwe, wie
- 39:29zum Beispiel bei unserem Flappy Buddy Programmierwettbewerb.
- 39:31Genau das ist ein reales Problem.
- 39:33Leute, ja genau, auch wenn es bei uns keine Pinguine gibt.
- 39:37Aber angenommen, Du hast jetzt zum Beispiel Rabe oder Möwe ne
- 39:42als Vogel und das sind beides Vögel, die wiederum Unterklassen
- 39:46von von einem fliegenden Vogel sind.
- 39:48Das heißt, Rabe ist ein fliegender Vogel und ist aber
- 39:52auch ein Vogel. So genau.
- 39:53Und jetzt kommt noch ein Pinguin und sagt, ein Pinguin ist ein
- 39:56Vogel, was ja bedeutet, dass im Endeffekt der fliegende Vogel
- 40:00die Funktion fly hat und demzufolge Rabe oder eine Möwe
- 40:07auch, aber der Pinguin nicht, weil die klasse Vogel hat.
- 40:11Diese Funktion fliegen nicht so, demzufolge muss oder oder hat
- 40:16jeder Vogel 2. Zwar nicht die Möglichkeit,
- 40:19fliegen aufzurufen, als Funktion aber n fliegender Vogel und der
- 40:24Pinguin selber, der nur vom Vogel, dann sag ich jetzt mal
- 40:27abhängig ist oder ne Unterklasse vom Vogel ist der dem kann man
- 40:31dann vielleicht noch so ne Art schwimmen oder so verpassen, ne?
- 40:36Genau, und dadurch ist quasi die die basisklasse Vogel ja nicht
- 40:40verletzt am Ende durch die Unterklassen.
- 40:43Wenn ich jetzt die Basisklasse in meiner Software verwende,
- 40:46weil ich denn nicht mehr sagen kann Vogel Punkt fliegen oder
- 40:51fly was du meintest, dann kann es nicht mehr passieren, dass
- 40:54ich da auf einen Pinguin komme, der aber nicht fliegen kann,
- 40:56weil ich das Halt aufgeteilt habe und das ist halt der
- 40:59entscheidende Punkt dabei. Genau also.
- 41:02Also du kannst dich natürlich hinstellen und sagen, OK,
- 41:04Pinguin ist jetzt ne sub klasse auch von flyingbird, aber dann
- 41:07macht man ganz. Andere Sachen, aber dann kannst
- 41:09du, kannst es aber in deiner Software differenzieren einfach
- 41:12und kannst damit dieses Prinzip einhalten.
- 41:14Genau also wie gesagt noch mal an der Stelle, es ist n bisschen
- 41:17komplizierter und ich hab auch damals gebraucht das so wirklich
- 41:20zu verinnerlichen und zu verstehen.
- 41:21Ich hoffe wir haben es gut rüber gebracht also ich konnt ihr gut
- 41:24folgen, ansonsten wenn es Fragen dazu gibt lieber zur lieber zur
- 41:29gerne ne Mail dann werden wir es noch mal vertiefen.
- 41:32Oder noch mal kurz zur Steckeranalogie zurück sprechen.
- 41:34Oder noch mal noch mal die Steckdosenanalogie.
- 41:38Ansonsten würde ich sagen, gehe ich mal zum vierten Prinzip, es
- 41:41kommen ja noch 2. Stimmt so, dann sind wir bei dem
- 41:45I und das ist das Interface Segregation Principle, also dass
- 41:51man quasi spezifische Schnittstellen verwenden soll
- 41:55anstatt riesige Interfaces. Wo wir auch wieder beim Thema
- 41:59sind, super klasse oder super Interface wo du alles also
- 42:03wirklich wie wenn wir noch mal die Stecker nehmen, da kannst du
- 42:06einfach alles anstecken und auf der anderen Seite kann auch
- 42:08alles rausgehen und du hast so n riesen Konverter da, der kann
- 42:11alles so ne aber keiner weiß mehr wirklich was da drin
- 42:13abgeht. Oder oder stell dir ne ne ne ne
- 42:18universelle Fernbedienung vor, eine Fernbedienung die alles
- 42:21kann, die hat einfach 100 Knöpfe und du kannst alles damit
- 42:24steuern. Hast du mal so eine gesehen?
- 42:26Ich hatte wirklich mal so ne Universalfernbedienung, die
- 42:28kannst du dir ja kaufen, gab es früher ja immer so für alle.
- 42:31Fernseher so ne und ich hab zu Ende mal irgendwie bei einem
- 42:34Kumpel oder so gesehen dachte was ist das denn Alter und
- 42:37eigentlich brauchst du ja am Ende nur irgendwie wieviel.
- 42:40So 5 Tasten oder so. Ich, ich tatsächlich hab ich mal
- 42:43ne Fernbedienung gesehen, die konntest du umdrehen und die hat
- 42:45auf der anderen Seite auch noch Knöpfe gekauft.
- 42:48Das ist aber das ist halt n perfektes Beispiel, das ist
- 42:51eigentlich die perfekte Analogie die wir gerade gefunden haben,
- 42:53weil wie du schon so schön meintest, du hast vielleicht.
- 42:57Nächstes Programm vorheriges laut, leise Mute vielleicht
- 43:01noch. Also du brauchst vielleicht ne
- 43:01Handvoll Knöpfe, hast dann aber so n universelles Ding mit 100
- 43:05Dingern, also 100 Knöpfen, wo du theoretisch sogar noch NDVD
- 43:09Player bedienen könntest. Weißt du?
- 43:11Falls man noch weiß, was du hast zu Hause.
- 43:14Und da ist halt genau die Frage, wäre es nicht besser eine
- 43:17spezialisierte Fernbedienung und so wie man sie auch zum
- 43:20Fernseher dazu bekommt? Zu haben die wirklich die auf
- 43:24die Funktion des Fernsehers eingeht und nicht noch 1000
- 43:27extra Funktionen, die quasi unjusted sind noch drauf zu
- 43:31haben. Und genau darum kümmert sich das
- 43:33Prinzip. Ist auf jeden Fall auch ein
- 43:37super spannendes Prinzip. Ich habe das auch tatsächlich
- 43:39auch schon öfter selber erlebt, dass man irgendwie man erstellt
- 43:43ein Interface und sagt, Ja, komm, ich habe jetzt.
- 43:46Also das ist aber auch wieder so n so n so n Work and progressing
- 43:49weißt du, du fängst an und sagst OK ich hab ein Interface und
- 43:53mein Interface hat 2 Funktionen ne und wenn du sagst OK ich
- 43:58möchte jetzt dieses also irgendwie dieses Interface
- 44:01implementieren, dann hab ich jetzt zum Beispiel, also wie
- 44:05nehmen wir noch mal das Payment Beispiel ne und du sagst OK.
- 44:09Du hast ein Interface mit Pay drin, als Beispiel ne und jede
- 44:13einzelne Bezahlmöglichkeit muss ja irgendwie Pay implementieren,
- 44:16vielleicht auf eine andere Art und Weise ne, dann hast dann
- 44:20hast du ja im Endeffekt den, du hast es ja relativ, das ist ein
- 44:26schlankes Interface, ein Payment Interface sozusagen ne wo nicht
- 44:29wirklich viel dabei ist. Aber wenn du jetzt anfängst und
- 44:32sagst Ey, aber da kommt jetzt zum Beispiel noch dies rein und
- 44:35das rein und jenes und hast du nicht gesehen, dann.
- 44:38Hast du vielleicht im Payment Service 1?
- 44:40Nutzt du 2 Funktionen von 20 im Payment Service 32 nutzt du dann
- 44:47was weiß ich sagen wir mal 10 Funktionen und in dem anderen
- 44:50auch noch mal 10 aber eigentlich sind mindestens immer 10
- 44:54Funktionen die im Interface eigentlich insgesamt verfügbar
- 44:58sind ungenutzt und dann? Ne, wie gesagt, das ist manchmal
- 45:02auch so. N work and progress, dass man
- 45:03dann vielleicht irgendwann es es baut sich auf in deiner Software
- 45:07und du denkst dir, irgendwann gibt es nicht vielleicht
- 45:09irgendwie Gemeinsamkeiten wo man sagt das ist ein Interface was
- 45:15rein theoretisch richtig Sinn macht, ne also dass man die
- 45:18Interfaces sozusagen dass du, dass du einfach vielleicht 3
- 45:21Interfaces aufsplittest, weil zum Beispiel eine Funktion,
- 45:24nämlich die Pay Funktion, das ist wirklich die Funktion, die
- 45:27jedes. Jeder Payment Service verwendet,
- 45:31also ist das auch wirklich ein Interface, ein eigenes
- 45:34Interface, ne? Ja, hast du da vielleicht ein
- 45:38kleines Minimalbeispiel, was wir noch so geben könnten, weil wir
- 45:41jetzt überall immer so Beispiele hatten?
- 45:43Fällt dir gerade was ein? Also wenn du jetzt zum Beispiel
- 45:46sagst, nehmen wir mal Roboter, kommen ja jetzt gerade, sind ja
- 45:50voll im Kommen, ne. Mit KI und können dir was
- 45:52abnehmen. So ja.
- 45:53Geil das hau raus das Beispiel. So, und jetzt hast du zum
- 45:57Beispiel, sagen wir mal in in in Lagerristen ne.
- 46:03Weil ich glaube, in in, in vielen so Logistikzentren oder
- 46:06so werden ja auch mittlerweile Roboter eingesetzt, die Pakete
- 46:09durch die Gegend tragen. Und du hast jetzt so.
- 46:12Ich war letztens kurz off topic war ich in so einem Diner, wo
- 46:16mir hier dieser so n Roboter das Essen an Tisch gebracht hat.
- 46:19OK, und wie fandst du das? Das war voll witzig, aber du
- 46:22hast doch das als Beispiel nehmen.
- 46:23Das ist auf jeden Fall, das kann ich nicht zeugen.
- 46:25Aus der Realität OK, cool. Also du hast, du hast n Roboter,
- 46:29also sagen wir mal du hast n Restaurant in dem.
- 46:32Du Servierkräfte hast also menschliche Servierer,
- 46:36Serviererin und Kellnermäßig und Kellner, also Roboter, Kellner,
- 46:41so Roboter, Kellner klingt wieso ein Film, ey die Rückkehr der
- 46:47Roboter, Kellner auf jeden Fall so dann diese beiden hast du und
- 46:51dann hast du zum Beispiel einmal den den Arbeiter sozusagen und
- 46:55einmal den Roboter so und beide könnten ja rein theoretisch auf
- 47:00jeden Fall arbeiten. Also so, und dann hast du aber
- 47:05zum Beispiel noch den Punkt, dass du sagst okay, aber also
- 47:08ein Arbeiter, der möchte ja auch oder der Mensch, der möchte
- 47:12auch, der muss ja auch essen, so was wie eine Essenspause machen,
- 47:16also dass du halt einfach sagst, Mittagspause komm, ich gehe
- 47:18essen, das braucht der Roboter aber nicht, der muss aber
- 47:21vielleicht laden, was auch immer, vielleicht schafft er
- 47:23auch den ganzen Tag, aber sagen wir mal, du hast im Endeffekt
- 47:26eine Klasse, die das ist sozusagen klasse Arbeiter so im.
- 47:31Im Großen und Ganzen. Und dieser Arbeiter muss
- 47:34arbeiten können, logischerweise, die Funktion braucht er, weil er
- 47:37arbeiten soll und er muss essen. So und jetzt hast du aber zum
- 47:41Beispiel den Roboter wieder und wenn der Roboter aber ein
- 47:45Arbeiter ist, genauso wie ein Mensch ein Arbeiter sein kann in
- 47:48diesem Restaurant, dann kannst du ja rein theoretisch auf dem
- 47:53Arbeiter wieder, weil der Arbeiter die Funktion Work und
- 47:56Eat hat, also er darf arbeiten und kann essen.
- 47:59Könntest du ja rein theoretisch, wenn der Roboter ein Arbeiter
- 48:01ist, auch auf dem Roboter die Funktion eat aufrufen.
- 48:05So und jetzt hast du natürlich wieder das so n bisschen
- 48:08ähnliches Prinzip was wir vorher also vorhin hatten, ne andere
- 48:12also die Subklasse macht was anderes oder?
- 48:15Oder reagiert vielleicht anders weil dann vielleicht ne
- 48:17Exception geworfen wird und da steht dann drin als Exception
- 48:21Message Roboter müssen nicht essen so ja aber.
- 48:26Hier geht es ja auf einen anderen Punkt hinaus und zwar,
- 48:28dass du die Interfaces oder die Oberklassen oder wie du es
- 48:31nennen möchtest ist. In dem Fall ist ein Interface
- 48:34würde ich jetzt mal sagen, schlanker machst ne, das heißt
- 48:37im Endeffekt spezifischer. Genau spezifischer finde ich
- 48:40gut, also du hast mehr, aber spezifischer, das heißt im
- 48:43Endeffekt hast du das Interface workable ne wenn wir jetzt von
- 48:47Worker oder Arbeiter ausgehen, das heißt also.
- 48:49Arbeitend, wenn es auf Deutsch machen willst oder so und
- 48:53eatable so. Das heißt du hast sozusagen n
- 48:55Interface. Was sagt OK es ist möglich zu
- 48:58essen und n Interface was sagt es ist möglich zu zu.
- 49:02Arbeiten so und bitte an der Stelle nicht übersetzen als n
- 49:06essbarer Mitarbeiter sagen genau, aber ich weiß was du
- 49:10meinst. So, und dann genau.
- 49:12Und dann hast du ja zum Beispiel kannst Du sagen, OK der der
- 49:14Mensch, ne der ist zum Beispiel, also der ist.
- 49:18Rockable und die und der Roboter ist halt nur rockable so und
- 49:24demzufolge hast du dann den Effekt, dass der Mensch 2
- 49:28Interfaces implementiert, also zum Beispiel einmal das
- 49:30Interface für Essen und das Interface für Arbeiten und der
- 49:34Roboter hat nur das Interface für arbeiten, was aber auch
- 49:37gleichzeitig in deiner Software bedeutet, dass wenn du sagst,
- 49:40ey, ich möchte jetzt alle losschicken, angenommen sagen
- 49:43wir mal, du hast eine kleine Simulation von dem Restaurant
- 49:46und. Und du möchtest in deiner
- 49:47Simulation alle Arbeiter losschicken in
- 49:50Anführungsstrichen? Dann kannst du ja sagen okay,
- 49:53ich nehme alle meine Instanzen von Workern sozusagen und lass
- 49:58die arbeiten so und dann kann ja ein Worker, ist ja zum Beispiel
- 50:03entweder ein Mensch oder ein Roboter, aber wenn du jetzt
- 50:05sagst, schick mal bitte alle worker in Anführungsstrichen zum
- 50:11Essen. Also beziehungsweise die die
- 50:14auch essen können. Die, die sozusagen das eatable
- 50:18Interface implementieren, dann funktioniert das, aber die
- 50:21Roboter werden sozusagen gar nicht dann bedient an der
- 50:24Stelle, weil die das ja gar nicht überhaupt nicht in ihrer
- 50:27Funktionalität dann drin haben, oder halt dieses eatable
- 50:30Interface gar nicht implementieren.
- 50:32Genau. Und.
- 50:35Jetzt kann man sich natürlich denken, OK, das sind jetzt 2
- 50:37Eigenschaften, sozusagen, das Krieg ich schon noch irgendwie
- 50:39verwaltet. Ne, das wär so n Grundgedanke
- 50:41wenn Gedanke, wenn man quasi immer weitergeht und sagt, nee
- 50:45ich brauch so ne Prinzipie nicht, das geht schon, das passt
- 50:47schon so, jetzt sagst du aber irgendwann jetzt hab ich aber
- 50:50auch noch Mitarbeiter die in der Pause draußen rauchen gehen, so
- 50:53ne dann will ich noch wissen wer raucht von denen zum Beispiel
- 50:56oder? Du baust die Aufgaben ein.
- 50:59Wer bringt zum Tisch, Wer bereitet die Getränke zu, wer
- 51:02geht in die Küche und so weiter und es kommen immer mehr
- 51:04Eigenschaften rein in dieses Interface und es wird quasi so
- 51:09riesig wie unsere Fernbedienung. Aber es gilt halt nicht für
- 51:11jeden. Weil der, der draußen die Teller
- 51:14abräumt, muss ja nicht noch Funktionen implementieren, wie
- 51:17er Getränke zubereitet. Jemand, der nicht raucht, muss
- 51:19nicht wissen, wie die Funktion aussieht, um rauszugehen und zu
- 51:21rauchen. Weißt du also, das ist ja genau
- 51:24das der Punkt den du meinst, weil wenn man sich so denkt ja 2
- 51:27Funktionen Come on es wird 100 Pro irgendwann mehr und dann ist
- 51:30es genau richtig diese spezifischen Interfaces zu
- 51:33verwenden um dann auch spezifisch drauf zugreifen zu
- 51:36können am Ende oder unterscheiden zu können,
- 51:39richtig. Im Endeffekt hast du ja auf
- 51:41jeden Fall ein gutes Beispiel. Im Endeffekt hast du ja, wenn du
- 51:43es in deiner Software siehst, irgendwann Objekte, auf denen du
- 51:46irgendwas aufrufen willst. Und du willst ja wissen, auf
- 51:50welchen Objekten kann ich denn was aufrufen und es soll dann
- 51:53auch so funktionieren. Ne, und damit du das besser auch
- 51:57differenzieren kannst zwischen diesen Objekten auch
- 51:59unterscheiden kannst, hast du halt eben dann auch
- 52:02spezifischere Interfaces sozusagen.
- 52:04Ja, genau. Ja, cool, erklärt Fabi, vielen
- 52:09Dank dafür. Lass uns mal zum letzten Prinzip
- 52:11kommen, wir sind auch schon n bisschen fortgeschritten in der
- 52:13Zeit, aber wir müssen auf jeden Fall es noch unterbringen, das
- 52:16wär jetzt so richtig mies und das nächste erfahrt ihr in der
- 52:19nächsten Folge. OK, das D in Solid steht für
- 52:24Dependency Inversion Principle und das finde ich sehr spannend
- 52:27und auch sehr wichtig ist ne sehr gute Sache und im Prinzip
- 52:32geht es um Dependency Injection als Lösung dahinter.
- 52:36Aber wie kann man sich das Ganze vorstellen, wenn man sich jetzt
- 52:40vorstellt, man hat zum Beispiel eine Anwendung, wo du so eine
- 52:43Business Geschäftslogik drin hast, die halt wirklich intern
- 52:46in deiner Software quasi regelt, wie gewisse Sachen umgesetzt
- 52:51werden, verarbeitet werden und. Je mehr ich zu den Eingabe zum
- 52:57Beispiel. Ich hab jetzt ganz klassisch
- 52:58eingabeverarbeitung Ausgabe ne, nehmen wir mal so das Eva Ding
- 53:02und diese Verarbeitungslogik ist riesig, da passiert unglaublich
- 53:05viel. Wir haben sehr viele Eingaben
- 53:07und jetzt erzeug ich aber Abhängigkeiten von diesen
- 53:10Eingaben und bin halt so unglaublich verzwickt.
- 53:14Oder man stellt sich das vor, so keine Ahnung im Webbereich, wo
- 53:18ja auch viele unterwegs sind. Ich habe halt so eine API, das
- 53:21ist meine Eingabe und die Verarbeitung ist wie ich auf der
- 53:24Datenbank mit diesen Daten arbeite und wenn ich jetzt aber
- 53:27so unglaublich verzwickt und Verwurstelt nenne ich es mal mit
- 53:31der Eingabe bin, dann kriege ich halt riesenprobleme wenn ich das
- 53:35ganze quasi durch diese Abhängigkeiten verändern will,
- 53:38weil ich dann an allen Stellen wieder eingreifen muss.
- 53:42Kannst, kannst du mir folgen? Definitiv.
- 53:45Also ich hab halt das Problem, dass es nicht mehr flexibel ist,
- 53:48dass es vor allem nicht mehr testbar ist, weil das ist jetzt
- 53:51n riesen Punkt. Dieses Prinzip sag ich mal
- 53:55fördert unglaublich die Testbarkeit, da können wir
- 53:57gleich noch mal drauf eingehen und ich kann es auch nicht mehr
- 54:00gut erweitern am Ende, weil ich halt diese Kopplung hab.
- 54:04Und wie schaffe ich es jetzt diese Eingabe und Verarbeitung
- 54:08voneinander zu entkoppeln? Und genau da greift halt die
- 54:11Dependency Injection und magst du, hast du vielleicht so ein
- 54:15Minimalbeispiel? Also ich finde wir können ja das
- 54:18ruhig mit dieser API und Datenbank ruhig weitermachen,
- 54:21weil ich glaube das ist so ein Bereich wo viele unterwegs sind
- 54:24im Webbereich wie man jetzt so eine Dependency Injection
- 54:28verwenden könnte dafür. Also im Endeffekt kannst du, ich
- 54:33hoffe ich kann das Beispiel jetzt richtig aufgreifen was du
- 54:36meinst. Also angenommen du hast jetzt
- 54:40eine eine eine sagen wir mal Anwendung und diese Anwendung
- 54:46hat auf jeden Fall, also hat eine Zugriff auf eine Datenbank
- 54:51so ne so und dann ist diese Datenbank zum Beispiel einfach
- 54:55festgeschrieben in diesem Programm, das heißt du hast so.
- 54:58Sozusagen irgendwie einen Service.
- 55:00Also sagen wir mal, du gehst über eine API und du hast in
- 55:03dieser API eine Anfrage und du hast irgendwie einen Service,
- 55:07der diese Anfrage verarbeitet und sagt zum Beispiel okay ich
- 55:10muss jetzt aber diese diesen Request in meine Datenbank
- 55:13schreiben oder Daten aus dieser Datenbank rausholen, genau, und
- 55:16jetzt hast du in deinem Service zum Beispiel eine Datenbank
- 55:19instanziiert so weil dieser Service sagt zum Beispiel okay
- 55:23ich brauche eine Datenbank und wenn du jetzt aber zum Beispiel
- 55:26sagst okay ich. Habe jetzt zum Beispiel eine My
- 55:29SQL Datenbank, die ich über diesen Service anspreche.
- 55:34Dann wird jeder request immer nur gegen eine My SQL Datenbank
- 55:38gehen und wenn du aber jetzt zum Beispiel sagst ich möchte jetzt
- 55:41aber eigentlich gegen eine andere Datenbank gehen, weil ich
- 55:43noch eine andere habe, wie willst du das machen weil du
- 55:46immer nur diesen einen Service hast der.
- 55:51Quasi wo drin, wenn dieser Service hochgefahren wird oder
- 55:54existiert, dann hat er eine feste Instanz von einer
- 55:56Datenbank oder einen festen Zugriff auf eine Datenbank,
- 55:59besser gesagt eine Connection dazu.
- 56:00So und wenn du jetzt aber zum Beispiel sagst, ich möchte das
- 56:04ganze Injekten sozusagen, also dependency Injection nutzen,
- 56:10dann gibst du quasi die Datenbank von außen rein, das
- 56:13heißt im Endeffekt sagst du okay ich möchte diesen User Service
- 56:16haben mit dieser Datenbank. Das bedeutet, dass du im
- 56:21Endeffekt nicht sagst, okay, ich habe jetzt eine eine feste
- 56:24Datenbank, sondern ich sage diesem diesem Service, dem sage
- 56:32ich pass auf, ich brauche jetzt Daten, diese Daten brauche ich
- 56:36aus einer Datenbank und ich gebe dir mit, welche Datenbank das
- 56:40ist, von der du diese Daten holen sollst beziehungsweise wo
- 56:44wo du die Daten reinschreiben sollst.
- 56:46Das ist sozusagen der kleine Unterschied.
- 56:50Ja, und das kannst du ja halt auch auf allen Ebenen packen.
- 56:54Also das war jetzt quasi die Funktion mit dem
- 56:57Datenbankzugriff. Du kannst es aber auch genauso
- 57:00eine Ebene höher packen. Wie sieht denn deine Rest api,
- 57:03deine Calls, deine Requests aus und was passiert in deiner
- 57:07Software? Da kannst du das ja genauso auf
- 57:09der Ebene einziehen, dass du sagst, ich möchte ja nicht, dass
- 57:12jeder request genau wenn ich den Entgegennehme schon quasi.
- 57:17Quasi in sich selbst tragend. Die Implementierung hat, wie ich
- 57:21auf der Datenbank arbeite, also wie der Service aussieht, weil
- 57:24dann ist jeder Request an den Service gekoppelt, da haben wir
- 57:28wieder ne Kopplung und wenn du jetzt aber sagst ich hab zum
- 57:31Beispiel ne Art Controller, ist so n klassischer klassische
- 57:34Klasse klassische Klasse dafür für so die für die Request die
- 57:39sich nur darum kümmert auf welchen Calls nehm ich denn was
- 57:43entgegen? Und gebe da den Service auch
- 57:47noch mal rein. Dann hab ich das auch noch mal
- 57:49entkoppelt und das ist auch dependency Injection, dass ich
- 57:51sage, dieser Controller instanziiert sich keinen Service
- 57:55und ist damit exakt gekoppelt an diesen Service, sondern ich gebe
- 57:59von draußen einen Service rein, der dafür sorgt auf diese
- 58:04Request zu reagieren und der ist austauschbar.
- 58:07Ja, genauso wie dein Beispiel. Ich habe dann den Service, der
- 58:11wiederum von außen die Datenbank bekommt, damit die Datenbank
- 58:14austauschbar ist, dass es halt nicht in sich selbst
- 58:17instanziiert und implementiert ist.
- 58:20Und das ist halt n Riesenvorteil, weil wir auch
- 58:22meinten, Testbarkeit angenommen, ich möchte jetzt sagen wir mal
- 58:29den Controller testen. Ja, ja, also ich will jetzt
- 58:32einfach, ich tue jetzt so, als wenn n request reinkommt und ich
- 58:35möchte wissen, ob ich auf 200 mit 200 OK antworte, weil alles
- 58:39OK war oder nen 404 beispielsweise und ich will das
- 58:43jetzt testen und hab jetzt aber in dem Controller selbst diesen
- 58:47Service implementiert, da muss ich diesen ganzen Rattenschwanz
- 58:50irgendwie in diesen Test reinbringen, damit ich den
- 58:52Abtesten kann. Wenn ich jetzt aber diesen
- 58:55Service von draußen in den Controller gebe, dann kann ich
- 58:58ja nen. Sag ich mal n gemobbten Service
- 59:01da reingeben und simulieren wie der reagiert und kann mir so
- 59:06viel besser Testfälle bauen, dass ich zum Beispiel sag, wie
- 59:09sieht der Request aus, alles klar, ich tu mal so als wenn ich
- 59:12in der Datenbank jetzt den Eintrag finde und ah OK 200 OK
- 59:16geht zurück super der Test funktioniert jetzt tue ich so
- 59:19als wenn ich den Eintrag nicht finde ja OK 404 beispielsweise.
- 59:25Wenn ich das aber so nicht machen müsste, dann bräuchte ich
- 59:27den richtigen Service. Dann bräuchte ich die richtige
- 59:29Datenbank, um irgendwie nach oben wieder zu bekommen.
- 59:31Ob der User jetzt da drin war oder nicht beispielsweise, und
- 59:35das ist halt das coole an Dependency Injection und das ist
- 59:37halt auch das D in Solid am Ende.
- 59:40Ja, richtig. Also ich finde Dependence
- 59:43Injection ist an sich auch ein relativ großes Thema, wenn man
- 59:45da jetzt noch mal, wie du ja eingangs auch schon meintest,
- 59:48wenn es bestimmte Themen gibt, über die wir noch mal ein
- 59:50bisschen genauer eingehen sollen, Liebe zuhören, lieber
- 59:52zuhören, dann schreibt uns auf jeden Fall gerne wie gesagt über
- 59:55unsere Podcast Mail oder auch auf unseren Plattformen, wie
- 59:57gesagt, alles in den Show Notes verlinkt, um das Ganze noch mal
- 1:00:01abzuschließen, um das vielleicht noch mal auch ein bisschen, also
- 1:00:04dieses D in Solid, um da noch mal ein kleines Bild vor Augen
- 1:00:08zu rufen. Ja.
- 1:00:09Ich meine. Guck mal, es geht ja jetzt auch
- 1:00:12langsam wieder Richtung Sommer. Das bedeutet langsam ne, so
- 1:00:15dauert ein bisschen noch, aber man sag ich jetzt mal
- 1:00:18urlaubsplanung ist vielleicht ist real so und angenommen du
- 1:00:24als Mensch jetzt ne hast du bist eine Instanz und wirst erzeugt
- 1:00:30so und wenn du jetzt keine Dependency Injection hast und
- 1:00:34sagst OK ich möchte jetzt aber zum Beispiel mit einem Flugzeug
- 1:00:37fliegen so. So, dann wird dir zum Beispiel
- 1:00:40eingeimpft, ne in in deiner DNA, du darfst nur von Hamburg
- 1:00:44fliegen, weil du sozusagen in dir selber den Flughafen
- 1:00:50instanziierst. Also.
- 1:00:52Ne, also eine Instanz anlegst und das ist immer Hamburg
- 1:00:56beispielsweise und nie was anderes.
- 1:00:58Das bedeutet also, du könntest zwar nach Angeboten gucken und
- 1:01:02sagen, Oh guck mal, ich könnte vielleicht von Berlin fliegen
- 1:01:04oder von München oder was auch immer, geht nicht, weil du
- 1:01:06darfst, genau, du darfst nur von Hamburg fliegen und von nirgends
- 1:01:10woanders. Wenn du jetzt aber zum Beispiel
- 1:01:11sagst, ey, ich könnte jetzt aber die dependency Flughafen
- 1:01:16Injekten. Dann hast du die Möglichkeit zu
- 1:01:19sagen, ich gucke erstmal, welchen Flughafen ich denn
- 1:01:22überhaupt ansteuern möchte. Und wenn ich mir einen
- 1:01:25ausgesucht habe, dann nehme ich diesen und gebe ihn sozusagen
- 1:01:30von außen rein. Also ich sag jetzt mal
- 1:01:32gedanklich, du kaufst dir die Tickets und bekommst deine
- 1:01:35Tickets und checkst dir in die Tasche so genau und dann weißt
- 1:01:38du ja, aber okay ich, ich kann mich entscheiden, weil ich
- 1:01:42erstmal sage, welcher Flughafen und dann nehme ich diesen
- 1:01:46Flughafen anstatt zu sagen, ich nehme erst den Flughafen und
- 1:01:49dann gucke ich mal was von da fliegt und wo es hingehen könnte
- 1:01:52so. Und das ermöglicht dir halt
- 1:01:55diese ganze Implementierung drumrum.
- 1:01:57Oder sagen wir mal in deinem Beispiel, diesen ganzen Ablauf,
- 1:02:00sei es das. Stellen der Tickets, den Flug
- 1:02:02buchen oder auch zum Beispiel, was vor Ort am Flughafen
- 1:02:06passiert, was geführt bei jedem Flughafen gleich ist.
- 1:02:08Ja, aber wenn ich dann immer von Hamburg aus gehe, bringt mir das
- 1:02:11nichts. Genauso kann ich den Flughafen
- 1:02:12von draußen reingeben, also was wir mit inject Minen, falls das
- 1:02:16nicht ganz klar ist. Ist ja im einfachen übertragenen
- 1:02:19Sinne n Eingabeparameter in einer Funktion zum Beispiel
- 1:02:22richtig oder in den Konstruktor einer Klasse richtig.
- 1:02:25Und dann hab ich halt den Vorteil, dass ich den Rest der
- 1:02:28der Funktion nicht anpassen muss, vielleicht für so kleine
- 1:02:31spezifische Sachen. Beispielsweise Flughafen Hamburg
- 1:02:35parke ich direkt vor Ort, bei Flughafen Berlin kann ich nicht
- 1:02:37direkt vor Ort weißt du so so flughafenspezifische Sachen, die
- 1:02:41sich unterscheiden können, würden dann die ganze Funktion
- 1:02:43beeinflussen, was aber total unnötig ist, weil vor Ort muss
- 1:02:46ich ja trotzdem mein Gepäck aufgeben, durch ne
- 1:02:48Sicherheitskontrolle gehen und in n Flieger steigen, was vor
- 1:02:51allem wieder gleich ist. Weißt du deswegen das ist n
- 1:02:53cooles Beispiel abschließend finde ich sehr gut danke dir.
- 1:02:58So genau, und damit sind wir ja quasi jetzt einmal durch die 5
- 1:03:01Prinzipien durch Solid ist auf jeden Fall super spannend und
- 1:03:07wie gesagt immer eine wichtige Sache das im Hinterkopf zu
- 1:03:10behalten. Man muss nicht strikt danach
- 1:03:12arbeiten, es ist auch überhaupt nicht schlimm mal irgendwann in
- 1:03:16in der Entwicklung seiner Software zu sehen um Mensch das
- 1:03:20das sind jetzt aber zum Beispiel mehrere Fachlichkeiten, da muss
- 1:03:23ich jetzt zum Beispiel mal was auf splitten, da muss ich
- 1:03:25vielleicht mal wieder was refact an, aber.
- 1:03:27Alles kein Problem, wenn man denn zum Beispiel einfach auch
- 1:03:31mal so bestimmte Infos mal im Hinterkopf hat und und danach
- 1:03:34vielleicht so seinen eigenen Code oder seine Software, in der
- 1:03:36man arbeitet, scannt. Sag ich jetzt mal ne ja und dann
- 1:03:40kann es einfach sag ich mal nachhaltig besser werden.
- 1:03:44Ja, also auch noch mal ganz kurz abschließend die Tech Home
- 1:03:48Message. Ich würde noch mal ganz, ganz
- 1:03:50kurz durchgehen, noch mal so zur Zusammenfassung.
- 1:03:53Also solid ist. Im Prinzip sind 5 Prinzipien für
- 1:03:56jeden Buchstaben 1. Wir haben das S mit Single
- 1:03:59Responsibility Principle im Prinzip eine Klasse, eine
- 1:04:03Aufgabe, eine Verantwortlichkeit, dann haben
- 1:04:06wir das Open Close principle, was im Prinzip besagt sei offen
- 1:04:10für Erweiterung und geschlossen für Modifikation.
- 1:04:13Drittens war das lisco Substitution principle, was im
- 1:04:16Prinzip die Ersetzbarkeit von den Subklassen beinhaltete, das
- 1:04:21Vogelbeispiel. Ich hoffe, man kann sich noch
- 1:04:23dran erinnern mit den Pinguinen, viertens war Interface
- 1:04:26Segregation Principle, was im Prinzip sagt nicht die
- 1:04:29universelle Fernbedienung, sondern speziell für deinen
- 1:04:32Fernseher, das heißt lieber spezifische Interfaces statt
- 1:04:35riesige Schnittstellen und jetzt zum Abschluss hatten wir
- 1:04:38dependency Inversion Principle mit der Dependency Injection.
- 1:04:43Was ja im Endeffekt sagt, diese Abhängigkeiten, die man hat,
- 1:04:46lieber auf Abstraktionsebene packen und nicht auf konkrete
- 1:04:49Implementierung, wo du ja gerade das Flugbeispiel gebracht
- 1:04:52hattest. Wenn ich implementiere in meiner
- 1:04:54buchungsfunktion Flughafen oder so.
- 1:04:57Start ist immer Hamburg ungünstig.
- 1:04:59Richtig, ganz genau so sieht es aus, gut zusammengefasst, Kino,
- 1:05:03dann sind wir eigentlich auch, würde ich sagen, durch wie
- 1:05:07gesagt bei. 2 genaueren Fragen weitere weiterführenden Podcast
- 1:05:13folgenden Themen schreibt uns einfach an.
- 1:05:16Ansonsten danke Tino fürs für die Folge, hat Spaß gemacht und
- 1:05:21war sehr cool. Wir haben versucht es möglichst
- 1:05:24kurz zu halten und es ist wieder länger geworden als man denkt
- 1:05:26wie? So immer.
- 1:05:28Es sind aber auch 5 Prinzipien man so.
- 1:05:32Genau. Und ansonsten würde ich sagen,
- 1:05:34bewertet gerne den Podcast. Das würde uns mega freuen.
- 1:05:38Empfiehlt ihn auch gerne weiter, wenn ihr sagt das ist ein Hammer
- 1:05:42cooler Podcast. Genauso könnt ihr uns auch
- 1:05:44unterstützen mit einem kleinen Spenden Link gibt es alles unten
- 1:05:47in den Shownotes einfach mal reinschauen und mal durchlesen,
- 1:05:50mal reinschnuppern sozusagen, ansonsten bleibt mir nichts
- 1:05:53anderes übrig als zu sagen bis zum nächsten Mal, also bis zur
- 1:05:57nächsten Woche. Wir hören uns habt einen schönen
- 1:05:59Tag, deine Cordon balis gemeinsam besser.