Bedeutet, kann ich zwar, ich sag mal.
Relativ schnell neue Funktionen hinzufügen, ne, also sowas wie
Checkmops im Bereich ist, oder? Ja, jetzt fällt mir kein anderes
Beispiel ein. Check mal, ob es nicht im
Bereich ist. Ist jetzt blöd Coating Boys dein
Podcast wohnt im Softwareentwicklung und
aktueller Technews. Herzlich Willkommen.
Herzlich Willkommen zur neuen Folge vom Coding Buddies
Podcast. Die Gastgeber sind wieder am
Start, das bin natürlich ich und Tino ist auch dabei und den
heiße ich jetzt herzlich willkommen.
Halli Hallo, das war ne schöne Einleitung, die hat mir gut
gefallen. Ich hoffe dir liebe zuhören
Liberty aber auch. Hi.
Fabi Hi Tino, Grüße dich. Wie geht es?
Wie steht es ja alles gut soweit, alles gut es.
Ist alles. Im Lotto alles im Lot genau das
ist genau die richtige Redewendung, die ich gesucht
habe. Es ist alles im Lot mir.
Geht's super, ich hab Bock sehr gut, ich freu mich aufs Thema
heute, du hast es ja schon mal im kleinen Vorgespräch
angeteasert. Wird cool heute, das wird
spannend. Sagen wir es mal so, das ist für
mich auch ein sehr spannendes Thema.
Bevor wir aufs Thema kommen, wollte ich noch mal einmal ganz
kurz im Vorfeld uns mich in unserem Namen bedanken.
Bei allen Zuhörerinnen und Zuhörern, die uns so liebe Worte
auch. Zukommen lassen.
Und zwar liebe Worte zu unserem Podcast.
Wir haben schon gerne mal das ein oder andere Lob in letzter
Zeit bekommen und da wollte ich mich einfach nochmal in unserem
Namen an allen. Wird jetzt zuhören und zuhören,
bedanken. Das freut uns.
Vielen Dank vielen, vielen Dank. Man kann es nicht sehen, aber
ich versuch hier gerade hier so mit den Fingern so ein Herz zu
machen. Weil Tino sieht zum.
Beispiel die ja, kann ich gar nicht, geht gar nicht.
Also Respekt an Leuten, die das so aus dem Stand so Zack Herz,
kennst du das so so ein perfektes Herz mit den Fingern
so aus dem Licht. Das ist Crazy.
Und manchmal auch mit ganz komischen Konstellationen an
Fingern. Irgendwie so mit einem
Ringfinger und weiß ich, was da alles schon das ist wild
manchmal. Da sind wir zu alt für.
Nicht nur, weil wir auch uns fehlt die Gelenkigkeit in den
Fingern. Ich wollte schon sagen, die
Arthrose kickt da rein. Aber nein, nein, nein.
Aber was mich zum Beispiel sehr berührt hat, war das jemand.
In der Twitch Session in den Chat geschrieben hat.
Da sind ja endlich die Gesichter zu meinem Lieblingspodcast und
sowas ist natürlich. Der Hammer.
Und total toll. Also nochmal vielen Dank dafür
und genau. Jetzt würde ich sagen, starten
wir ins Thema rein und das Thema ist dieses Mal ja n bisschen ja.
Also es geht wieder um Cleancode.
Und es geht um intensiveres Thema, eventuell also vielleicht
auch so n bisschen für sag ich jetzt mal fortgeschrittenere,
eventuell aber natürlich auch für eigentlich ist es für alle
was, weil damit setzt man sich auf jeden Fall irgendwann
auseinander, also. Nehme ich.
Alles zurück sollte man auch. Und es geht eigentlich im
Endeffekt. Das Thema geht darum,
Datenstrukturen und Objekte, also das sind ja ich Spoiler,
mal ein bisschen schon was unterschiedliches, und wir
wollen jetzt in dieser Folge mal ein bisschen die Frage klären,
was ist der Unterschied und wann nimmt man was von beidem.
Ja, das ist auch ein sehr spannendes Thema.
Als du das Thema vorgeschlagen hast, dachte ich mir so, ja,
cool klingt cool, oh mein Gott, ja dann bin ich erstmal so
selbst ins Struggeln gekommen, weil ich mir so dachte.
Ja, okay ist doch ganz logisch, Datenstrukturen, Objekte, aber
wenn man da mal tiefgründiger drüber nachdenkt und sich mal
wirklich. Dieses Thema einlässt, muss ich
sagen, ging es jedenfalls mir so, dass man da echt so n
bisschen Probleme kriegt, das klar auseinander zu halten.
Also wirklich sich mal zu überlegen, was definiert eine
Datenstruktur, was ist ein Objekt in dem Sinne und wie,
wann setzt man was ein und das ganze aber auf einer Metaebene,
die jetzt sprachenunabhängig ist, das ist noch mal eine
kleine Anmerkung dazu und die auch sehr wichtig ist.
Wir reden jetzt nicht davon, dass wir jetzt sagen, okay, wir
haben jetzt zum Beispiel in unserem Grundlagenkurs Java
gehabt, und wie macht man das jetzt in Java oder die.
Andere Sprachen grundlagenkurs Python, weil da geht es ja schon
los. Das wäre in beiden Sprachen
schon unterschiedlich und deswegen würde ich das Ganze
gerne auf eine Art Metaebene heben, wo es auch hingehört,
meiner Meinung nach, dass man sich ganz allgemein
sprachenunabhängig überlegt, wie möchte ich meine Software oder
mein System noch allgemeiner, nee sagen wir mal und meine
Software die seien. Und verwende ich dann für
gewisse Funktionalitäten, die ich brauche oder Features, die
ich jetzt zum Beispiel umsetzen möchte?
Da überleg ich mir n Plan, wie ich das Coden möchte und nehm
ich jetzt beispielsweise Datenstrukturen oder setz ich
das ganze lieber mit Objektorientiert um, zum
Beispiel? Ja.
Also auf diese Ebene würde ich das sehr gerne heben und.
Deswegen auch anfangs mal mit dir diskutieren, worin da so die
Unterschiede liegen können. Auch hinsichtlich.
Es ist ja die cleancode Reihe immer natürlich hinsichtlich
einer Clean Entwicklung, was so nach dem cleancode Lehrbuch.
Quasi angedacht ist dabei, und dabei weiß nicht, möchtest du
mal anfangen, zum Beispiel mal aus deiner Sicht zu erklären,
was eine einfache Datenstruktur ist.
Was versteht man unter einer Datenstruktur ja?
Genau also wie du ja schon meintest.
Also wenn wir jetzt noch mal ganz kurz auch nochmal.
Java beispielsweise hat ja ausschließlich Klassenobjekte,
wie auch immer, aber darum geht es jetzt nicht, sondern wirklich
wie du schon meintest, noch mal ganz explizit.
Metaebene. Also wenn du jetzt zum Beispiel
eine Datenstruktur ist, im Endeffekt eine, sagen wir mal,
eine Ansammlung von Daten. Die, wobei diese Daten die.
In dieser Datenstruktur hängen sozusagen offen liegen, das
heißt, du hast im Endeffekt keine Logik, also ne, die
irgendwie sag ich jetzt mal. Daten irgendwie verarbeitet, die
da drin sind, sondern wirklich du hast Daten in deiner
Datenstruktur und kannst plain genau auf diese Daten zugreifen.
Der Vorteil von dieser Datenstruktur ist, es hält
natürlich semantisch Daten zusammen, die auch semantisch
irgendwie zusammengehören. Ne, das ist halt erstmal
wichtig. Also es bildet sozusagen
Verbund. Sozusagen genau.
Und wenn du jetzt, wenn du jetzt das ganze nimmst und sagst,
okay, aber das klingt ja irgendwie eigentlich schon auch
wie ein Objekt, es ist doch irgendwie das gleiche.
Da muss man dann halt sagen, naja, okay vielleicht.
Erstmal ist es ein Ansatz, aber der Hauptpunkt ist, dass so ein
Objekt halt eben Daten hält, aber diese Daten sind mehr oder
weniger versteckt, das heißt du kannst von außen auf diese
Daten, auf diese Pläne. Datenpunkte nenne ich es jetzt
einfach mal, die du irgendwie da drin hast, kannst du nicht
zugreifen, sondern du kannst über Funktionen drauf zugreifen
beziehungsweise du hast Funktionen die schon diese Daten
halt auch eben vielleicht semantisch verarbeiten.
Ne. Das ist so n bisschen.
Der Hauptunterschied und jetzt kann man sich vielleicht
hinstellen und sagen, OK, klingt ja alles ziemlich vage, lass uns
doch vielleicht einfach mal n paar Beispiele nehmen und sagen
okay, was ist jetzt wirklich mal konkret ein Beispiel für eine
Datenstruktur und was wäre denn zum Beispiel mal ein konkretes
Beispiel für ein Objekt? Ja.
Ja, das ist eine gute Idee. Am Beispiel kann man sowas denn
wahrscheinlich auch besser verstehen.
Nehmen wir, fangen wir mit Datenstrukturen an.
Angenommen, ich möchte jetzt die Daten einer Entität abbilden.
Beispielsweise einer Person, finde ich.
Ist ein ganz gutes Beispiel, also wirklich eine ganz einfache
Repräsentation einer Person. Hinsichtlich zum Beispiel als
User in auf irgendeiner Website, wo man sich anmelden kann.
Mal so als Beispiel. Und ja, was was hat denn so n
User? Du hast n Name eventuell Vorname
Nachname, du hast n vielleicht n Alter noch ne E-Mail-Adresse,
das wären so klassische Daten. Die halt in dieser Datenstruktur
gehalten werden und die dann quasi verwendet werden können.
Das heißt, die liegen offen, da man weiß genau zum Beispiel.
Das Alter ist ein integer, weil es gibt keinen.
Ich bin Achtzehneinhalb in dem Sinne, sondern es wird mit
ganzen Zahlen gearbeitet. Die E-Mail wird ein String sein,
beispielsweise und so weiter das heißt, ich weiß ganz genau, wie
die Daten aussehen und kann mit dieser Datenstruktur arbeiten.
Ein anderes vielleicht eher für die Mathematik Fans unter uns.
Ein ganz klassisches Beispiel wären geometrische Form oder
noch besser zum Beispiel ein Punkt im Koordinatensystem, dass
ich sage okay dieser Punkt hat eine x und y Koordinate und
bildet da oder repräsentiert damit einen Punkt im
zweidimensionalen Koordinatensystem.
Ja, das Beispiel. Finde ich richtig gut.
Also dann habe ich beispielsweise 2 Zahlenwerte da
drin und es ist ganz klar was. X ist und was Y ist, dann würde
ich zum Beispiel auch sehen können, sind es ganz zahlen, ist
es integer zum Beispiel oder sind es eher Gleitkommazahlen,
die x und y Koordinaten? Also das ist quasi klar
ersichtlich und ich kann damit arbeiten.
Diese Repräsentation ist offengelegt, wie du so schön
gesagt hast, weil das ist ein wichtiger Punkt dabei.
Objekte. Sind also der Anwendungsfall
davon. Ist ja wie du so schön gesagt
hast, wenn man auf diesen Objekten arbeitet, das heißt
diese interne Datenrepräsentation ist
versteckt und nicht nach außen getragen, das heißt, ich weiß
zum Beispiel nicht, welche Datentypen für diese einzelnen
Attribute verwendet werden, das interessiert mich aber auch
nicht, weil ich kriege Funktion bereitgestellt, mit denen ich
auf diesen Werten arbeiten kann und da finde ich, ist so ein
klassisches Beispiel, was man auch oft in Lehrbüchern sieht,
ist zum Beispiel ein Bankkonto. Weil, daran kann man das
eigentlich ganz gut verstehen. Ich lege mir ein Bankkonto an,
das heißt, ich erzeuge sozusagen ein Objekt und sag okay ich habe
eine Kontonummer und ein initialen Kontostand 0 oder
keine Ahnung, ich stelle das Konto direkt mit einer
Einzahlung kann man sagen okay, dann hat es halt einen gewissen
wert x. So, und die Daten, die da drin
gehalten werden, ist dann zum Beispiel die Kontonummer und der
Kontostand. Mhm, und jetzt hast du.
Allerdings der Unterschied genau.
Na gut, dann los. Ich hab grad n bisschen noch
darüber nachgedacht, weil du das gesagt hast, dass man zum
Beispiel nicht unbedingt auf die, auch nicht auf die
Datenstruktur oder Repräsentation von zum Beispiel
dem Kontostand eigentlich, darüber weiß man nichts.
Das heißt, wenn du aber so eine Art Funktion hast, die dir sagt,
Get Balance, das heißt, du möchtest irgendwie diesen Wert
der Balance bekommen, dann könnte es ja durchaus sein, dass
zum Beispiel die Balance in, sag ich mal in Cent dargestellt ist,
mal als Beispiel, und du aber als sozusagen über diese Get
Balance Funktion am Ende ein. Sag ich mal einen Euro wert.
Bekommst also zum Beispiel keine Ahnung.
Sagen wir mal 2500,35€ oder so, dass du dann wirklich quasi
vielleicht einfach eine Gleitkommazahl bekommst.
Aber eigentlich ist die interne Datenrepräsentation unter
Umständen. Sagen wir mal integer in Sense
oder so ne mal als Beispiel. Ja, und das ist nämlich n gutes
Beispiel, weil von außen gesehen interessiert dich ja nicht, wie
intern die Daten gehalten werden, sondern für dich zählt
nur das Gate Balance dir n ne gleitkommazahl zurückgibt.
Und sagt, du kriegst jetzt n Euro wert sozusagen, also dann
halt die. Was hast du gesagt
zweitausendfünfhundert Komma ja ich hab sorry 3335 natürlich 35.
Genau das ist nämlich der entscheidende Unterschied, dass
du halt eine Logik in diesem Objekt hast, mit der auf diesen
Daten gearbeitet wird, weil es macht ja keinen Sinn zu sagen,
ich hab jetzt ne Datenstruktur, das ist ne ne ne Kontonummer und
ne Balance und da könnt ihr jetzt drauf zugreifen und wenn
du sagst beispielsweise du zahlst was ein, dann änder bitte
die Balancebetrag, weil der ist ja sozusagen öffentlich, dann
musst du den jetzt selbst da ändern.
Die Kontonummer Ach weißt du was?
Wenn du möchtest, kannst du auf die Kontonummer ändern, das
Macht natürlich keinen Sinn unter diesem Anwendungsfall, so
dass es sinnvoller ist zu sagen okay, ich gehe diesen Objekte
weg und habe zum Beispiel eine Einzahlungsmethode oder eine
Abhebung Methode, womit ich meinen Kontostand dann intern
manipuliere und die Kontonummer ändern macht sowieso keinen Sinn
in dem Sinne, also da würde ich sowieso dann wahrscheinlich wer
weiß wo es später mal geht in unserem kleinen Beispiel gar
nicht halt irgendwie sagen, dass man die ändern kann.
Das ist halt genau der Unterschied.
Und. Ja, doch, das sind eigentlich
gute Beispiele. Ich würd da oder hast du noch
noch 1? Nee, ich find das gut, also da,
da kann man sich ja eigentlich schon n bisschen was drunter
vorstellen, dass man das auch noch mal n bisschen
differenziert, was also was beides eigentlich ist, was damit
gemeint ist. Und die Frage ist natürlich
jetzt okay es gibt diese beiden. Es gibt jetzt Datenstrukturen,
es gibt Objekte, dann kann man sich natürlich sagen okay, ich
hab den Unterschied verstanden, es gibt beide Sachen, das eine
ist das, das andere ist, das haben wir gerade noch mal ein
bisschen dargelegt, und dann ist natürlich die nächste Frage,
jedenfalls würde sie mir aufkommen, wenn ich jetzt da
noch nicht ganz involviert bin, so okay wann nimmt man denn
eigentlich was? Und man kann ja jetzt erst mal
vorweggreifen, dass natürlich erst mal natürlich abhängig von
der Programmiersprache ist, weil es gibt ja zum Beispiel
Programmiersprachen, die gar nicht objektorientiert arbeiten,
mal als Beispiel, also witzigerweise, letztens erst
gelernt, go ist wohl wurde. Uns ja gesagt, nicht
objektorientiert. Wusste ich gar nicht.
Ich bin nicht so n Jo Cocoder. Weiß ich nicht.
Unsere Sprache tatsächlich. Ja, fand ich.
Aber spannend, dass es so ist. Aber mal angenommen ne, wenn man
jetzt davon ausgeht, es gibt. Bist jetzt in der in der
Möglichkeit zu sagen, ob jetzt sozusagen objektorientierung in
der Sprache möglich ist oder nicht.
Sagen wir mal beides geht ne, dann wäre ja die Frage, wann
nimmt man was. Ja.
Eine sehr gute Frage. Und da liegt auch die
Schwierigkeit drin und deswegen die Anmerkung auch nochmal an
mich selbst, weil das ist mir jetzt im Zuge der Folge wird mir
das auch immer klarer, dass man sich da wirklich hinsetzen
sollte und sich das gedanklich mal durchspielen sollte, um da
einfach eine gute Entscheidung zu treffen.
Weil. Man ja so instinktiv.
Ich weiß nicht, wie es dir geht, aber über die Jahre, die man
entwickelt, fängt man halt an. Du hast ne Problemstellung, du
fängst an Loszukurden und irgendwie so instinktiv
entscheidest du. Ja, das mache ich jetzt hier als
Datenstruktur. Oh nee, hier werde ich mir mal
ne klasse schreiben, womit ich denn Objekte erzeugen kann, weil
ich brauch da noch Logik mit drin und so weiter aber sich
gezielt Gedanken vorher zu machen ist das gerade der
richtige Weg oder ist das nur meine persönliche Practice, weil
ich das oft so mache? Das finde ich eigentlich ganz
spannend. Wie siehst du das?
Also ich habe auch auf jeden Fall schon.
Öfter jetzt. Dieses also bin ich oder nicht
öfter, ich bin da auch öfter mal doch schon öfter auch in der
Vergangenheit, sagen wir mal so, an den Punkt gekommen, wo ich
erstmal dachte okay, ich erstelle mir jetzt eine
Datenstruktur, so wie wir es gerade besprochen haben und bin
dann irgendwann an den Punkt gekommen, dass ich mir dachte,
okay, irgendwie bräuchte ich jetzt zum Beispiel eine
Funktion, die mir innerhalb dieser Datenstruktur bestimmt,
ob sie, weiß ich nicht zum Beispiel.
Gib mir mal ein Beispiel, aber die etwas Bestimmtes
herauskristallisiert. Wenn du zum Beispiel sagst.
Du hast vielleicht NNNN Punkt ne, wenn wir wir waren jetzt
beim Punkt und du willst jetzt überlegen OK ist dieser.in einem
bestimmten Bereich ne so keine Ahnung sagen wir mal in dem
grünen Bereich oder einem roten Bereich ne also jetzt im Sinne
von ist OK der Bereich oder nicht.
Dann fängst du das an und sagst OK, ich hab n Punkt, ich hab ne
Datenstruktur, die erstelle ich mir und jetzt komm ich dazu,
dass ich sage von außen ich hab jetzt diese Koordinaten und
überprüfe von außen. Ist dieser Punkt im Grünen oder
im roten Bereich? Ne, also in einem erlaubten
Bereich oder nicht so? Und dann ist ja die Frage, wenn
du das einmal machst, okay ist nicht so schlimm, lass es als
Datenstruktur da, jetzt kommst du aber irgendwann an den Punkt
wo du dir denkst, es muss sich an der Stelle im Code machen, an
der zweiten, an der Dritten, an der vierten oder fünften Stelle
im Code. Jetzt habe ich eine Menge Code
duplikationen wieso nehme ich mir nicht einfach genau diese
Funktion, pack sie in ich sag mal die Datenstruktur Beziehung
beziehungsweise Wandel diese Datenstruktur in eine in ein
Objekt um, weil dann könnte dieses Objekt nämlich einfach
eine Funktion haben. Sozusagen, sagt Okay du willst
mit diesem Punkt an eine Stelle gehen, aber kann ich das
überhaupt? Und deswegen hast du eine
Funktion, die du aufrufst und sagst, Disposition valid oder so
weißt. Du.
Und da ist dann natürlich offensichtlich die Überlegung im
Vorfeld nicht gut genug gewesen, weil das hätte man schon kommen
sehen können, weißte und solche ähnliche Situationen hatte ich
schon öfter mal gehabt, deswegen ist es gut, wie du meintest,
wirklich im Vorfeld darüber nachzudenken und um deine Frage
zu beantworten, hatte ich auf jeden Fall schon, dass man sich
denkt okay, ich mache das einfach manchmal so einfach.
Weil ich es immer so gemacht habe, aber eigentlich nicht
wirklich darüber nachgedacht habe.
Was brauche ich jetzt eigentlich wirklich oder was ist
perspektivisch ne auch wirklich sinnvoll?
Also es ist ja auch nicht fatal zu sagen, OK, ich refecte das
noch mal. Das gehört zur
Softwareentwicklung einfach dazu.
Da haben wir schon oft drüber gesprochen.
Aber das ist ein gutes Beispiel. Ich kann ja auch genau das
Gegenbeispiel bringen, wo ich dachte, ich brauche unbedingt
ein Objekt. Es reicht keine einfache
Datenstruktur aus. Bin aber zudem ich weiß nicht
mehr genau was es war. Also ich kann jetzt kein exaktes
Beispiel geben, aber am Ende war es so, dass ich im Prinzip.
Diese klassischen Getter und Setter hatte für die Attribute
innerhalb der Klasse, also für die Zuhörer und Zuhörer, die
jetzt nicht wissen, was ich damit meine.
Im Prinzip habe ich Funktion geschrieben, dass man die Werte
auslesen kann, also nach außen zur Verfügung stellt und setter,
dass man sie auch von außen verändern kann und dann kommt
man genau an den Punkt, dass man sich denkt okay, ich habe jetzt
ein Objekt, die intern Daten möchten.
Nicht zur Verfügung stellen. Aber ich habe Getter und netter
hat in der Regel ja denn n Rückgabewert mit Datentyp, das
heißt von außen. Stell ich ja doch sichtbar klar,
wie die interne Datenrepräsentation aussieht und
ich hab sogar noch setter, dass ich sie auch verändern kann und
dann bist du ganz klar an dem Punkt, dass man sagen kann, OK,
mach ne Datenstruktur, weil was bringt dir denn jetzt dieses
Objekt im Endeffekt meine Proxy? Funktion oder also?
Das ist so ne, das ist ne. Genau das ist so ne pseudo
abstrakte Abstraktion sage ich mal ne, also dass du sag ich mal
so ne so ne so einen abstrakten Grad einbaust, der aber
überhaupt nicht abstrakt ist, weil am Ende.
Kannst du komplett sehen, was darunter liegt und das ist halt
so das Gegenbeispiel, dass man sich denkt okay Objekt, warum
wolltest du jetzt unbedingt ein Objekt nehmen, das ist
eigentlich eine ganz klare Datenstruktur in deiner Software
gerade. Ja, das stimmt.
Ist ein gutes Beispiel auf jeden Fall und ich kenne das auch.
Das ist auch gerade so. Ich hatte auch zum Beispiel
schon mal so Momente, wo du genau solche Objekte hattest,
wie du meintest. Dann hast du eigentlich im
Endeffekt nur Getter und Setter. Und dann hatte ich sogar noch
den den Punkt, dass ich eigentlich NNN Objekt irgendwie
übertragen musste. Über n Interface ne, also wenn
du es dir vorstellen möchtest, zum Beispiel Front and back end
Kommunikation über Rest ne. Ja.
Also zwischen 2 Systemen meiner allgemeinen.
Kommunikation zwischen 2 Systemen dann wurde dann Objekt
übertragen und im Endeffekt hast du oder hatte ich dann den den
Fall, dass ich quasi so n Objekt hatte, aber so n Objekt ist es
immer n bisschen. Komplizierter unter Umständen
sowas zu übertragen, oder? Eigentlich willst du halt nur
ganz plane Datenstrukturen übertragen über solche Interface
ne. Du willst ja auch nicht.
Funktionen drin haben oder sonst was.
So, und da gibt es zum Beispiel auch sogenannte DTOS, ne Data.
Du hast es in deinem Satz ja schon verwendet, das Wort
Datenstruktur, weil das n ganz klares Beispiel ist für verwende
Datenstrukturen. Genau die t os das Stichwort
sorry ich wollte dich nicht unterbrechen.
Und im Endeffekt habe ich dann quasi dieses Objekt in dieses
Dto umgewandelt, um es dann sozusagen zu übertragen.
Und dann dachte ich mir auch, so, was ist hier eigentlich los?
Also macht an manchen Stellen natürlich Sinn, wenn du wirklich
ein Objekt brauchst und willst dann gewisse Daten davon
übertragen, dass du dir denn dafür ein Dto anlegst, weil wie
gesagt, das ist ja ein Best Practice, diese dt.
Os zu verwenden, weil du einfach eine definierte Schnittstelle
denn hast zwischen den Systemen. Das heißt du weißt genau, was du
senden sollst und das andere System weiß genau, was zu
empfangen ist. Und diese dt.
Os, die du so sagst sind halt sehr flache Datenstrukturen.
Wirklich nur Daten und das ist halt komplett ersichtlich was da
gesendet wird. Genau also.
Von der Repräsentation her gemeint, jetzt ja find ich cool.
DTOS sind ein fantastisches Beispiel für Datenstrukturen.
Auf jeden Fall. Genau, aber jetzt lass uns noch
mal vielleicht n bisschen gucken, dass wir sagen, OK, wann
ist denn zum Beispiel was wirklich sinnvoll?
Ne, also man kann sich ja hinstellen und sagen, ja gut, du
hast vielleicht manchmal Datenstrukturen, du brauchst
vielleicht. Objekte aber was ist denn jetzt
zum Beispiel, also wie stehen die zum Beispiel so im Gegensatz
zueinander und wieso sollte man zum Beispiel das eine so
verwenden und das andere so weißt du was ich meine?
Ja oder brauchst du? Input für diese Frage.
Vielleicht waren sie sehr allgemein.
Ich muss aber wirklich mal kurz drüber nachdenken.
Also was einem oft begegnet ist. So diese also, dass es oft so
antisemitisch genannt wird, was auch?
Sinn macht also ich find das ist n bisschen schwierig zu greifen,
aber es macht am Ende wirklich Sinn, dass du sagst, eigentlich,
wenn man das mal ganz nüchtern betrachtet, sind sie komplett
gegensätzlich. Haben wir ja auch schon gesagt.
Datenstrukturen haben ne Offenlegung der internen Daten
und keine Funktionalität, sind halt reine Datenrepräsentation,
ein Objekt hingegen legt nicht die Daten offen, bietet aber
Funktionalitäten an, also es besitzt zum Beispiel eine
gewisse Businesslogik, wie du mit diesen Daten arbeiten
kannst. Das ist ja schon mal komplett
gegensätzlich. Die Frage ist, wie das jetzt
sich auf so eine gesamte Software auswirken kann, weil
das ist ja auch ein entscheidender Punkt.
Sage ich mal. Zu entscheiden, was brauche ich
jetzt oder was verwende ich, wenn man sich das bei Objekten
zum Beispiel anguckt, dann sind die natürlich hinsichtlich der
Implementierung in der gesamten Software ziemlich robust.
Das heißt, sie bilden eine Art Gekapselte Einheit.
Wobei der restlichen Software dann egal ist, wie die interne
Implementierung aussieht. Es gibt halt den funktioniert.
Wenn die bereitgestellt werden, und diese sind entscheidend, was
diese Funktion machen und die restliche Software arbeitet auf
diesen Funktionen. Das heißt du hast halt ne ne
sehr lose kapselung, also du hast keine hohen Abhängigkeiten
dazwischen im Best Case. Das ist natürlich.
Nen Vorteil bedeutet aber wiederum, dass du halt auch
nicht genau das definieren musst, wie zum Beispiel diese
Funktion aussieht. Das ist dann wieder.
Die die Schwierigkeit dabei, du musst halt genau sagen, OK pass
auf, der Rest der Welt ist egal wie meine interne Verwaltung der
Daten aussieht, aber ich gewährleiste euch, dass die
Funktion XY euch Werte in diesen.
Datentyp in dieser Formatierung gibt zum Beispiel das Bankkonto
noch mal, dass sie in Euro wert als Gleitkommazahl kriegt und
nicht auf einmal Cent Beträge und die das restliche System
denkt sich verdammt. Wir sind reich.
Nein. Aber weißt du also, das ist halt
wichtig an der Stelle, aber ansonsten kannst du intern dann
machen, was du willst. Ist halt n Vorteil bei den
Objekten. Ja, aber wie siehst du das?
Ja, aber was ist denn jetzt zum Beispiel?
Ich fand, ich fand ja dieses dieses eine Beispiel, wo wir
auch drüber gesprochen hatten mit diesem sag ich mal mit
Formen und dem Flächeninhalt, du hast ja zum Beispiel irgendwie
ein Quadraten, Rechtecken, Dreiecken, Kreis, hast ja
unterschiedliche Berechnungsformeln dafür und du
kannst natürlich sagen okay, ich hab weiß ich nicht.
Länge ne Höhe oder Volumen Flächen was auch immer ne was du
da nehmen möchtest. Du kannst ja wie ich ja auch zum
Beispiel schon mit diesem Punktbeispiel meinte ne wenn man
das ist ja im Endeffekt alles das gleiche in Grün.
Du kannst von außen bestimmte Sachen berechnen und checken, ob
irgendwie was. Irgendwie funktioniert also du
kannst ja bei dem bei den Punkten kannst du sagen, bin ich
im richtigen Bereich, du hast nur die Koordinaten und kannst
das von außen sozusagen checken, das heißt du nimmst dir deine
Datenstruktur und arbeitest mit den Werten und Berechnest daraus
sozusagen irgendwas, was du dann mit dem du weiter arbeitest.
Genauso kannst du ja. Bei einem Rechteck sagen oder
bei einem Quadrat oder was auch immer okay ich habe meine
bestimmten Attribute, zum Beispiel ich habe Länge, Breite
oder radius, wenn es ein Kreis ist.
Und damit kann ich halt eben mit diesen Attributen außerhalb
bestimmte. Berechnungen anstellen, was auch
immer. Du kannst natürlich auch sagen
okay warte mal. Ich habe jetzt aber 5
verschiedene, also 5 verschiedene Formen und möchte
aber für jede Form irgendwie. Sag ich jetzt mal nen dieses
diese Fläche berechnen ne dann könnte man ja sagen OK lass uns
doch da vielleicht n Objekt draus machen ne um zu sagen ja
ich hab ein Objekt x und gib mir mal von Objekt x das Volumen die
Fläche fragt mich nicht so. Da ist natürlich die.
Frage OK, was macht Sinn oder beziehungsweise.
Warum macht? Irgendwas mehr Sinn als das
andere weißt du, weil du könntest dich natürlich
hinstellen und sagen, Na gut, OK, ne, was, was ist denn wenn
du jetzt sagst ich möchte jetzt ne neue Form hinzufügen, ne was
bietet sich dann zum Beispiel an an der Stelle?
Ja. Also um dieses geometrische
Beispiel mal aufzugreifen, wenn du sagst, OK, wir haben einfach,
wir wollen einfach verschiedene geometrische Formen abbilden,
dann bist du ganz klar auf der Datenstrukturseite, weil wie
gesagt, das sind einfach Daten. Punkt hat XY.
Ein Quadrat hat halt ja einen Punkt und dann eine Seitenlänge,
das reicht ja schon aus, um das Quadrat aufzuspannen und so
weiter das heißt du kannst dann über Datenstrukturen deine
geometrische Form abbilden. Wenn du jetzt aber dein Beispiel
was du meintest, wo du dann gemerkt hast, Hey Moment mal,
mit dieser Datenstruktur komme ich nicht weiter, das ist ja
wirklich ein gutes Beispiel gewesen, an dem Punkt kommst,
dass du sagst, Hey, ich möchte jetzt aber für sämtliche
geometrische Formen. Berechnen, ob Sie innerhalb
eines Bereiches im Koordinatensystem liegen.
Dann kannst du natürlich sagen, ich schreib jetzt sonder von
außen so ne Check Funktion und prüfe bist du n Punkt.
Wenn ja dann muss XY drin sein bist du n Quadrat da muss ich
gucken ob dein Startpunkt drin ist und die Seitenlängen nicht
herausragend aus diesem Bereich also das heißt da merkst du ja
schon ich habe jetzt verschiedene Implementierungen
für diesen Check um sagen zu können ja du bist im Bereich
oder nicht und. Da wird es dann, sag ich mal
schon tricky, dass man sich sagen kann, Moment mal,
vielleicht machen wir jetzt hier Objekte draus und.
Geben diesen geometrischen Formen Funktion, die das
übernehmen, weil dann kannst du ja sagen, jede geometrische Form
implementiert selbst diesen Check für sich, passend zu der
internen Datenrepräsentation. Das das ist halt so der Punkt
denn dabei. Weil wenn ich das nicht mache
bedeutet, kann ich zwar, ich sag mal.
Relativ. Schnell neue Funktionen
hinzufügen, ne, also sowas wie Checkmops im Bereich ist, oder?
Ja, jetzt fällt mir kein anderes Beispiel ein.
Check mal, ob es nicht im Bereich ist.
Ist jetzt blöd. Ob zum Beispiel ne gewisse der
Flächeninhalt, nehmen wir doch mal den Flächeninhalt so ne,
dass du sagst OK oder berechne mal den Flächeninhalt, dann kann
ich natürlich schnell diese Funktion, wenn ich jetzt auf
Datenstrukturen arbeite hinzufügen und sagen okay pass
auf, ich mache jetzt eine Funktion Flächeninhalt beim
Punkt okay geschenkt, beim Quadrat berechne ich das, beim
Dreieck berechne ich das mit den entsprechenden Formeln ok, aber
wenn sich die Datenstruktur ändern.
Wird tricky, weil. Du dann sämtliche Funktionen
anrühren musst. Ja genau das ist.
Ja, im Endeffekt genau dieser Trade off.
Weil andersrum, und das ist wieder das ist dieses
asymmetrische dabei, wenn ich es mit Objekten mache, hat jedes
Objekt ja für sich selbst die Implementierung vom
Flächeninhalt und dann tangiert es zum Beispiel den Kreis nicht,
wenn sich am Rechteck was ändert.
Ja, ja, ist. Auf jeden Fall noch mal gut, es
war jetzt n. Bisschen mathematisch.
Ich hoffe man konnt das verstehen, aber das ist im
Prinzip ja auch genau der Trade, auf den du hast, ja.
Genau das sind. Halt genau die Punkte, wo man
natürlich wie du meintest. Man kann.
Im Nachfolgenden kann man immer noch refect, dann ist ja kein
Problem, nur wenn man im Vorfeld schon merkt oder bestimmte sag
ich mal Anwendungsmöglichkeiten oder erahnt, dann sollte man
dann hat man halt auch theoretisch einfach schon die
Möglichkeit von Grund auf schon mal in die richtige Richtung zu
entwickeln oder in die sagen wir mal in die passende Richtung für
das entsprechende. Entsprechende Anwendungsfall.
Ich finde man kann da ja auch. So ein bisschen eine kleine
Faustformel, wie man so schön sagt.
Ansetzen oder verwenden? Wenn ich mir überlege, was
möchte ich abbilden? Und merke, dass.
Das Verhalten im Vordergrund steht also schon.
Ich weiß eigentlich schon, es geht eigentlich um die
Funktionalität dahinter. Ja.
Und. Diese Funktionalität kann sich
auch zum Beispiel häufig ändern, sich weiterentwickeln, dass ich
dann eher auf objektseite bin, dass ich das halt wirklich für
mich Kapsel und mit festen Schnittstellen arbeite und der
Außenwelt ist dann egal, wie diese Datenrepräsentation da
drin außen sieht, drin aussieht, man hat dann einfach quasi feste
Schnittstellen. Du hast zum Beispiel jetzt
wieder das den. Bank Account, wo du nicht weißt,
ob du nächstes Jahr die gleichen Zinsen hast wie dieses Jahr.
Und das kannst du halt super in dieses Objekt reinkapseln und.
Von außen wollen trotzdem. Die Leute weiter einzahlen und
Geld abheben. Exakt.
Und bei Datenstrukturen kann man sagen, OK, wenn ich zum Beispiel
auf gleichen Daten, also wenn diese Datenrepräsentation sich
nicht ändert, ich aber viele Operationen darauf ausführen
möchte, dass dann halt die also. Für diese Datenrepräsentation
eine Datenstruktur wohl die bessere Wahl ist, weil jetzt
halt keine eigene Logik dahinter gibt, sondern man einfach nur
mit diesen Daten arbeitet. Ja deswegen.
Zum Beispiel bei Schnittstellen zwischen System die tos, weil es
wird immer dieser Austausch sein und wenn da eine Anpassung
gemacht wird, dann geht das Halt relativ.
Simpel an der Stelle. Klar kann sich das ein bisschen
durchs System, das ist dann wieder Designsache am Ende, aber
ich weiß, ich hab ne Datenstruktur, die wird
übertragen und da sind folgende Daten drin und die Gegenseite
empfängt die ja. Ja, find ich gut.
Das merken wir also jetzt. Funktion ja, dann Datenstruktur.
Nee. Und so weiter.
Aber pass auf. Folgender Vorschlag, Das hatten
wir ja so am Anfang n bisschen bequatscht und damit würd ich
gern die Folge beenden. Lass uns doch n ganz kleines
Quiz machen. Für alle Zuhörerinnen und
Zuhörer. Das so als Lernkontrolle klingt
übertrieben, aber es ist halt mal spannend, wie jeder für sich
entscheiden würde und vor allem, falls ihr euch gleich anders
entscheidet als der jeweilige, der die Frage gestellt bekommen
hat, dann lasst uns das gerne per Mail oder auf den
Plattformen zukommen, weil das würde uns gerne interessieren,
weil das ist natürlich diskussionspotenzial hoch 10
jetzt. Wir stellen uns jetzt
gegenseitig. Mal so ein 2 Fragen und dann
gucken wir mal und. Ihr könnt auf jeden Fall auch
mitraten. Okay hast du hast.
Du hast du denn eine Frage? Ich habe eine ich.
Habe mir schon was überlegt und zwar wenn du dir jetzt sagst
okay pass auf, du entwickelst jetzt irgendwie eine Anwendung.
Sagen wir mal auf einer ganz hohen Metaebene im Uni Bereich
und Du möchtest zum Beispiel Daten von Studenten speichern
oder Studentinnen beides. Mhm.
Was? Würdest du für ne Datenstruktur
an dieser Stelle nehmen? Ne?
Also wenn du jetzt so bestimmte ne zum Beispiel Name,
matrikelnummer, ne. Welche Kurse da.
Gesucht werden. Was würdest du da?
Nee, würdest du da eher eine Datenstruktur nehmen oder
würdest du eher ein Objekt nehmen?
Also. Deiner Erklärung, das ist
ähnlich wie das Personenbeispiel, was ich vorhin
genannt habe, würde ich erstmal zu einer Datenstruktur neigen,
weil es klingt so, dass ich einfach.
Eine Repräsentation eines Studenten einer Studentenperson,
weil ich denke mal so Geschlecht oder so wird ja dann vielleicht
auch darin abgebildet. Sein, das ist eine reine
Repräsentation, ist erst mal um diese Entität abbilden zu
können, und da wäre ich jetzt gerade bei einer Datenstruktur,
ja. Es sei denn.
Diese Personen können denn aktiv irgendeine Logik noch
beinhalten, dann wird es dann. Shiften wir ja vielleicht wieder
zum Objekt rüber, aber aktuell würde ich sagen, ist das ne
Datenstruktur, ja. Also würde ich auch erstmal
soweit mitgehen und sagen ne, wenn wir jetzt wirklich diese
Daten speichern. Macht das als Datenstruktur auf
jeden Fall Sinn mit? Dem.
Kleinen Anmerksel, dass man vielleicht sagen könnte, OK,
wenn man jetzt aber sagt, ne zum Beispiel sowas hat wie.
Sind denn quasi. So und so viel.
Also ne irgendwie keine Ahnung, ist der Kursplan komplett ne,
weil zum Beispiel die Kurse noch drin stehen und du hast dann
sowas wie ja oder nein. Du kannst zum Beispiel darüber
dann gucken, ob n Student sozusagen oder ne Studentin
wirklich alles richtig also eingetragen hat, die
entsprechenden Kurse und so weiter richtig belegt hat und so
weiter dann wäre es natürlich wieder funktional.
Aber ja. Okay ja, Cooles.
Beispiel? Ich würde dir jetzt noch ne
Frage stellen und zwar würde ich das Bankthema mal erweitern.
Jetzt geht es los. Stell dir vor, du programmierst
jetzt dazugehörig eine Banking Anwendung, ne Banking App zum
Beispiel. Und.
Sollst jetzt implementieren, dass du für Konten feststellst,
ob Transaktionen korrekt ausgeführt werden, ob der
Zugriff auf kontoinformationen valide ist, also so
Sicherheitschecks und das ganze Validieren.
Wie würdest du das jetzt machen? Also für mich ist das.
Auf jeden Fall eine sehr hohe funktionale Sache, also würde
ich da wahrscheinlich auf jeden Fall irgendwie eine Art von
Objekt nutzen, weil du kriegst ja bestimmte Daten rein ne und
musst dann validieren anhand des entsprechenden Kontos
vielleicht, ob zum Beispiel die Daten, die du dann bekommst für
dieses Konto sage ich jetzt mal auch wirklich valide sind, ob
das funktioniert oder nicht, und dann kriegst du ja sozusagen
Daten rein, dann hast du Funktionen, die sagen, das
passt, das passt nicht, das ist gut, das ist schlecht.
Und würde ich sagen, das sollte man vielleicht dann eher mit
einem Objekt, gehe ich auf jeden.
Fall mit. Ich merke, ich habe das Beispiel
ziemlich umfangreich gemacht, aber wenn wir jetzt mal nur
einen Punkt davon nehmen zum Beispiel.
Eine Validierung zu machen von Kontoinformationen oder so.
Wenn wir jetzt sagen okay, wir haben jetzt so ein Validata.
Dann ist das halt wirklich ein Objekt, weil es dir von außen
eigentlich. Egal ist, wie das validiert
wird, auf welchen Daten das validiert wird, wie überhaupt
das passiert. Für dich ist wichtig die
Funktion dahinter du möchtest wissen, war dieser Zugriff
valide oder nicht und diese Funktion möchtest du von außen
haben und das spricht halt ganz klar für einen Objekt sozusagen.
Ich finde das auch immer. Schön, wenn man zum Beispiel so
überlegt, dass man irgendwie eine irgendein Objekt hat.
Wo sage ich jetzt mal so eine Art Passwort hinter ist.
Und du willst ja zum Beispiel dieses Passwort, willst du ja
gar nicht nach außen hin zugänglich machen, das ist da
drin gespeichert, du musst vielleicht sagen okay stimmt
dieses Passwort überein oder nicht, sozusagen habe ich diesen
Zugriff, ja nein, aber du willst ja zum Beispiel nicht sagen, was
ist denn das Passwort oder ich setze mir mal eben mal schnell
ein neues Passwort sowas. Ja, cool.
Dann habe ich noch eine zweite Frage.
Ok. Genau und alle wieder mitraten.
Stell dir mal vor, du entwickelst ne Wetter App ne und
du möchtest zum Beispiel täglich für eine Analyse vielleicht
später möchtest du dir jetzt irgendwie höchst und
Tiefsttemperaturen speichern. Ne die zum Beispiel weiß ich
nicht über. Immer eine Woche oder egal wie
lange ne. Was würdest du da an der Stelle
dann zum Beispiel nehmen? Würdest du eher ne Datenstruktur
nehmen oder ein Objekt? Ich bin mir nicht sicher.
Ob ich das Beispiel richtig verstanden habe?
Also geht es darum einfach. Hoch und Tiefstwert zu
speichern. Genau.
Das wäre jetzt für mich. Ne Datenstruktur, wenn es darum
geht, aber irgendwie auf den Wetterdaten nachher max und min
und alles zu berechnen, dann gehen wir halt eher in die
Richtung Objekt. Deswegen Weih ich mir jetzt
nicht sicher, ob ich es richtig verstanden hab, deswegen hab ich
da gesagt. Im Anschluss kann man ja dann
noch gucken, sozusagen. Aber erstmal hast du ja erstmal.
Hast du nur die Speicherung von diesen Werten und.
Da glaube ich, sind wir uns einig.
Das ist auf jeden Fall ein gutes Beispiel für den Datenschutz zu
verwenden. Pass auf.
Dann. Auch noch ein Beispiel für ein
Beispiel, eine Frage für dich. Dann haben wir 4, das ist,
glaube ich, ein ganz Gutes, eine gute Anzahl an Quizfragen.
Stell dir folgendes Szenario vor.
Du arbeitest an einem E Commerce System und sollst jetzt.
Eine Funktionalität ergänzen. Dass wenn der User Artikel zu
einem Warenkorb hinzufügt. Dass geprüft wird, ob überhaupt
der Lagerbestand ausreichend ist.
Oder ZB. Ob ein gültiger Rabattcode
verwendet wird und dementsprechend der Preis
angepasst werden muss. Was, was würdest du machen?
Instinktiv. Instinktiv.
Würde ich einfach. Mal sagen.
Ich würde da. Nicht ne Datentruppe.
Ich würd ein Objekt nehmen. Da das Objekt.
Ja. Also.
Wär ich auch bei dir, weil das klingt jetzt einfach schon nach
nach Logik. Halt ne, also allein schon
deswegen hab ich jetzt das mit der Rabattberechnung auch noch
mal gesagt, weil das klingt ganz klar nach Logik, Lagerbestand
wäre vielleicht noch so ein Diskussionspotenzial, wenn jetzt
die Datenstruktur beinhaltet, wie viele davon drin sind, da
kann man ja auch wieder drüber streiten, aber angenommen die
Datenstruktur beinhaltet den Typ und die Anzahl kann man ja auch
sagen ja okay. Rechnest du halt -1 da drauf.
Blöd gesagt, aber wenn du halt wirklich anfängst da komplexe
Logik einzubauen, dann sollte man das ganze Objekt in einem
Objekt Kapseln, ja. O.
K cool. Würde ich sagen, haben wir das
doch ausführlich besprochen. Es hat mir wieder mal sehr viel
Spaß gemacht. Danke dafür, fabi, ich mag
unsere cleancode Reihe, weil es einfach selbst einen auch immer
noch mal trägert darüber nachzudenken, ja, das hilft.
Und. Deshalb, liebe zuhören, liebe
Zuhörer, falls du Anmerkungen zu der Folge hast oder Feedback
oder auch zu unseren Quizfragen am Ende deshalb noch mal der
Aufruf, melde dich gerne bei uns gerne über die Podcast Mail oder
über unseren anderen Plattformen, die links und auch
die Mail findest du wie immer in den Shownotes.
Ansonsten würden wir uns. Freuen, wenn du natürlich so ein
234 x Personen diesen Podcast weiter empfiehlst.
Falls er dir gefällt. Das würde uns sehr helfen und
uns auch sehr freuen ansonsten. Würde ich sagen, ja, hören wir
uns alle beim nächsten Mal wieder und bis dahin noch einen
schönen Tag deine Coding Boys gemeinsam.
Besser.