Transcript: Python 3.9 und Design Patterns (Teil 1)

· Back to episode

Full episode transcript. Timestamps refer to the audio playback.

Dominik

Ja, hallo liebe Hörerinnen und Hörer, willkommen beim Python-Podcast, 25. Episode.

Dominik

Heute geht es um Patterns, Software-Patterns, Design-Patterns, Architektur-Patterns.

Dominik

Und wir haben einen Gast dabei, der Antoni, hallo.

Dominik

Hallo mal wieder.

Dominik

Hallihallo.

Dominik

Ich bin der Dominik, Jochen ist auch da.

Dominik

Hoiho.

Dominik

Wir sind im Wintergarten, beziehungsweise remote, wie es halt sich für die Pandemie so gehört.

Dominik

Wir wollten noch sagen, wenn wir aufnehmen, heute ist der 20. Oktober.

Dominik

2020.

Dominik

20, 20, 20, 20, 20.

Dominik

Immer noch 2020.

Jochen

Ja, es zieht sich ein bisschen, finde ich, in letzter Zeit.

Christian

Ich erinnere den XKCD, wo ein Zeitreiser nach 2020 kommt

Christian

und fragt, welches Jahr es ist, und er sagt 2020.

Christian

Ja, aber das wievielte.

Christian

Das wissen wir auch nicht so ganz genau.

Dominik

Ja, vielleicht noch ein paar News aus der Szene vorweg.

Jochen

Genau, ja, was haben wir denn an News?

Dominik

5. Oktober kam Python

Dominik

3.9.0.

Jochen

Oder war das am 6.? Ich weiß gar nicht

Jochen

mehr genau. Ich glaube an dem Montag irgendwie.

Jochen

Ja.

Jochen

Watch released

Jochen

on October 5th. Oh, okay.

Jochen

Ja.

Jochen

Habt ihr alles schon geupdatet? Nein.

Dominik

Ich habe mich diesmal nicht getraut, weil letztes Mal

Dominik

mir bei 3.8.0 so ein paar Sachen

Dominik

wie Jupiter auseinander geflogen sind.

Dominik

Und ich diesmal darauf keine Lust hatte.

Dominik

Ich glaube, ich habe es auch noch nicht

Christian

bei uns in die Auswahl

Christian

mit reingenommen, aber wir haben eh immer sozusagen

Christian

das komplette Portfolio von allem

Christian

verfügbar.

Christian

Ja, ich habe

Dominik

überlegt, wir machen das bei 1 dann, bei 3, 9, 1.

Dominik

Ja, ich bin tatsächlich

Jochen

schon quasi zumindest mit den privaten

Jochen

Sachen umgestiegen, aber

Jochen

das wird natürlich noch ein bisschen

Jochen

brauchen, bis sich das komplett

Jochen

durchgesetzt hat,

Jochen

sodass man es halt auch verwenden kann. Zum Beispiel Pandas

Jochen

gibt es halt noch keine Binarys

Jochen

und da ist das natürlich auch so ein bisschen

Jochen

hässlich, wenn man das irgendwie dann selber kompilieren

Christian

muss. Das heißt doch, im Baton

Christian

habe ich tatsächlich das in die

Christian

Travels-Liste schon mit aufgenommen.

Christian

Da kam auch

Christian

jemand vorbei, der sich gleich

Christian

irgendwie sofort beschwert hatte, dass es unter 3.9

Christian

nicht ging, weil

Christian

irgendwas ist rausgeflogen.

Christian

Achso, die haben im Async

Christian

irgendeine

Christian

API, die deprecated war, jetzt tatsächlich gestrichen

Christian

gehabt. Ich glaube, die in 3.7 hatten sie

Christian

irgendeine neue API, um alle

Christian

Pending-Tasks abzufragen

Christian

eingeführt

Christian

und die, glaube ich, in irgendein Untermodul verschoben

Christian

oder so, statt im direkten

Christian

Async-Modul. Das war was, da musste ich dann irgendwie

Christian

hinterher und in 3.9 war dann irgendwie die

Christian

Abwärtskompatibilität von der API jetzt weg.

Christian

Da flog es dann auseinander.

Christian

Ja.

Christian

Insofern, ja, ich habe es schon mal in der Hand gehabt, weil ich was

Dominik

Was gibt es denn Neues?

Dominik

Ganz viele spannende

Dominik

Sachen. Union Operators?

Dominik

Was ist das?

Dominik

Was macht man damit?

Dominik

Ja, zum Beispiel Dictionaries zusammenschübbeln.

Jochen

Ja, ich glaube also wirklich mehr als das,

Jochen

was man vorher auch schon mit Tuple-Unpacking machen konnte.

Jochen

Also man schreibt halt irgendwie neuer Key, neuer Value

Jochen

und dann sagt dann hinten der Sternstern irgendwie das andere Dict,

Jochen

was man merchen will.

Jochen

So, ich glaube, wenn man jetzt den Pipe-Operator verwendet,

Jochen

macht es so mehr oder weniger genau das Gleiche.

Jochen

Ja, aber warum macht man das?

Jochen

Also ich habe es nicht genau verstanden.

Jochen

Ich finde es irgendwie, weiß nicht,

Dominik

das ist das Erste, was ich bei Python so richtig hässlich fand.

Jochen

Naja, was fandst du hässlich?

Dominik

Ja, diesen Operator, diesen Pipe-Operator

Dominik

da stehen zu haben auf einmal für so eine Operation.

Dominik

Och, ich weiß nicht.

Jochen

Ich meine, das wäre halt Mengen-Operations-

Jochen

Operator an der Stelle.

Jochen

Es ist halt ein Oder.

Jochen

Ja, das passt schon.

Christian

Das war ja vorher schon immer das Oder

Christian

und wenn ich halt über die mengentheoretische

Christian

Definition nachdenke,

Christian

dann ist das halt genau das, was passiert,

Christian

wenn ich halt die Oder-Verknüpfung von zwei

Christian

Mengen irgendwie definieren möchte.

Dominik

Oder gleich dieses

Dominik

Assignment, irgendwie ist das komisch.

Dominik

Naja, das ist halt so wie plusgleich oder

Dominik

malgleich.

Christian

Das habe ich tatsächlich in Bato benutzt

Christian

oder gleich tatsächlich, auch Bato hat ja so eine

Christian

komische Syntax, wo wir plusgleich

Christian

benutzen, wo du

Christian

so einen Baum aufbaust mit self

Christian

plusgleich und dann den Kindknoten

Christian

und da gibt es nochmal

Christian

ein Overloading für die Pipe,

Christian

wo man dann sozusagen eine spezielle Form

Christian

von Verkettung hat. Insofern finde ich das

Christian

ganz cool, dass die jetzt auch die Pipe genommen haben.

Christian

fühle ich mich in meiner Wahl von vor

Christian

sechs Jahren bestätigt.

Christian

Ja.

Christian

Ja, also ich glaube,

Christian

also so, was

Jochen

es halt, es sieht halt, ich finde, es sieht schon besser

Jochen

aus, als wenn man jetzt immer mit den Sternen und Sternsteinen, da muss man

Jochen

mal so ein bisschen nachdenken, was denn jetzt,

Jochen

was man jetzt eigentlich genau machen

Jochen

wollte. Es ist ein bisschen hübscher,

Jochen

aber es ist jetzt keine so weltbewegende

Jochen

Änderung.

Jochen

Ja, das ist hübscher.

Christian

Und es ist vor allem, es erzeugt halt ja ein neues Dignam.

Christian

Also ganz

Christian

klassisch war ja immer das Thema, dass du

Christian

DictUpdate sagst.

Christian

Ja, und dann macht das

Christian

was anderes, als man denkt. Das modifiziert

Christian

den Original-Dict und genau.

Christian

Ja.

Christian

Ja.

Jochen

Insofern ist vielleicht ein bisschen eindeutiger, was es macht.

Jochen

Ja, also

Jochen

mein Lieblingsfeature tatsächlich, oder

Jochen

meine Lieblingsneuerung ist

Jochen

der Pack-Parser. So ehrlich gesagt bin ich jetzt

Jochen

kein Experte

Jochen

für so Parser-Geschichten, aber ich fand das schon eigentlich

Jochen

ganz nett,

Jochen

was man damit dann eventuell alles dann

Jochen

zusätzlich so machen kann. Also

Jochen

es hieß irgendwie so, ja,

Jochen

das macht dann irgendwie neue Sprachfeatures einfacher

Jochen

oder so. Das stimmt nicht so ganz.

Jochen

wirklich viel einfacher wird dadurch nicht,

Jochen

aber es macht halt so ein paar Sachen, die bisher sehr hässlich

Dominik

waren. Du musst uns den Hörer nochmal kurz erklären, was überhaupt

Dominik

ein Pack-Parser ist, bitte. Oh nein!

Jochen

Das wollte ich eigentlich vermeiden.

Jochen

Das kann ich ehrlich gesagt nicht wirklich.

Jochen

Also es gibt halt diese Standard-

Jochen

Parser für so

Jochen

Programmiersprachen. Also die meisten Programmiersprachen

Jochen

sind halt, oh, oh je, jetzt kann man

Jochen

nochmal positiv in die Informatik

Jochen

hinabsteigen.

Jochen

Da gibt es halt so, so Programmiersprachen

Jochen

sind meistens, die Grammatiken dafür sind so

Jochen

kontextfreie Sprachen.

Jochen

Also, oh je.

Jochen

Ja, ja, genau.

Jochen

Ja, du musst halt

Jochen

eine bestimmte

Jochen

Form davon, so

Jochen

LR1-Grammatiken oder so, das ist halt

Jochen

LR1,

Jochen

LR1-Grammatik zum Beispiel.

Jochen

LR1-Grammatik.

Jochen

Ja, also in dieser Form ist auch zum Beispiel immer die Java-Sprachspezifikation. Das ist das Erste, was ich in, sollte man sich im Studium, als ich mal angefangen habe, irgendwie sollte man sich das mal kaufen. Habe ich dann gemacht, fand ich sehr langweilig, ehrlich gesagt. Das war ein sehr dickes Buch, in dem stand halt die komplette Sprache und halt Grammatik drin. Und da dachte ich schon, das ist eine komische Abkürzung und das ist halt genau die, die halt beschreibt, ja, wie die Grammatik für diese Sprache aussieht.

Jochen

Und wenn man das sozusagen

Jochen

in dieser Form notiert hat, dann kann man das in einen

Jochen

Parser-Generator werfen

Jochen

und dann... Der liest die Sprache und weiß, was

Jochen

der machen muss. Der gibt einem dann

Jochen

einen Parser, der genau diese Sprache

Jochen

akzeptiert.

Jochen

Und das sind dann so Dinge wie...

Jochen

In letzter Zeit habe ich da wenig mit zu tun gehabt.

Jochen

Früher ganz mehr.

Jochen

Sowas wie YAK zum Beispiel

Jochen

gibt es da.

Jochen

Ist auch so ein rekursives Akronym.

Jochen

Justiner sagt Compiler, Compiler.

Jochen

Dem kann man

Jochen

sowas vorwerfen und der spuckt dann halt

Jochen

einen Parser aus und das gab es dann

Jochen

Lex und Bison und

Jochen

ich weiß gar nicht mehr so genau.

Jochen

Und genau, damit kann man

Jochen

Parser generieren und die akzeptieren

Jochen

dann solche Sprachen und die meisten

Jochen

Programmiersprachen sind halt so irgendwie diese

Jochen

Geschmacksrichtung von kontextfreier

Jochen

Sprache.

Jochen

Und Python Parser

Jochen

war halt auch sowas.

Jochen

Aber

Jochen

das Problem ist, es gibt halt so ein paar Features,

Jochen

die passen da nicht so richtig rein.

Jochen

Oder ein paar Dinge in der Sprache, die funktionieren damit halt nicht so richtig.

Jochen

Und deswegen gab es da sowieso schon immer so Ausnahmen.

Jochen

Und deswegen ist es halt bisher so ein bisschen hässlich gewesen.

Jochen

Also es gibt zum Beispiel, ich kriege das auch nicht alles auf die Reihe,

Jochen

aber es gibt halt den, der Parser nimmt halt sozusagen den Text,

Jochen

also irgendwie ein Python-Programm und gibt dann halt ein Abstract-Syntax-Tree aus.

Jochen

Und der wird dann von dem Compiler verwandelt in Bytecode oder so.

Jochen

Und da wird dann halt irgendwie interpretiert.

Jochen

Und das gibt dann halt so diverse Teile.

Jochen

Und

Jochen

das Problem ist irgendwie, dass manche

Jochen

Sachen halt

Jochen

verteilt sind auf unterschiedliche Teile.

Jochen

Also dass es halt nicht so ist, dass es

Jochen

oder der Parser bisher,

Jochen

da bestimmte Sachen halt nicht so einfach damit parsbar waren.

Jochen

Und der ist auch handgeschrieben.

Jochen

Wenn man sich das angucken will,

Jochen

gibt es ein Modul, das nennt sich

Jochen

ast.c oder so

Jochen

in Python Source Code,

Jochen

dass der alte Parser

Jochen

paar tausend Zeilen handgeschriebenes C

Jochen

ziemlich fies. Also

Jochen

genau. Und

Jochen

der ist halt nicht automatisch generiert,

Jochen

was halt schon mal nicht so schön ist, weil das

Jochen

halt dazu führt, dass er nicht so richtig

Jochen

konsistent ist und so und sich manchmal komisch

Jochen

verhält. Und

Jochen

das Problem eigentlich

Jochen

dabei ist, wenn man jetzt sozusagen

Jochen

teilweise sind halt Sachen,

Jochen

ich kriege das nicht mehr richtig auf die Reihe,

Jochen

wenn man zum Beispiel

Jochen

rechts neben dem Gleichheitszeichen,

Jochen

Weil das Gleichheitszeichen ist irgendwie ein Problem und wenn man da mehrere Sachen stehen hat, also mehrere Dinge, die addiert werden oder so, dann muss das hinterher nochmal im Compiler umsortiert werden, weil das der Parser noch nicht irgendwie ordentlich gemacht hat irgendwie.

Jochen

Und das heißt, wenn man jetzt irgendwie so ein Problem hat, auch ein Syntaxproblem, Funktion A plus Funktion B rechts von einem Gleichheitszeichen, dann ist halt komplett unklar, wenn jetzt da irgendwo ein Syntaxfehler ist, wo der eigentlich passiert.

Jochen

das ja dann schon einem erst im Compiler

Jochen

irgendwie um die Ohren fliegt oder so,

Jochen

sodass halt der einem

Jochen

sozusagen der Python-Interpreter auch gar nicht sagen kann,

Jochen

wo der Syntaxfehler ist, was halt eventuell

Jochen

ein Problem sein könnte. So, wenn man nicht mehr

Jochen

weiß, wo der Fehler ist, dann ist es halt schwer, den zu fixen

Jochen

und das sind halt so Hässlichkeiten,

Jochen

sodass man halt da diese

Jochen

Überprüfung, ist das jetzt korrekter Python-Code

Jochen

oder nicht, halt nicht an einer Stelle passiert,

Jochen

sondern halt über ganz viele Teile verteilt

Jochen

ist, ist das halt, sind manche Sachen

Jochen

halt einfach total hässlich und

Jochen

Und ich habe da so ein Podcast-Init.

Jochen

Da waren die beiden, die den Pack-Baser hauptsächlich gebaut haben,

Jochen

jetzt in Python 3.9 zu Gast und haben da halt so ein bisschen was erzählt,

Jochen

was sie da gemacht haben.

Jochen

Einer von denen meinte so, also eine User-Anfrage war halt so,

Jochen

warum können wir das in RIS-Context-Managern mit diesem RIS-Statement

Jochen

nicht einfach so machen wie bei Imports

Jochen

oder halt mit

Jochen

bei Strings, dass wir da Klammern drumrum

Jochen

machen und dann haben wir mehrzeilige Dinge, weil

Jochen

mehrzeilige With-Statements geht halt einfach nicht.

Jochen

Und

Jochen

das hat er dann versucht umzusetzen im alten Parser

Jochen

und das ging halt überhaupt gar nicht.

Jochen

Also er hat da irgendwie wohl eine Menge Sachen

Jochen

probiert und es ging einfach nicht.

Jochen

Und er meinte so, ja yes, jetzt geht

Jochen

es endlich, jetzt kann man das auch mit Klammern

Jochen

machen, das ist viel besser, voll gut.

Jochen

Obwohl das wahrscheinlich nie irgendjemand verwenden

Jochen

wird wahrscheinlich, aber

Jochen

ja, also

Jochen

aber das

Jochen

was jetzt oft erzählt wird

Jochen

ist halt irgendwie, dass man damit besser

Jochen

neue Sprachfeatures umsetzen kann oder so, das ist eigentlich

Jochen

nicht unbedingt der Fall, es ist halt nur so, dass es jetzt konsistenter

Jochen

ist, dass der Faser automatisch generiert

Jochen

wird und

Jochen

ja

Jochen

Ja, nee, also

Jochen

er braucht

Jochen

sogar mehr RAM. Ja, genau, also das

Jochen

war der Grund, warum man das früher nicht gemacht hat,

Jochen

weil man muss jetzt alle Tokens im Hauptspeicher

Jochen

halten und das war halt früher ein Problem.

Jochen

Heute nicht mehr so.

Jochen

Also genau, er braucht einfach

Jochen

mehr Rahmen. Irgendwer hatte

Christian

auch was erzählt von, dass sie jetzt per

Christian

Default sagen, also mehr als eine Million Zeilen

Christian

in einer passenden

Christian

Datei wollen sie jetzt bitte nicht mehr sehen.

Christian

Ja.

Christian

Oh Mist, was war ich denn jetzt?

Christian

Ja genau, da habe ich

Christian

eine ganze Firma drauf aufgebaut.

Christian

Ja,

Jochen

also von der Performance her

Jochen

ist kein großer Unterschied, sowohl von der Laufzeit

Jochen

und Hauptspeicher braucht es ein bisschen mehr.

Jochen

Aber genau, das ist das tolle Ding, was man

Jochen

eventuell jetzt damit machen kann.

Jochen

Was sonst sehr

Jochen

schwer geworden wäre, ist

Jochen

da gibt es auch ein PEP jetzt,

Jochen

weiß ich nicht welche Nummer, Pattern Matching.

Jochen

Bin mal

Jochen

gespannt, ob das angenommen wird

Jochen

für Python 3.10.

Jochen

Dass man halt so

Jochen

Lisp-Style-Makros hat, beziehungsweise

Jochen

in funktionalen Programmiersprachen ist das schon länger

Jochen

oder das ist halt ja so eins der grundlegenden

Jochen

Geschichten.

Jochen

ja, in Python ging das halt auch

Jochen

vor allen Dingen wegen dem Parser bisher

Jochen

nicht. Und das

Jochen

geht dann eventuell. Und wenn man das darin hat, ist es natürlich

Jochen

schon nett. Da hat man so eines der zentralen Features

Jochen

von funktionalen Programmiersprachen auch mit drin.

Dominik

Was sind denn Lisp-like-Makro?

Jochen

Ja, das müssen wir

Jochen

mal irgendwann machen, wenn wir irgendwie auch so ein bisschen

Jochen

so, ja, noch mal funktionalen Programmiersprachen

Jochen

und was ist Pattern-Matching und was sind Makros?

Jochen

Da können wir das nochmal. Aber ich glaube, das ist einfach

Dominik

Okay, das verschiebe ich auf eine folgende Folge.

Dominik

Für die Leute, die gucken wollen,

Dominik

wäre es 6-3-4.

Dominik

Ah, 6-3-4, ja.

Christian

Das ist auch eins, wo Guido jetzt selber

Christian

wieder, Guido hat ja beim Parser natürlich

Christian

mit drin gesteckt

Christian

und das ist jetzt auch anscheinend

Christian

eins seiner Themen, wo er dran steckt.

Christian

Ja.

Jochen

Ja, also auf jeden Fall, das klingt irgendwie

Jochen

sehr vielversprechend und ich bin mal gespannt, was dabei so rauskommt.

Jochen

Ja, ein Bug ist auch schon aufgefallen

Jochen

wohl. Achso, Match war,

Christian

achso, ja, vielleicht tatsächlich

Christian

das ist

Christian

eine bessere Variante

Christian

dessen, was sonst in anderen Sprachen das Case

Christian

gewesen wäre.

Christian

Nur mal so als

Christian

zur groben Einordnung. Also mit

Christian

dem Match geht es dann am Ende

Christian

tatsächlich darum, die, wenn man sehr

Christian

komplexe If-Else

Christian

Zweige hat,

Christian

dann kann man die damit ein bisschen hübscher abbilden.

Christian

Also substanziell

Christian

hübscher.

Christian

Warum hat man das nicht Case genannt?

Christian

Das müsste ich jetzt nachlesen.

Jochen

Also es macht schon, glaube ich, noch ein bisschen mehr.

Jochen

Also ich meine, ja, naja.

Jochen

Ach, keine Ahnung.

Jochen

Genau, einen Bug gab es auch schon.

Jochen

Da wird jetzt dann wahrscheinlich in 3.9.1 gefixt.

Jochen

Und zwar, was der alte Parser konnte

Jochen

und was jetzt halt mit dem neuen nicht mehr geht,

Jochen

ist, wenn man Tuple Unpacking,

Jochen

halt auch so Stern irgendwas in WIS,

Jochen

so Context Manager verwendet,

Jochen

dann funktioniert das nicht.

Jochen

Tja, aber es ist halt bisher niemandem aufgefallen,

Jochen

also so häufig scheint es nicht verwendet zu werden,

Jochen

aber das klappt schon irgendwie nicht.

Jochen

Achso, das ist auch vielleicht ganz interessant,

Jochen

also in 3.9 sind beide Parser drin,

Jochen

man kann auch irgendwie per Kommando zahlen,

Jochen

Optionen sagen, Minus X irgendwas, Old Parser oder so,

Jochen

verwendet doch bitte den alten,

Jochen

wenn man irgendwie mit dem neuen Probleme hat.

Jochen

Der neue ist defaultmäßig aktiv

Jochen

und der alte ist aber halt noch drin

Jochen

und mit Python 3.10 wird es dann halt so sein,

Jochen

dann wird der alte Parser komplett rausfliegen

Jochen

und nur noch der neue drin sein.

Dominik

Was mit Tablet-Uppacking in Context-Managern,

Dominik

das habe ich jetzt nicht so ganz verstanden.

Dominik

Warum geht das nicht oder ging das vorher auch nicht?

Jochen

Doch, das ging vorher schon, das hat bloß keiner gemacht.

Jochen

Warum auch, aber jetzt geht es nicht mehr.

Jochen

Also warum will er das denn nicht machen?

Jochen

Na ja, also warum, also das ist halt, niemand versteht dann, was du tun willst wahrscheinlich.

Christian

Ich überlege gerade, wie die genaue Syntax ist, was da kaputt geht.

Christian

Hast du den Bug irgendwo da?

Jochen

Na ja, Moment, da müsste ich auch gerade suchen.

Christian

Ich versuche so leise wie möglich zu tippen.

Christian

Ja.

Dominik

Also ich kann mir schon vorstellen, warum nicht im Contact-Manager

Dominik

einfach irgendeinen Tuple anpacken, das ist doch durchaus okay.

Dominik

Nee, nee, die Frage

Christian

meinst du wahrscheinlich oben in der With-Expression.

Jochen

Ja, ja, in der Expression selber.

Jochen

Also With und dann irgendwas mit Tuple-Unpacking machen.

Jochen

Also ich sehe da echt keinen Anwendungsfall

Jochen

für. Und es ist, glaube ich, also die haben da ja

Jochen

die komplette Standard-Bibliothek durchgejagt und noch viele

Jochen

PyPI-Pakete und sie haben es

Jochen

nicht, also das ist nie aufgetreten.

Jochen

Also das ist nicht so, dass das irgendwie dauernd gemacht

Jochen

wurde, sondern das hat bisher wohl noch nie jemand

Jochen

gemacht. Quasi. Also jedenfalls

Jochen

nicht ein Code, der irgendwie häufiger

Jochen

verwendet worden wäre.

Jochen

Also, ja.

Jochen

Es war nur, das ist halt schon mal aufgefallen,

Jochen

dass da ein Unterschied zwischen den beiden Paaren gab.

Jochen

Ja.

Jochen

Tja, was haben wir denn noch so?

Jochen

Oh, na hier.

Christian

Also, was ich wirklich hübsch fand, war

Christian

jetzt irgendwie nochmal explizit

Christian

die String, Prefix,

Christian

Suffix-Removals.

Christian

Weil das ist einfach, das war

Christian

seit langen Jahren

Christian

ist ja, es gibt einen L-Strip und einen R-Strip

Christian

und da

Christian

fallen Leute ja gern drauf rein.

Christian

Dass Leute gerne irgendwie sagen

Christian

L-Strip oder

Christian

Strip und dann irgendwie

Christian

eine Zeichenkette und sie denken

Christian

damit wird irgendwie, also

Christian

wenn ich sage Strip,

Christian

ABC, also möchte ich

Christian

immer, wenn ABC ganz links steht, das

Christian

weggestrichen haben, aber das

Christian

macht es ja nicht, sondern das macht ja

Christian

Streich von links

Christian

so lange alles weg,

Christian

wie das, was links ein A, ein B

Christian

oder ein C ist.

Christian

Das heißt, da kommen ganz lustige Dinge dann manchmal raus.

Christian

Und

Christian

jetzt gibt es halt ein explizites

Christian

Remove Prefix, Remove Suffix und dann

Christian

wäre das auch geklärt.

Christian

Ja.

Jochen

Das ist schon hilfreich.

Jochen

Ja, ansonsten

Jochen

Zeitzonenhandling

Jochen

ist jetzt irgendwie mit drin.

Jochen

Das habe ich noch nicht angeguckt,

Christian

ich bin seit irgendwie 15 Jahren

Christian

mit PyTZ unterwegs

Christian

und PyTZ hat halt den Vorteil,

Christian

das ist unabhängig, das ist halt so ein Ding,

Christian

die Zeitzonen-Datenbanken werden halt ständig

Christian

aktualisiert und geändert

Christian

und ich bin mir gerade nicht sicher,

Christian

haben die

Christian

da irgendwie die Datenbanken mit dabei

Christian

oder ist das nur eine API?

Christian

Genau, das ist halt auch der Grund, warum

Jochen

im DateTime-Standard-Modul

Jochen

in der Standardbibliothek

Jochen

waren diese Zeitzonen-Datenbanken

Jochen

auch nie drin, wohl aber eine API dafür,

Jochen

wie man da seine eigene Datenbank oder sein

Jochen

eigenes Objekt, das halt implementiert,

Jochen

das halt so ein Objekt irgendwie

Jochen

reintun kann, weil sich die Leute gesagt haben, ah,

Jochen

Python-Release-Zyklus, viel zu lang für diese Updates

Jochen

und dann wollen die Leute das mal selber machen

Jochen

und dann haben es die Leute natürlich nicht selber gemacht,

Jochen

weil keiner Bock hatte, das zu

Jochen

machen und ja,

Jochen

nee, wie es jetzt wohl ist, ist, dass

Jochen

Ach, ja, die nehmen

Christian

die System-Time so, weil sie haben eine

Christian

API dafür, um das reinzuziehen.

Jochen

Ja, und genau, auf Windows

Jochen

gibt es noch eine komische Geschichte,

Jochen

da gibt es dann ein

Jochen

First-Party-Package, was man dann noch installieren

Jochen

muss, TZ-Data oder sowas.

Jochen

Dann

Jochen

geht das da wohl irgendwie auch.

Jochen

Aber

Jochen

genau, so ist das dann. Ja, das ist so als

Christian

Fallback gedacht, für wenn das andere nicht da ist.

Christian

Und die intern

Christian

funktioniert das wohl

Jochen

mehr oder weniger genauso wie

Jochen

DateUtil oder sagen wir so, das ist auch

Jochen

also wie

Jochen

DateUtil das macht, also

Jochen

ich glaube, das ist auch von dem Autor von

Jochen

von DateUtil irgendwie

Jochen

meine ich jedenfalls

Jochen

gehört zu haben, dass der das von dem

Jochen

das ist und es implementiert halt so die

Jochen

Kerngeschichten, aber viele von den fancy Features

Jochen

von DateUtil sind halt nicht drin, aber

Jochen

so die Kerndinge.

Jochen

Ja.

Jochen

Noch was?

Jochen

Noch irgendwas?

Jochen

Naja gut, da gab es noch irgendwas mit Dekoratoren

Jochen

und Syntax, dass man da konnte man

Jochen

früher immer nur, bis jetzt halt

Jochen

immer nur Funktionen verwenden und jetzt kann man

Jochen

halt auch irgendwie ein Dikt nehmen

Jochen

und dann eckige Klammern oder so, das ging vorher

Jochen

auch nicht so richtig. Und das geht

Jochen

jetzt. Ah, das wird wahrscheinlich auch kaum jemand

Jochen

machen insofern.

Jochen

Ja, obwohl, da kann ich mir jetzt KMR vorstellen noch.

Jochen

Ja, dass man halt, man könnte sich vorstellen,

Jochen

man hatte irgendwie ein Dikt von Dekoratoren oder so,

Jochen

wo die Values halt irgendwie Funktionen

Jochen

sind und dann wählt man halt das Ding

Jochen

aus, was man halt, und da hätte

Jochen

man halt bisher immer irgendwie eine

Jochen

Extra-Funktion haben müssen, die dann halt

Jochen

die richtige Funktion auswählt

Jochen

und jetzt geht es halt direkt.

Jochen

Ja, auch nicht so schlecht.

Jochen

Es ist ja eine Frage von

Christian

in solchen Momenten immer bei diesen

Christian

syntaktischen Kleinheiten

Christian

dann kann man ja immer dieses

Christian

berühmte Dokument des

Christian

PHP, a fractal of bad design

Christian

rausholen,

Christian

dass du dich halt irgendwie

Christian

darauf verlassen können möchtest, wenn

Christian

gesagt wird, okay, hier hinter dem Ad

Christian

kommt halt eine Expression,

Christian

dann kann ich hier auch bitte alles

Christian

machen, was eine Expression halt kann.

Christian

Und wenn das halt nicht geht,

Christian

dann steht man immer traurig da und fragt sich, was soll

Christian

denn der Quatsch eigentlich?

Christian

Insofern, ich finde das einfach,

Christian

das ist halt so das Thema, wenn das auch gerade was ist, was der

Christian

neue Parser vielleicht besser unterstützt,

Christian

dann all for it.

Christian

Was ist

Dominik

a PAPEffect of Bad Design?

Christian

Also, um nicht auf

Christian

anderen

Christian

Sprachen rumzuhauen.

Christian

Gibt es aber ein

Christian

wirklich berühmtes Dokument

Christian

zum Thema, warum PHP

Christian

so ein massives Problem im Sprachdesign

Christian

hat. Und da gibt es

Christian

in dieser Blogpost, der ist jetzt auch

Christian

bestimmt schon 10 Jahre alt oder so.

Christian

2012.

Christian

8 Jahre.

Christian

Und da geht es

Christian

sozusagen darum, dass diese Herangehensweise

Christian

des Sprachdesigns, und da ist

Christian

Python ja schon lange ein Vorreiter gewesen, dass es halt

Christian

eine explizite Sprachdefinition

Christian

gibt, aus der dann halt das C-Python

Christian

nur, in Anführungszeichen,

Christian

die eine Implementation ist, und es

Christian

ist klar, es kann auch andere Implementationen

Christian

geben, und

Christian

ich erinnere mich

Christian

an mindestens ein Thema,

Christian

wo allein von

Christian

dieser syntaktischen Genauigkeit

Christian

tatsächlich irgendwie,

Christian

ich glaube, war das

Christian

das Type-of-Äquivalent

Christian

bei PHP oder so, war so

Christian

im Parser integriert, dass tatsächlich

Christian

die Aussage war, diese eine Funktion kann

Christian

immer nur exakt mit einem variablen Namen

Christian

aufgerufen werden, aber niemals

Christian

jemals mit einer

Christian

Expression, wo du dann von dem Ergebnis

Christian

den Typen haben

Christian

möchtest. Weil halt

Christian

jemand das in den Parser so reingestrickt hat.

Christian

Und dieser Artikel geht das sozusagen

Christian

in arg detaillierter

Christian

Form durch und nimmt da irgendwie

Christian

tausend von den Sachen auseinander und sagt halt hier

Christian

was willst du jetzt noch sagen, wenn du irgendwie

Christian

nur noch von einem zum anderen stolperst

Christian

dabei?

Christian

Ja, der ist mal ganz interessant zu lesen,

Christian

wird zum Thema irgendwie

Christian

ein bisschen analytisch auseinandergenommen,

Christian

was das liebe PHP

Christian

da so ein bisschen auf die schiefe Bahn

Christian

geraten lässt.

Christian

Ja, müssen wir mal in die Shownotes packen.

Christian

Ja.

Christian

Ja, mit den iii.ii

Christian

oder sowas.

Christian

Ja, aber

Christian

ich glaube, das war es dann auch schon

Christian

mehr oder weniger, ne?

Jochen

Ich glaube, sonst war da eigentlich nichts drin.

Dominik

Ja, ich glaube, irgendwie noch was zu Typins oder sowas, aber

Jochen

Oh ja, stimmt, man kann jetzt irgendwie

Jochen

List, man muss nicht mehr

Jochen

diese List mit Großbuchstaben vom

Jochen

Typing importieren. Wahrscheinlich

Jochen

war das halt auch so gedacht, ja, wer

Jochen

weiß, wie lange, ob die Leute das gut finden mit

Jochen

dem Typing, Typins und so.

Jochen

Nehmen wir mal nicht

Jochen

irgendwie, machen wir nicht den Aufwand, das

Jochen

direkt so zu ändern. Und jetzt kann man,

Jochen

muss man das halt nicht mehr aus Typing

Jochen

irgendwie

Jochen

Listen mit großem L importieren, sondern kann halt

Jochen

die Build-ins verwenden und das

Jochen

funktioniert dann halt auch in den Type-ins.

Jochen

Genau, das ist ganz

Jochen

nett. Das macht es ein bisschen

Dominik

einfacher, das zu schreiben und man muss nicht immer nachgucken, welche

Dominik

Imports das jetzt waren.

Dominik

Ja,

Dominik

was steht an Veranstaltungen an?

Dominik

Habt ihr irgendwelche? Oh, hab ich jetzt

Jochen

dummerweise gar nicht so richtig nachgeschaut.

Jochen

Die DjangoCon ist gerade vorbei.

Jochen

Ja, gab es eigentlich die Python auf jetzt?

Jochen

Oder waren die

Dominik

War die PyCon dieses Jahr virtuell?

Dominik

Ich weiß gar nicht. Welche meinst du?

Dominik

Die deutsche? Ja, die D.

Christian

Ne, die haben wir tatsächlich

Christian

verschoben. Also wir hatten

Christian

relativ zeitig im Jahr mit den, also es

Christian

wäre jetzt wieder in Berlin gewesen.

Christian

Genau, letzte Woche war es gewesen eigentlich.

Christian

Genau, und wir haben aber relativ

Christian

frühzeitig mit dem

Christian

Veranstaltungsort, wie wir haben gewesen, im

Christian

Haus des, nicht Haus des Lehrers

Christian

hier daneben an.

Christian

Ja.

Jochen

in Berlin, genau

Jochen

ach, wie heißt denn das noch, da wo immer

Jochen

der CCC-Kongress war, da wo immer der Kongress

Christian

war, genau, dieses UFO

Christian

ja, da wären

Christian

wir gewesen eigentlich und

Christian

wir haben mit denen dann halt, das war halt so ein bisschen

Christian

schwierig, weil im Januar

Christian

ja wirklich, im Februar

Christian

März war das, März, März

Christian

nicht klar war, wie wird denn das

Christian

jetzt sich über das Jahr eigentlich entwickeln

Christian

und tatsächlich, jetzt sehen wir ja gerade auch

Christian

dass die Zahlen schon wieder schwierig sind

Christian

und Massenveranstaltungen sind ja eh

Christian

abgesagt bis mindestens Ende

Christian

2020 und wir hätten gerechnet,

Christian

also in einem regulären Jahr

Christian

wäre unsere Hochrechnung

Christian

glaube ich bei knapp 2000 Leuten gewesen

Christian

und das kannst du halt

Christian

gerade knicken, das geht gar nicht.

Christian

Und gleichzeitig war halt auch schon

Christian

eine Anzahlung geleistet gewesen,

Christian

deswegen mussten wir mit denen entsprechend verhandeln

Christian

und jetzt ist die Aussage, wir probieren es 2021

Christian

und 2022, also wir haben uns committet

Christian

2021 und 2022 nochmal in Berlin zu machen

Christian

und haben uns gedacht, na gut,

Christian

um dann halt sozusagen die

Christian

Anzahlung zu retten.

Christian

Dadurch dürfen wir die für das nächste Jahr mit

Christian

verrechnen und haben jetzt auch

Christian

garantierte Preise

Christian

für 2021 und 2022

Christian

schon rausgehandelt. Die haben ja auch das Problem.

Christian

Auf der einen Seite müssen sie irgendwie sehen, wo sie bleiben

Christian

und auf der anderen Seite wollen sich natürlich auch nicht alle

Christian

Leute verbrennen, die eigentlich jetzt

Christian

regelmäßig Veranstaltungen mit ihnen machen.

Christian

Ich bin ein bisschen froh, dass wir halt jetzt

Christian

planmäßig schon für Berlin geplant

Christian

hatten und nicht für

Christian

Hinterpose Muckel, um

Christian

dann sagen zu müssen, so auf die nächsten

Christian

x Jahre müssen wir nach Hinterpolse muckeln,

Christian

ansonsten

Christian

sind wir pleite,

Christian

wären wir nicht pleite, aber

Christian

ansonsten müssten wir da

Christian

irgendwie Dutzende, Zehntausend Euro

Christian

vergraben.

Christian

Ja, nee, genau,

Christian

das wäre es gewesen, das haben wir verschoben.

Christian

Was tatsächlich im November noch ist,

Christian

vielleicht für alle, die auch im Peißenverband

Christian

schon Mitglied sind, ist

Christian

Mitgliederversammlung tatsächlich.

Christian

Das hatten wir auch ursprünglich geplant,

Christian

die jetzt, weil es ja eigentlich ganz gut aussah, im Oktober

Christian

mit vor Ort

Christian

hier in Halle zu machen, aber

Christian

sind gerade dabei.

Christian

Ich glaube, morgen wird das beschlossen

Christian

und dann wird das wahrscheinlich auch eine digitale

Christian

Veranstaltung werden,

Christian

im November. Da gehen demnächst

Christian

noch Einladungen raus, wer beim

Christian

Python-Verband Mitglied werden will.

Christian

Stimmt, kann ich das gerne noch machen.

Dominik

Ja, dafür muss er tatsächlich noch mal kurz Werbung machen.

Dominik

Die Webseite kurz nennen

Dominik

und... Genau, das wäre der

Christian

python-verband.org

Christian

der Python Software Verband

Christian

als die deutsche Interessensvorredung

Christian

und eine unserer

Christian

Hauptaktionen, und das war diesmal jetzt leider

Christian

dann auch ein bisschen

Christian

wenig durch Corona,

Christian

ist, dass wir alle möglichen

Christian

Community-Aktionen fördern.

Christian

Sowohl organisatorisch

Christian

als auch mit Geld. Das heißt, wir

Christian

verstehen uns da ein bisschen

Christian

als eine Drehscheibe.

Christian

Python selber ist ja gut bekannt, aber

Christian

was wir stark unterstützen wollen,

Christian

ist halt, Python

Christian

noch in Communities zu tragen, die es vielleicht

Christian

nicht so kennen und aber auch Veranstaltungen

Christian

zu fördern. Das heißt, man kann da auf der Webseite

Christian

unser Förderprogramm nachschlagen

Christian

und dann kann man sich relativ

Christian

unkompliziert Geld für Ideen abholen,

Christian

die man mal mit, wie man Python an andere

Christian

Leute ranbringen will, mal was coden möchte,

Christian

etc., etc.

Christian

Genau. Okay, interessant. Und

Christian

im Corona-Jahr war es jetzt auch so, dass wir tatsächlich

Christian

ein, zwei schon länger

Christian

bekannte Partner,

Christian

da gibt es die TechKids zum Beispiel

Christian

im Schwäbischen, die haben

Christian

jetzt auch ganz schön drunter gelitten, weil denen die ganzen Veranstaltungen

Christian

weggebrochen sind, mit denen sie normalerweise

Christian

dann ja auch wieder so Teilnahmegebühren reinholen

Christian

und haben da jetzt dieses Jahr

Christian

im Fördertopf tatsächlich dann auch eher mal

Christian

großzügig gesagt, okay, wir sponsoren euch jetzt auch mal,

Christian

wenn gerade nichts los ist, damit

Christian

das jetzt hier über die Corona-Zeit

Christian

nicht alles zerbricht, einfach,

Christian

was die Leute aufgebaut haben.

Christian

Ja. Ja. Das ist tatsächlich

Dominik

vielerorts ein größeres Problem, ja.

Dominik

Ja.

Dominik

Tja, ja.

Christian

Also es ist dann demnächst Weihnachten. Ich habe heute die

Christian

erste Weihnachtswärmung gekriegt.

Christian

Ja, tatsächlich. Weihnachtswünsche.

Christian

Ja,

Christian

geht schnell vorbei

Christian

mit so einer Pandemie, ja.

Christian

So oder so.

Jochen

Ja, also genau, ich weiß nur,

Jochen

Juro Python war jetzt auch

Jochen

vor kurzem. Die Vorträge sind

Jochen

irgendwie da und Django Con,

Jochen

das wollte ich mir auf jeden Fall angucken, aber habe ich

Jochen

noch bisher nicht geschafft. Gibt es auch die ganzen

Jochen

Vorträge online.

Jochen

Und was jetzt in Zukunft kommt, weiß ich gar nicht.

Jochen

weil ich es nicht nachgeguckt habe.

Dominik

Ja, wir verpassen übrigens gerade wieder das Django-Meetup

Jochen

Cologne, ne? Ja, ich weiß, aber das ist halt

Jochen

dann blöd, muss man...

Jochen

Ja, die Froscon war auch noch, das ist jetzt auch

Jochen

so fünf, sechs Wochen her, glaube ich.

Christian

Da hat es ein bisschen gedauert, die haben jetzt auch erst vor, glaube ich, zwei, drei

Christian

Wochen dann die Videos

Christian

online gehabt, genau.

Christian

Ja, und es gibt, glaube ich, noch wieder

Dominik

so eine neue Anmeldung für das nächste Jahr, ne?

Dominik

Die 21, die auch online statt

Dominik

sein wird, äh, Forstdem, diesmal, ja.

Dominik

Forstdem, achso, das ist dann Februar, Januar, Februar

Dominik

irgendwann die Forstdem, genau.

Dominik

Nee, ich meinte die Frostcon.

Dominik

Genau, die ist normalerweise

Jochen

St. Augustin. Genau, ja.

Jochen

Damals, ja.

Jochen

Ja, ansonsten, was mir noch so

Jochen

eingefallen ist, was jetzt geht, was

Jochen

früher nicht ging,

Jochen

Icehorde und Black sind kompatibel.

Jochen

Ja, das

Jochen

ist auch nett.

Jochen

Wie kam es?

Jochen

Ich weiß es nicht genau,

Jochen

also

Jochen

mit irgendeinem Update

Jochen

von Icehorde ist das jetzt

Jochen

sozusagen erledigt dann irgendwie gewesen.

Christian

Also iSort hat was gemacht, damit Black

Christian

nicht mehr dazwischen punkt.

Christian

Ja, irgendwie so, genau.

Jochen

Und ja, jetzt geht es halt, man kann es

Jochen

halt parallel, also man kann halt beides

Jochen

verwenden und

Jochen

hat dann da kein, nicht mehr so, dass das eine

Jochen

immer die Sachen vom anderen umsortiert, was ja irgendwie ein bisschen doof ist.

Dominik

Jetzt müsste man das nur noch in PyProjectHummel

Dominik

konfigurierbar machen, genau wie PyTest und

Dominik

Lake8 und dann...

Dominik

PyTest ist das?

Dominik

Ist das schon? Ja, aber

Dominik

mit so einem komischen

Jochen

Ja gut, der Key ist so ein bisschen komisch.

Dominik

Genau, PyTest, INI-Options

Dominik

oder so so ein Quatsch.

Christian

Wobei ich sagen muss, wir haben jetzt

Christian

tatsächlich Black an ein paar Stellen wieder zurückgebaut

Christian

und ich breche

Christian

noch eine Lanze für alle Leute, die sozusagen

Christian

neben schwarz noch ein bisschen grau haben wollen.

Christian

Ja.

Christian

Und empfehle mal noch ins Japf reinzuschauen.

Christian

Japf, okay.

Jochen

Ja, Black wird auch

Jochen

ein Problem kriegen, Black Fernandes

Jochen

auch den alten Parser

Jochen

und

Jochen

spätestens ab Python 3.10 wird es dann halt

Jochen

muss er sich

Jochen

was einfallen lassen, weil das geht dann nicht mehr.

Jochen

Naja.

Jochen

Kannst du kurz was zu JAPF noch

Jochen

sagen? Ja, JAPF

Christian

ist so ein, wie auch, wir waren ja vorhin schon

Christian

beim JAK,

Christian

der Yet Another Compiler Compiler und

Christian

JAPF ist der Yet Another Python Formatter

Christian

und die haben

Christian

sich tatsächlich eher auf die Fahnen geschrieben, dass das

Christian

Ding ein bisschen konfigurierbarer

Dominik

ist. Auch mit einer Jap Ignore, ich hab's grad

Dominik

gesehen.

Christian

Und der erzeugt

Christian

für mich, find ich, deutlich

Christian

lesbareren Code. Also das ist

Christian

die, ich komm persönlich mit

Christian

der Black-Formatierung an

Christian

vielen Stellen so richtig gar nicht klar

Christian

und find sie einfach

Christian

urpot hässlich.

Dominik

Ich fand sie auch sehr ugly, aber Jochen hat's mir immer aufgezogen.

Dominik

Ja, sorry.

Christian

Also ich unterstütze

Christian

volle Kanne das Thema,

Christian

einen Auto-Formatter einzusetzen.

Christian

Ähm, aber ich finde

Christian

Black ist halt nicht der weiße letzter Schluss

Jochen

Ja, das mag, also ich

Jochen

verstehe das durchaus, ich finde auch, ich habe so ein bisschen

Jochen

Schwierigkeiten mit den Anführungszeichen

Jochen

Ich habe auch vorher immer Single-Codes verwendet

Jochen

Das ist schon so ein bisschen

Jochen

Auf der anderen Seite würde ich sagen, naja gut

Jochen

Also, äh

Jochen

Selbst wenn man es nicht so hübsch empfindet

Jochen

Äh, wenn alle den gleichen

Jochen

Auto-Format verwenden, ist das

Jochen

ein so viel größerer Gewinn, als

Jochen

dass ich dann sage, nur gut, dann

Jochen

gebe ich dafür die persönlichen Präferenzen auf

Jochen

Aber ja, ich kann auch verstehen, dass man das, ja.

Christian

Weil mein Streit sozusagen schon über das, was ich als persönliche Präferenz empfinde, rausgeht, weil es verletzt mein ästhetisches Gefühl so, dass ich wirklich daneben stehe und sage, nee, das ist volle Kanne gegen die Designziele von Python als Sprache.

Christian

Ja, also das ganze Thema, dass die Indentation mir Dinge sagt und dann irgendwie über x Dutzend Zeilen hinweg wieder schließende Klammerorgien zu sehen, dafür brauche ich kein Python, also dann brauche ich kein Python, dann kann ich JavaScript schreiben.

Christian

Ja, naja.

Christian

Und sie wollen, also ich verstehe ja, warum das passiert, sie versuchen ja eine Formatierung zu machen, die möglichst wenig Diff erzeugt, wobei ich das bisher auch nicht gesehen habe, dass das wirklich, also da hätte ich gerne mal tatsächlich noch eine Metrik gesehen und ich muss aber sagen, das verletzt dann so ganz klassische Clean-Code-Aspekte auch von Code optisch ist zum Lesen für Menschen da und wenn das Ding halt tatsächlich erfordert,

Christian

dass meine Kognition massiv mehr Aufwand leisten muss, um es zu lesen.

Christian

Und alle Leute dann mehr oder weniger mit einem Stockholm-Syndrom ankommen

Christian

und sagen, ja, ich habe mich daran gewöhnt.

Christian

Dann erinnert mich das so ein bisschen eher wie an die alten Leute,

Christian

die ich hatte, als ich ein Haus gekauft habe und die Flugzeuge drüber fliegen

Christian

und die sagen, ich höre die schon alle nicht mehr.

Christian

Ja, so fühlt sich das für mich jetzt halt an.

Christian

Und wir haben jetzt tatsächlich in einem Projekt,

Christian

in einem größeren Projekt, das eben nochmal umgestellt von Black

Christian

auf einen anderen Formatter.

Christian

Auf Japf.

Christian

auf JAPF halt mit entsprechenden

Christian

anderen Optionen und

Christian

siehe da, plötzlich hat man wieder so ein

Christian

Ah, stimmt, so muss das aussehen. Danke, das ist Python.

Christian

Kannst du dafür mal

Christian

die Config irgendwie

Christian

teilen mit uns in den Show Notes?

Christian

Na klar. Das wäre super, weil das

Dominik

finde ich sehr spannend. Weil ich finde Black auch

Dominik

mega ultra hässlich und genau das, was du

Dominik

sagtest, also ein paar Sachen, wo ich dachte so, ah, wieso

Dominik

macht das so? Das ist auch eklig.

Dominik

Ja, na ja, gut.

Dominik

Ja, so, na ja.

Dominik

Ist schon was dran.

Jochen

dazu fällt mir gerade noch ein, ich habe letztens

Jochen

einen Podcast gehört, also ich höre den

Jochen

ab und zu,

Jochen

gefällt mir eigentlich, also mir gefallen ja auch so Formate,

Jochen

die so ultra lang sind und das ist halt auch

Jochen

so immer schön lang,

Jochen

der heißt irgendwie Lex Friedman

Jochen

und der spricht so mit allen möglichen Leuten

Jochen

und halt darunter sind halt

Jochen

auch viele der so Korrifäen.

Jochen

Zum Beispiel hatte er letztens

Jochen

ein Interview mit

Jochen

James Gosling,

Jochen

zu dem

Jochen

ja quasi Entwickler

Jochen

von Java

Jochen

und das fand ich

Jochen

ganz interessant

Jochen

und der erzählte dann halt

Jochen

auch so, ja, also

Jochen

was ihn dann dazu gebracht hat, Java

Jochen

sich auszudenken, war halt

Jochen

ja, seine lange Erfahrung mit C

Jochen

auch sowas, was ich nicht wusste, der hat

Jochen

Emacs irgendwie geschrieben

Jochen

in C, oder die erste ordentliche Version

Jochen

von Emacs und stand

Jochen

dann irgendwann vor der Entscheidung, okay, ich mache jetzt entweder

Jochen

den Rest meines Lebens Emacs

Jochen

oder halt nochmal was anderes und dann dachte ich so

Jochen

naja, Emacs, so geil ist es dann, also weiß nicht,

Jochen

muss auch nicht sein.

Jochen

Dann hat er lieber was anderes gemacht und das abgegeben irgendwie.

Jochen

Also Emacs und Java sind eng

Jochen

verwandt, interessant.

Jochen

Naja, also, ja.

Jochen

In gewisser Weise.

Jochen

Aber er hat halt auf jeden Fall sehr, sehr viel C geschrieben.

Jochen

Die ungleichen Zwillinge.

Jochen

Und dann auch größeren Projekten

Jochen

und dann sind ihm halt so Dinge aufgefallen,

Jochen

die immer wieder schief gehen in C und dann

Jochen

Java war halt sozusagen der Ansatz. Also mit diesen

Jochen

großen Fehlerklassen, die halt

Jochen

C immer wieder ganz böse Probleme

Jochen

machen, halt aufzuräumen und

Jochen

das ist ja auch dann irgendwie gelungen.

Jochen

Aber der sagte dann etwas,

Jochen

als es darum ging,

Jochen

wie das dann so ästhetisch aussieht,

Jochen

daher die

Jochen

Anknüpfung

Jochen

sozusagen weiter so, ja, also

Jochen

wenn ich irgendwie Code lese, es gibt ja mal so Leute,

Jochen

die sagen dann so, oh, ich finde das ästhetisch ist aber

Jochen

nicht so, gefällt mir nicht so

Jochen

richtig. Und dann so, mir war das immer alles total

Jochen

egal. Ich habe da nie

Jochen

den Code gesehen. Wenn ich irgendwie so

Jochen

eine Funktion angucke, dann sehe ich immer nur so

Jochen

dann habe ich da so eine visuelle, so eine

Jochen

Bildvorstellung von, so wie so Zahnräder

Jochen

von einer Maschine und dann sehe ich, ob das das Richtige

Jochen

tut oder nicht. Und wie die Syntax

Jochen

von der Sprache ist und wie die Sprache aussieht,

Jochen

das sehe ich gar nicht und das ist mir auch total egal.

Dominik

Jetzt wissen wir, was uns da war. Und dann dachte ich so,

Dominik

okay, ja, das erklärt natürlich einiges.

Dominik

Aber

Dominik

das ist aber halt, da ist er halt noch

Christian

auch schwierigen Positionen, weil er hat den Quatsch halt erfunden

Christian

und

Christian

mir geht es halt auch so, wenn ich irgendwelche

Christian

Tools baue und erfinde,

Christian

dann sehe ich da, wenn jemand die Tools verwendet, halt auch mit einem Schlag die Zahnräder.

Christian

Das ist aber halt kognitiv ein völlig anderer Prozess, als wenn ich das halt nicht erfunden habe

Christian

und ich das verarbeiten muss, was da steht.

Christian

Und das ist sozusagen, und da gibt es, jetzt habe ich halt im Studium auch Linguistik gemacht

Christian

und deswegen bin ich an der Stelle auch immer ein bisschen mit dran zu gucken,

Christian

wie hängt das zusammen und unser Gehirn, kognitive Last ist halt was,

Christian

das zwingt uns irgendwann halt dann nicht mehr über die Sache nachzudenken,

Christian

sondern das Gehirn ist dann halt nur noch damit beschäftigt,

Christian

dieses komplizierte Zeug zu lesen.

Christian

Deswegen hast du halt sowas wie Brainfuck.

Christian

Da bleibt dann halt nicht mehr viel über für

Christian

was macht der Code eigentlich?

Christian

Buchstabensalat.

Christian

Das ist halt schon eine echte Balance.

Christian

Ja, oder

Jochen

vielleicht sind unterschiedliche Leute da halt auch einfach

Jochen

unterschiedlich. Vielleicht gibt es Leute, denen

Jochen

ist das halt egal. Die sehen halt, wie

Jochen

die Mechanik dahinter

Jochen

direkt aussieht und können

Jochen

sozusagen an dem Code vorbeigucken, aber mir geht

Jochen

das auch nicht so. Also wenn ich

Jochen

bin sehr an der ästhetischen...

Dominik

Wenn man die ästhetischen Patterns direkt

Dominik

sehen kann und die einem klar ins Auge springen.

Dominik

Ja, du willst

Dominik

ein anderes Thema einleiten.

Dominik

Ich habe gerade versucht, einen kleinen Übergang

Dominik

zu finden.

Dominik

Ich weiß nicht, ob es mir geglückt ist. Wie geschickt.

Dominik

Ja, aber es war wirklich so.

Dominik

Wenn man das sehen kann, dann kann man doch auch diese

Dominik

Patterns auch mit einer gewissen Ästhetik betrachten.

Dominik

Und deswegen ist vielleicht

Dominik

diese Ästhetik der Sprache

Dominik

für manche wichtiger,

Dominik

vielleicht für einige unermichtiger, aber ich finde, das ist ein sehr essentieller Teil.

Dominik

Also gerade, weil auch die Hürde dadurch deutlich gesenkt wird.

Dominik

Selbst wenn es jetzt ein sehr hochentwickeltes Feature ist,

Dominik

ermöglicht es halt auch einen deutlich einfacheren Einstieg,

Dominik

weil durch diese ästhetische Klarheit man das Konzept auch deutlich einfacher verstehen kann.

Christian

Man kann ja auch tatsächlich Ästhetik mal zur Seite legen und an der Stelle einfach,

Christian

also es gibt ja mehrere andere Kriterien, die man ansetzen könnte,

Christian

eben zum Thema Lesbarkeit, Menge der Zeichen auf dem Bildschirm,

Christian

Menge an Noise, an syntaktischem Drumherum und so.

Christian

Und es gibt auch bestimmte Sprachen, bei denen ich halt sage,

Christian

da ist es mir wieder zu wenig.

Christian

Also Python ist halt tatsächlich für mich so die Sweet-Spot-Sprache.

Christian

Da ist mein Gehirn super drauf angesprungen damals und extrem gut drin.

Christian

Mit Ruby tue ich mich zum Beispiel extrem schwer.

Christian

Ruby hat halt dieses Thema, dass sie sehr viel metasyntaktisch arbeiten.

Christian

Und das heißt aber, du musst teilweise schon überlegen,

Christian

meint, hier ist ein Leerzeichen,

Christian

deswegen bedeutet jetzt gerade hmm, und wenn das

Christian

dahinter eine Funktion ist, dann

Christian

da musst du schon auch

Christian

in diesen Mustern ganz schön

Christian

arg drin stecken, um das halt wirklich lesen

Christian

zu können. Und ich habe bei Python halt immer

Christian

das Gefühl, egal wie es

Christian

geschrieben ist, irgendwie kriege ich

Christian

es dann schon auch wieder relativ schnell auseinander

Christian

klamüsert. Aber ich

Christian

merke auch, oh, jetzt ist es auf eine Art

Christian

geschrieben, die ist irgendwie von dort durch die Brust

Christian

ins Auge und war

Christian

irgendwie nicht zum Lesen gedacht.

Christian

Ja, man muss ja schon irgendwie

Dominik

Methode relativ schnell begreifen können irgendwie,

Dominik

das ist zumindest ein Ziel, wenn man das so

Dominik

vernünftig machen möchte.

Jochen

Naja, es ist halt so, ich glaube auch da

Jochen

wieder, dass halt für unterschiedliche Leute

Jochen

vielleicht da unterschiedliche

Jochen

Trade-Offs besser funktionieren oder

Jochen

schlechter und irgendwie

Jochen

so die, wie sieht das aus oder wie kann man,

Jochen

wie schreibt man Dinge dran, ist halt irgendwie so das

Jochen

User-Interface der Sprache,

Jochen

was ich auch letztens noch gehört habe,

Jochen

was ich ganz interessanten Ansatz fand,

Jochen

dass es ja auch noch andere Aspekte gibt.

Jochen

Also genau, das war auch in einem Interview-Podcast

Jochen

mit, glaube ich, Chris Lettner,

Jochen

der Swift und Clang und so gebaut hat.

Jochen

Und das hatte ich vorher noch nicht so richtig auf dem Schirm,

Jochen

weil ich dachte immer so,

Jochen

ja gut, was halt dann an Code dasteht,

Jochen

ist halt das Entscheidende.

Jochen

Und der meinte dann halt auch so,

Jochen

ja, also User-Interface der Sprache sehr wichtig

Jochen

und Python voll gut.

Jochen

Wusste ich auch gar nicht, dass er da so meinte,

Jochen

das ist total super.

Jochen

Das Problem ist nur, es gibt halt auch noch

Jochen

andere Dinge,

Jochen

die halt auch eventuell wichtig sind, wie zum Beispiel

Jochen

so etwas wie, wie gut ist das denn jetzt nicht,

Jochen

wenn ich da drin irgendwas

Jochen

programmieren will, was dann irgendwie mein Problem löst,

Jochen

sondern wie ist das eigentlich,

Jochen

wenn ich jetzt ein Framework da drin entwickeln will,

Jochen

oder irgendeine Library,

Jochen

ist das denn dann immer noch gut, weil

Jochen

bei Python hat man dann zum Beispiel

Jochen

das Problem, okay,

Jochen

wenn das jetzt irgendwas ist, was

Jochen

CPU-bound ist,

Jochen

sozusagen, dann hat man

Jochen

wahrscheinlich, wenn man jetzt irgendwie so ein Basis

Jochen

zum Beispiel sowas wie ein Machine Learning Framework oder so

Jochen

bastelt, dann

Jochen

kommt man da nicht aus ohne relativ

Jochen

große Anteile C, C++, irgendwie

Jochen

sowas. Und

Jochen

dann wiederum hat man das Problem,

Jochen

dass das User Interface sozusagen

Jochen

von dem Use Case ausgesehen halt

Jochen

nicht mehr so schön ist, weil jetzt kann man nicht mehr richtig

Jochen

debuggen, weil man hat halt ein Teil

Jochen

in C und ein Teil

Jochen

in Python und

Jochen

ja, was macht man jetzt, wenn irgendwie

Jochen

und wenn

Jochen

da irgendwo Fehler auftreten, gibt's

Jochen

keine konsistente Art mehr, das so richtig zu

Jochen

debuggen.

Jochen

Und das ist natürlich schon so ein Punkt.

Jochen

Oder was er auch meinte, ist dann halt so was

Jochen

wie, ja, also

Jochen

was ist eigentlich, kann ich so was

Jochen

wie ein Int-Typ

Jochen

überhaupt irgendwie selber basteln?

Jochen

Das geht ja jetzt in Python nicht, geht

Jochen

auch in Java nicht. Aber in

Jochen

Swift ging das natürlich, deswegen Swift, voll gut.

Jochen

Da könnte man halt, kann man solche Typen halt

Jochen

tatsächlich bis ganz runter selber

Jochen

sozusagen als Library-Autor

Jochen

halt auch haben und

Jochen

selber definieren.

Jochen

Und natürlich, also in gewisser Weise

Jochen

da ist schon das auch ein Punkt dabei.

Jochen

Und das ist natürlich in Python vielleicht jetzt nicht

Jochen

so einfach wie in anderen Sprachen.

Jochen

Also ja,

Jochen

aber

Jochen

zum Lösen von Problemen

Jochen

finde ich das auch, das ist halt irgendwie

Jochen

schon sehr, sehr angenehm im Vergleich zu allem anderen.

Jochen

Aber kann auch sein, dass ich da einfach nur

Jochen

komisch bin und das halt für mich funktioniert.

Christian

Und die Interviewreihe, die du da gerade aufgemacht hast, die kann ich auch allgemein empfehlen. Da hatte ich letztens nämlich jemanden, wie hieß der noch mal, wie hieß der Interviewer?

Christian

Lex Friedman.

Christian

Lex Friedman, genau.

Christian

Und da hatten wir diesen einen Chip-Designer.

Christian

Der ist auch extrem spannend, den sich anzunehmen.

Christian

Das ist gerade so ein thematischer Querschlag.

Christian

Aber ich glaube, die muss ich einfach mal loswerden,

Christian

weil der hat mich dermaßen begeistert.

Christian

Wie hieß er denn?

Christian

Lex Friedman mit...

Christian

Der hat zu viele Sachen gemacht.

Christian

Oh ja.

Christian

Der macht eine ganze Menge, ja.

Christian

Ah, genau.

Christian

Wo ist er, wo ist er, wo ist er?

Christian

Chipdesigner, Chipdesigner, Chipdesigner.

Christian

Namen sind Schall und Rauch.

Christian

Ja, manchmal macht er auch so ein bisschen komisch.

Christian

Also manchmal ist mir das auch...

Christian

Ich weiß nicht, es gibt ja so eine...

Christian

Also ich würde das mal...

Christian

Also wenn man das so...

Christian

Wenn man versteht...

Jochen

Also es ist halt auch sehr amerikanisch, muss man sagen.

Jochen

Und manchmal macht er auch einfach so

Jochen

etwas seltsame Dinge, irgendwie so

Jochen

sagt er, dass er jetzt nur noch Fleisch isst

Jochen

oder keine Ahnung oder macht ganz viel mit

Jochen

Cryptocurrency-Zeugs, was ja auch irgendwie

Jochen

so ein bisschen ist, aber

Jochen

ja, aber es sind auch auf jeden Fall

Jochen

super interessante Sachen dabei.

Christian

Genau, also hier Lex Friedman Nummer 70,

Christian

Jim Keller. Ah, okay,

Christian

gut. Jim Keller

Christian

ist tatsächlich einer, der

Christian

also ich habe da gleich

Christian

nach 10 Minuten so ein bisschen so einen Man-Crush entwickelt.

Christian

Der ist so

Christian

intense,

Christian

wie der da sitzt

Christian

und denkt und redet und

Christian

sein Minenspiel eigentlich gar nicht so richtig

Christian

präsent ist so richtig. Und dann doch so

Christian

ganz kleine Nuancen und

Christian

haut da Sachen raus zum Thema

Christian

Chip-Design. Und der ist halt sozusagen

Christian

in den 80ern

Christian

ins Chip-Design eingestiegen

Christian

und hat so alles mitgemacht.

Christian

Der hat halt bei AMD und bei Apple und bei

Christian

Tesla und bei Intel gearbeitet.

Christian

Und ich habe jetzt so ein bisschen so persönlich

Christian

so diese, dieses Gefühl

Christian

von, ah, dieser

Christian

Kampf zwischen AMD und Intel,

Christian

der wird eigentlich nicht irgendwie da weit

Christian

oben ausgetragen, sondern die Frage ist nur,

Christian

ob Jim gerade bei AMD oder bei Intel ist.

Christian

Die Folge heißt übrigens

Christian

Moore's Law, wenn ich das so sagen würde.

Christian

Ja, genau.

Christian

Also der war, der ist schon krass.

Christian

Der war richtig gut.

Christian

Ja, der Podcast kann man

Dominik

tatsächlich empfehlen. Es gibt auch andere tolle Folgen,

Dominik

die man hören kann, mit Donald Knoos oder

Dominik

Paul Krugman sogar mal dabei gewesen

Dominik

und und und. Es lohnt sich, die auch

Christian

auf YouTube zu gucken. Es gibt Videos davon mit

Christian

den Interviews, nicht nur als Podcast.

Christian

Und da ist,

Christian

ja, die Mimik ist

Christian

Peter Norweg.

Christian

Ja, ja.

Christian

Wenn man mal so durchscrollt.

Christian

Ja, genau.

Christian

Wo waren wir denn jetzt?

Christian

Wir waren eigentlich bei Petra Kohl

Christian

gemacht.

Christian

Ja, genau.

Christian

Ja, und

Jochen

irgendwie gewisserweise,

Jochen

da, genau, da, da

Jochen

auch zu Patterns hatte

Jochen

Dirk Fresslater noch was zu sagen und da meinte er dann so,

Jochen

ja, also Patterns sind ja auch immer so,

Jochen

es wird halt gesagt,

Jochen

wenn man Patterns braucht, dann hat

Jochen

die Sprache eventuell, ja,

Jochen

einfach nicht genug, also hat,

Jochen

was ist das eigentlich?

Jochen

Das ist ein Zeichen dafür, dass die Sprache

Jochen

halt etwas nicht kann, was sie vielleicht können sollte, ne,

Jochen

und deswegen muss man halt einen Pattern machen

Jochen

und das kenne ich auch schon

Jochen

lange und er

Jochen

fügte halt dann noch was hinzu, was mir dann

Jochen

Und ich dachte so, oh ja, das stimmt, das ist ja auch eigentlich so ein Punkt, das ist nicht nur bei Patterns so, sondern halt auch bei sowas wie, gibt es eigentlich sowas wie eine Standardbibliothek und das ist halt immer, das ist ein ähnlicher Trade-off.

Jochen

Also wenn du jetzt eben wie bei Python eine relativ große Standardbibliothek hast, dann hat das natürlich eventuell den Vorteil, dass du dir so etwas erspaarst wie JavaScript, ja, die haben das da halt nicht und dann kriegst du halt NPM.

Jochen

Und das ist halt sozusagen

Jochen

ein Pattern, um halt

Jochen

diese fehlende Standardbibliothek

Jochen

irgendwie dann aufzufangen,

Jochen

sozusagen außerhalb von

Jochen

dem, was die Sprache tatsächlich macht.

Jochen

Und das ist halt so ein bisschen fies

Jochen

dann unter Umständen. Auf der anderen

Jochen

Seite ist es natürlich auch so, dass es wieder

Jochen

ein Vorteil sein kann, weil wenn man jetzt

Jochen

irgendwie sich TypeScript anguckt oder so,

Jochen

wenn sich so ein

Jochen

Typesystem halt außerhalb

Jochen

der Sprache entwickeln kann, kannst du das natürlich deutlich

Jochen

schneller tun, als wenn das immer nur

Jochen

alle 18 Monate oder jetzt alle 12 Monate

Jochen

updatbar ist.

Jochen

Mit dem Release-Zyklus der Sprache.

Jochen

Also es ist nicht so einfach.

Jochen

Und mit Patterns ist es halt irgendwie

Jochen

ähnlich.

Jochen

Wenn eine Sprache halt sehr, sehr viel kann, dann

Jochen

braucht man eigentlich nicht so viele Patterns, weil

Jochen

dann hat man einfach diese Probleme nicht.

Jochen

Und auf der anderen Seite, wenn

Jochen

ja,

Jochen

gibt es einen Nachteil, wenn eine Sprache zu viele Features hat.

Jochen

Naja gut, dann ist man halt auch an die

Jochen

Sprache sehr gebunden.

Jochen

Naja, eigentlich hat das keinen Nachteil.

Christian

Also Patterns, ich glaube Patterns ist sozusagen

Christian

Das war gerade

Christian

aufgekommen, da war ich glaube ich im Studium.

Christian

Ich weiß nicht, wann das

Christian

Buch rauskam. Ich glaube 1994

Christian

war es. Wenn man das typatisch jetzt wüsste,

Christian

dann war ich da nicht im Studium.

Christian

Oh, Tatsache.

Christian

94. Ne, da war ich

Christian

bei weitem noch nicht im Studium.

Christian

Oh.

Christian

Ja, Tatsache, 94.

Christian

Und

Christian

wir hatten ja vorhin schon mal kurz angerissen,

Christian

dass das in C++

Dominik

Ja, also du wolltest über das Buch

Dominik

reden, ging auch vor, Design Patterns.

Christian

Ging auch vor, Design Patterns, genau. Das ist

Christian

wenn man diesen Begriff Patterns in die Hand nimmt,

Christian

ist das in der IT sozusagen das, wo

Christian

es alles mit

Christian

angefangen hatte. Und

Christian

vielleicht kann man da noch kurz

Christian

den

Christian

einen Umweg gehen zu

Christian

Name, wie hieß er,

Christian

Steve Alexander?

Christian

Nee.

Christian

Alexander war Alexander...

Christian

Christopher Alexander.

Christian

Christopher Alexander war das, genau.

Christian

Er war ein Architekt.

Christian

Und der hatte dieses Thema Patternsprachen halt mal aufgegriffen

Christian

und beziehungsweise entwickelt,

Christian

um sich städtebaulich so einem Gesamtkunstwerk anzunähern.

Christian

Um halt auf der einen Seite zu sagen,

Christian

okay, Patterns sind Dinge, die immer wieder auftauchen,

Christian

die halt in leichten Variationen anwendbar sein müssen.

Christian

Und es ging ja nicht darum, dass Patterns,

Christian

es sind ja Patterns und nicht Templates.

Christian

Also was ist das denn?

Dominik

Ist das sowas wie ein Mosaik-Baustein-Ding,

Dominik

das man irgendwo reinstecken kann

Dominik

und dann in alle Richtungen funktioniert?

Dominik

Nee, eigentlich nicht.

Christian

Eigentlich ist es halt tatsächlich ein Entwurfsmuster,

Christian

wo du mehrere Dinge genannt bekommst drumherum.

Christian

Also die haben da ein gewisses formales Schema aufgebaut.

Christian

Es ist ein Name und Klassifikation und Zweck und Synonyme und Motivation.

Christian

Und aber was eben tatsächlich interessant ist, sind halt dann immer Hinweise zur Anwendbarkeit,

Christian

Hinweise zu einer allgemeinen Oberflächenstruktur,

Christian

Akteure, das ist jetzt sehr C++ nah, dann schon so Klassen, die daran beteiligt sind,

Christian

aber auch das Zusammenspiel davon und eine Abwägung von Konsequenzen mit Vor- und Nachteilen,

Christian

Implementierungen und Beispielcode häufig.

Christian

Und da geht es halt darum, dass man für einen bestimmten Fall, wenn man merkt,

Christian

ich schreibe jetzt hier Code, der hat so ein ähnlicher Einsatz wie von diesem Muster

Christian

und dann liefert dir das Muster zumindest schon mal einen Design-Input von,

Christian

also wenn du jetzt sowas in dieser Art machst, dann solltest du auf x, y, z achten

Christian

und dann hängt da noch das und das und das dran.

Christian

Und es ging nicht darum, sozusagen ein fertiges Stück Code,

Christian

was man nur noch copy-pasted irgendwo reinzusetzen,

Christian

sondern zu sagen, na guck mal, es gibt zum Beispiel,

Christian

wenn du das Problem hast, dass du Code dynamisiert auswählen können möchtest,

Christian

dann ist zum Beispiel das Strategy-Pattern eine mögliche Variante, das zu tun.

Christian

Das sieht dann so und so und so aus

Christian

und da muss man auf das und das und das aufpassen

Christian

und den Rest baust du dir jetzt selber zusammen.

Christian

Ja, das ist ein bisschen wie, wenn ich sage, ich setze mich hin und schneide mir ein Kleid, dann habe ich da Entwurfsmuster, aber ich muss natürlich trotzdem noch messen, ob mein Bauch ein bisschen dicker ist, meine Beine ein bisschen länger und muss das dann halt anpassen.

Christian

Und da ging es tatsächlich dann darum, und das ist auch das, was der Christopher Alexander an der Stelle wollte, er wollte ja damit Leuten eine Auswahl von Mustern an die Hand geben, wo die Muster auch ineinander greifen und zusammenspielen.

Christian

Also das ist ja auch ein Thema, dass das nicht irgendwie eine wahllose Menge von Patterns ist,

Christian

wo man sagt, die lerne ich jetzt auswendig und dann nehme ich einmal das und einmal das und einmal das,

Christian

sondern das soll eine Sprache ergeben, wo man dann anhand von diesem Zusammenspiel,

Christian

von den Verknüpfungen zwischen den Teilen dann immer weiß,

Christian

ah, wenn ich hier drüben das mache und da das mache, dann sollte ich wahrscheinlich hier drüben gleich mal aufpassen,

Christian

dass ich nicht noch x, y, z versaue.

Christian

Und diese Sprache, da geht es ein bisschen um Kräfteverhältnisse zwischen den Dingen,

Christian

aber eben auch immer dieses, man muss es sich selber zurechtschneiden für den eigenen Anwendungsfall.

Christian

Ansonsten hätte man das ja auch in der Library kippen können.

Christian

Das hätte man sagen können, das ist jetzt der einmal fertige Code.

Christian

Und der Trick ist aber, das Muster auf einer Ebene greifen, wo ich nicht vorher sagen kann,

Christian

ah, da braucht man eine Funktion für oder da braucht man dieses Ding oder eine Klasse oder sowas,

Christian

sondern es ist häufig auch ein, ja, wenn du folgende sieben Zeilen dreimal geschrieben hast,

Christian

dann solltest du mal darüber nachdenken, ob du das vielleicht anders anordnen möchtest.

Dominik

Aber das ist jetzt ja vielleicht noch mal

Dominik

interessant für alle unsere Hörer, weil wir haben jetzt ja

Dominik

abstrakt vielleicht irgendwie da

Dominik

mit angefangen, was so Patterns

Dominik

vielleicht so

Dominik

konzeptuell sein sollten und

Dominik

vielleicht gehen wir noch so ein bisschen in die konkretere Implementierung,

Dominik

was es denn so gibt

Dominik

an Sprachpatterns überhaupt und

Dominik

dass wir vielleicht die mal erklären und

Dominik

ein bisschen

Dominik

versuchen, wie man das in Python vielleicht macht,

Dominik

wenn man

Dominik

das macht, wenn man die überhaupt braucht.

Dominik

Also,

Christian

Ja, genau. Also ich meine, die Muster, die sind ja sozusagen allgemeingültig. Das sind ja tatsächlich sehr abstrakte Ideen, die da existieren.

Dominik

Fangen wir vielleicht mal mit der Antwort an. Hast du eben irgendwie Strategie gesagt?

Christian

Ja, ich würde woanders anfangen. Ich würde beim Singleton anfangen.

Dominik

Ja, okay. Fangen wir beim Singleton an. Was ist denn Singleton?

Christian

Die mäßige, schöne Übersetzung ist das Einzelstück. Ich mag es einfach nicht, wenn.

Christian

Es gibt ja so ein paar Kategorien, also der Singleton gehört zu den Mustern aus dem Bereich

Christian

Creational Patterns, also wie werden in einer objektorientierten Sprache Objekte erzeugt.

Christian

Da gibt es so verschiedene Muster und es gibt manchmal den Effekt und gerade in Java ist

Christian

das halt noch ein stärkerer Fall, dass ja alles muss eine Klasse sein und manchmal brauchst

Christian

aber Code, wo das Objekt

Christian

nur ein einziges, wo es nur ein einziges

Christian

Objekt zu geben darf.

Christian

Ja. Und

Christian

dieses Objekt soll aber auch gut

Christian

zugänglich sein. Und

Christian

das kann zum Beispiel sowas sein wie

Christian

das Objekt

Christian

in Python ist, es gibt ein

Christian

Python-Analogum dazu tatsächlich sogar.

Christian

Das ist nämlich das Objekt, was

Christian

den Logger in dieser Anwendung

Christian

zum Beispiel repräsentiert.

Christian

Davon will es nicht, will sie fünf

Christian

Logger haben nachher, sondern du willst halt

Christian

irgendwie, wo ist denn hier die Log-Konfiguration,

Christian

mit dem Ding möchte ich jetzt reden, da soll jetzt

Christian

bitte Log-Output rausgehen.

Christian

Und

Christian

da gibt es dann halt

Christian

entsprechende Muster, wo man sagen kann, okay,

Christian

wenn irgendwer die Klasse in die Hand kriegt und die

Christian

nochmal neu instanziiert, dann dreht die sich um

Christian

und gibt einfach statt

Christian

ein neues Objekt zu machen,

Christian

dir das eine erzeugte Objekt

Christian

schon wieder zurück.

Christian

Und dieses konkrete Singleton

Christian

lässt sich aus Java

Christian

so auf Python, du kannst es glaube ich

Christian

codemäßig sogar

Christian

so

Christian

bauen, das hat aber nicht

Christian

die gleichen Eigenschaften, weil die Sprache ja eine andere ist

Christian

und in Python gibt es

Christian

dafür halt andere Möglichkeiten sowas zu machen

Christian

dass du zum Beispiel sagst, du hast einen Namespace

Christian

bei dir

Christian

in deiner Anwendung, ein Modul, das heißt dann

Christian

Log, Tipp, man sollte es nicht

Christian

Logging nennen, das geht gerne schief

Christian

wenn man die Standardbibliothek startiert

Christian

das heißt

Christian

vielleicht Log und da drinnen

Christian

gibt es eine Klasse, das ist dann dein

Christian

Logger und nach der

Christian

Definition der Klasse würdest du gleich

Christian

dieses Objekt instanziieren und wenn du

Christian

willst, löschst du danach

Christian

diese Klasse einfach aus dem

Christian

Namespace von dem Modul wieder raus.

Christian

Dann kann auch

Christian

keiner aus Versehen so eine

Christian

zweite Instanz machen und dann

Christian

muss man wieder dazu sagen, naja, Python als Sprache

Christian

für Erwachsene, das stimmt halt so auch nicht, weil wenn du

Christian

die Klasse aus dem Modul dann löschst,

Christian

dann ist der Name zwar nicht mehr ansprechbar,

Christian

aber du kannst natürlich auf diesem Singleton-Objekt

Christian

wieder nach under, under class fragen.

Christian

Dann hast du das Klassenobjekt,

Christian

dann kannst du da wieder eine neue Instanz von machen.

Christian

So, jetzt kannst du halt hergehen

Christian

und kannst, wenn du willst, in Python sagen,

Christian

also der, jetzt muss ich selber überlegen,

Christian

welche Doppel-Underscore-Methode da die richtige war.

Christian

Nicht init, sondern was?

Christian

Create?

Christian

New, genau.

Christian

Ich habe es zu lange nicht mehr in der Hand gehabt.

Christian

Ich merke, ich mache in letzter Zeit

Christian

zu wenig Metaprogrammierung in Python.

Christian

Du könntest aber under under new nehmen und könntest dort sowas machen wie, wenn es auf dem Klassenobjekt schon ein bestimmtes Attribut gibt, nämlich die Instanz selber von dem Objekt, was du mit der Klasse erzeugt hast, dann liefer einfach das zurück und ansonsten mach einmal ein neues und ansonsten nie wieder.

Christian

Solche Meta-Aktionen kann man damit machen.

Christian

Die Frage ist nur immer,

Christian

wie gesagt, was hat das Pattern für einen Kontext?

Christian

Und es gab eine ganze Zeit lang,

Christian

und das wurde so ein bisschen diesen Java-Programmierer-Schmieden,

Christian

die halt so viele Leute, wie möglich,

Christian

die Java programmieren können sollten,

Christian

rausgespuckt hatten, so Ende der 90er und Anfang der Nullerjahre.

Christian

Die sind immer rausgekommen mit,

Christian

ich kann die Patterns, ich muss alles in Patterns denken.

Christian

Und das ist aber in der Informatikausbildung selber ein Pattern, was immer wieder kommt, dass die Leute irgendwie Werkzeuge in die Hand gedrückt kriegen und dann denken, ich muss alles mit diesen Werkzeugen ausdrücken.

Christian

Und eigentlich ist es aber umgekehrt. Eigentlich ist es halt, du schreibst halt Code und wenn du die Patterns kennst, dann merkst du vor deinem Auge plötzlich, ich baue hier etwas auf, das riecht wie so ein Singleton.

Christian

Dann sollte ich mir jetzt nochmal kurz Gedanken machen, was wir alles wissen über diese Form von Pattern und ob ich jetzt bestimmte Dinge von Fehlerbehandlung, von bestimmten Edge Cases etc. nicht einfach alle gleich glatt ziehe, weil ich weiß, wenn ich das jetzt so und so mache, dann habe ich das hier alles handwerklich ordentlich gemacht.

Christian

Und es ist aber ein Bottom-Up-Approach und gelehrt wird das Ganze häufig halt als Top-Down-Approach, im Sinne von, du baust deine Anwendung nur noch aus Dingen zusammen, die diese Patterns sind. Und das ist halt Quatsch. Du baust halt die Anwendung erstmal, wie du die willst und wenn du feststellst, ah, du hast hier ständig irgendwie Dinge, die eigentlich nach diesen Patterns riechen und dafür ist es dann wichtig, dafür muss man sie halt kennen, dann kannst du es damit leichter und schneller strukturieren und musst das Rad nicht jedes Mal neu erfinden.

Jochen

Ja, genau. Ich würde auch sagen, eben genau diese Creational Patterns, das ist halt so ein, es gibt irgendwie drei Teile, Creational, Structural und Behavioral oder sowas, glaube ich.

Jochen

würde ich sagen, ist auch

Jochen

schon eine der Hauptpunkte, dass es halt

Jochen

irgendwie fehlende Sprachfeatures

Jochen

so ein bisschen relevant, weil

Jochen

tatsächlich

Jochen

braucht man diese Patterns vor allen Dingen

Jochen

in Sprachen, wo halt

Jochen

das syntaktisch einen Unterschied

Jochen

macht. Also wenn ich halt zum Beispiel in C++

Jochen

oder auch in Java

Jochen

oder selbst in JavaScript, wenn ich da new sage,

Jochen

um ein neues Objekt

Jochen

irgendwie zu erzeugen,

Jochen

dann

Jochen

habe ich halt das Problem, dass das, also

Jochen

in Python ist es halt, ist ja

Jochen

sozusagen neues Objekt erzeugen gar

Jochen

nicht syntaktisch zu unterscheiden von einem Funktionsaufruf.

Jochen

Das sieht halt einfach genauso auf.

Jochen

Und ich kann ja irgendwas zurückgeben. Also ich

Jochen

muss ja jetzt, wenn ich ein neues Objekt erzeuge,

Jochen

nicht irgendwie irgendwas new sagen, sondern

Jochen

ich rufe halt eine Funktion auf und dann

Jochen

habe ich halt ein neues Objekt. Aber die könnte da halt

Jochen

auch was ganz anderes machen. Auch ein

Jochen

Objekt von einer anderen

Jochen

Klasse zurückgeben oder so. Das geht

Jochen

halt in C++ nicht. Wenn ich da sage

Jochen

new irgendwie diese Klasse, dann kriege ich halt

Jochen

ein Objekt von dieser Klasse. Also muss ich mir, wenn

Jochen

dann was anderes dabei rauskommen soll, halt überlegen,

Jochen

wie gehe ich denn jetzt damit um? Und dann wird es halt,

Jochen

kriege ich halt irgendwie If-Else-Kaskaden

Jochen

in irgendwie Konstruktoren und dann irgendwann denke ich mir

Jochen

so, hm, das sieht aber hässlich aus, was meine ich denn jetzt?

Jochen

Und dann brauche ich halt Patterns.

Jochen

Und das

Jochen

hat man in Python so, eigentlich

Jochen

würde ich sagen, so viele der braucht man so nicht. Also es gibt

Jochen

vielleicht, ich würde sagen, Ausnahme ist vielleicht das Bilder-Pattern,

Jochen

das man halt auch in Python vielleicht ganz gut

Jochen

verwenden kann.

Dominik

Dann bitte noch mal erklären, was ist das für ein Bilder-Pattern?

Jochen

Also das Builder-Pattern

Jochen

ist halt sozusagen, wenn man jetzt nicht nur

Jochen

ein Objekt bauen möchte, sondern halt

Jochen

eine ganze Menge von Objekten,

Jochen

dann

Jochen

wird das halt unter Umständen unübersichtlich.

Jochen

Wenn ich das jetzt irgendwie,

Jochen

muss ich halt einen Konstruktor machen, der irgendwie

Jochen

riesig wird und ganz viele Argumente übergeben oder so,

Jochen

das ist halt eventuell nicht so schön.

Jochen

Ein gutes Beispiel dafür ist halt

Jochen

LXML hat da so ein Ding,

Jochen

wie man sozusagen XML-Dokumente zusammenbauen kann.

Jochen

Das ist halt quasi Bilder-Pattern, kann man sagen.

Jochen

Also wenn man sich das mal angucken will,

Jochen

da gibt es dann halt für jedes Tag gibt es halt ein Objekt

Jochen

und dann kann man das halt ineinander schachteln

Jochen

und dann sieht das quasi syntaktisch so ein bisschen aus,

Jochen

als würde man XML zusammenbauen

Jochen

und hat dann aber tatsächlich eigentlich quasi

Jochen

halt eine Reihe von Objekten zusammengebastelt.

Jochen

Meistens reicht es aber,

Jochen

also das, wofür dann das Bilder-Pattern verwendet wird,

Jochen

in anderen Sprachen, in Python reicht es dann

Jochen

meistens irgendwie einfach eine neue

Jochen

Klassenmethode an ein Objekt ranzumachen, die halt dann

Jochen

irgendwie Sachen zusammenbaut.

Jochen

Das geht halt. Anderswo geht das

Jochen

halt nicht so gut. Da muss man halt

Jochen

das ein bisschen komplizierter machen. Aber es gibt

Jochen

auch in Python Fälle, wo man das

Jochen

Pattern tatsächlich braucht.

Christian

Und es ist halt schön, das Pattern zu kennen, auch wenn es

Christian

halt nicht primär um komplizierte Syntax geht.

Christian

Hat das was mit Factory

Christian

zu tun, weil das Builder-Pattern heißt?

Jochen

Ja, also Factory-Pattern würde ich sagen, braucht man

Jochen

fast nicht. Das ist genau so etwas,

Jochen

das ist, da das irgendwie

Jochen

da Funktionen

Jochen

First Class Dinger sind in Python,

Jochen

gibt es eigentlich gar keine.

Dominik

Was ist denn das Factory Python? Fangen wir wieder so an, wir wollen ja auch ein bisschen

Dominik

erklären.

Jochen

Ich weiß gar nicht, ob ich das genau

Jochen

gut erklärt kriege.

Jochen

Äh,

Dominik

guckt irgendwas aus, wird

Dominik

irgendwas fabriziert auf eine ähnliche Art und Weise,

Dominik

irgendwas generiert,

Dominik

was ähnliche Eigenschaften besitzt, ich weiß nicht.

Dominik

Nee, es geht eigentlich

Dominik

eher darum, dass du deine Objekt

Jochen

Konstruktionen konfigurierbar

Jochen

machen möchtest. Dass du nicht

Jochen

sagen möchtest, also du hast halt nicht irgendwie einen Hammer

Jochen

und ich hätte was jetzt irgendwie

Jochen

New Hammer, sondern du hättest gerne

Jochen

jetzt einen sehr speziellen Hammer mit einem

Jochen

möglichen, keine Ahnung,

Jochen

so ein Stil, der so und so lang ist und

Jochen

keine Ahnung,

Jochen

der soll so und so schwer sein und weiß ich nicht.

Jochen

Und ja,

Jochen

jetzt ist halt

Jochen

die Frage, wie konfiguriert es zu

Jochen

dieses Ding halt und wo man in Python halt eine Funktion

Jochen

verwenden würde, musst du halt in

Jochen

anderen Sprachen jetzt anfangen,

Jochen

sozusagen da Objekte ineinander zu

Jochen

stapseln.

Jochen

Und ja, aber ich kriege es jetzt auch,

Jochen

weiß ich nicht genau, ob ich das so super erklärt kriege.

Jochen

Ich habe mir das auch schon lange nicht mehr angeguckt.

Christian

Ja, man muss an der Stelle halt auch

Christian

es geht wieder

Christian

um Syntax halt auch an der Stelle.

Christian

Das eine ist, du benutzt

Christian

halt plötzlich keinen New Operator mehr an der

Christian

Stelle. Das geht weg, sondern du

Christian

änderst halt den Aufruf eines

Christian

traditionellen Konstruktors in

Christian

halt eine ganz normale

Christian

Funktion oder Methode

Christian

und kannst halt

Christian

tatsächlich auch

Christian

unterschiedliche

Christian

Semantiken haben. Also hier wird zum Beispiel

Christian

gerade ein Beispiel aufgeführt von

Christian

hab eine Farbklasse, ja, und du willst jetzt

Christian

eine neue Farbinstanz haben und sagst

Christian

einmal create from RGB oder

Christian

create from HSV oder solche

Christian

Sachen, das kannst du damit

Christian

ein bisschen expliziter machen,

Christian

speziell wenn du dann halt wirklich unterschiedliche

Christian

Semantiken haben willst

Christian

oder das Ding noch 13 andere Dinge tun

Christian

soll oder eben gar kein

Christian

new aufruft, sondern das Ding von woanders

Christian

ranzerrt,

Christian

da sind Konstruktoren halt häufig

Christian

einfach extrem begrenzt,

Christian

was die Flexibilität angeht.

Christian

Und das ist tatsächlich in Python halt ein, naja, Init und Usen sind halt auch nur ganz normale Funktionen, die kannst du parametrisieren und benutzen, wie du willst, da ist Python halt einfach eine Ecke voraus gewesen.

Christian

Nichtsdestotrotz kann man halt noch was daraus lernen, ich mache das auch gerne manchmal, dass ich Konstruktoren habe oder solche Factories habe, die eben dieses aus unterschiedlichen Kontexten heraus initialisieren.

Christian

Es ist in der Python-Bibliothek selber auch drin, wenn man sich DateTime zum Beispiel anguckt, dann gibt es da mehrere, das sind dann entweder Klassen- oder Statische Methoden, die heißen dann irgendwie fromTimeStamp oder from was auch immer, um dann halt ein Objekt dieser Klasse zu erzeugen, aber eben mit völlig anderen Ansätzen und der Code ist natürlich leichter zu strukturieren, als wenn du nur einen Konstruktor hättest, wo 23 Parameter drin sind, die sich alle nicht auf den Füßen rumtreten dürfen.

Dominik

Ja, dann machen wir doch weiter

Dominik

mit was würdet ihr als nächstes nehmen?

Dominik

Eigentlich hatten wir ja mit dem Singleton angefangen

Dominik

und mit den verschiedenen Arten.

Jochen

Achso, ja, ja, genau, auch zu Singleton wollte ich auch noch

Jochen

kurz, genau, was ich meistens verwende

Jochen

oder was für meine Anwendungsfälle, wo ich

Jochen

sowas habe, wie den Singleton,

Jochen

meistens reicht

Jochen

ist tatsächlich irgendwie eine Variable

Jochen

in einem Modul, weil das ist

Jochen

ja, das Modul ist schon ein Singleton irgendwie

Jochen

und wenn ich da halt irgendwas dran packe,

Jochen

dann ist das halt überall gleich.

Jochen

Wenn ich das irgendwo importiere,

Jochen

es gibt da

Jochen

so einen Pattern von Alex

Jochen

Martley, wenn man tatsächlich sowas braucht wie Shared State

Jochen

über, dann aber

Jochen

manchmal braucht man nicht unbedingt immer die gleiche

Jochen

Instanz, sondern nur, dass sich alles immer gleich irgendwie

Jochen

verhält und den gleichen State hält,

Jochen

da kann man das Borg-Pattern verwenden.

Jochen

Das ist so ein bisschen ähnlich wie ein...

Jochen

Das Borg-Pattern?

Jochen

Kein originales Gang of Four.

Jochen

Nein, aber das ist halt sozusagen irgendwie

Jochen

eine etwas pythonischere Variante.

Jochen

Und es gibt dann natürlich auch noch die, also man kann

Jochen

tatsächlich auch so machen, dass es halt so ist wie

Jochen

Singleton in anderen Sprachen, dann meistens irgendwie

Jochen

muss man dann so Metaprogrammierung mit new und keine Ahnung,

Jochen

ist aber dann schon nicht mehr so richtig einfach und meistens

Jochen

wie gesagt, also meiner Erfahrung nach

Jochen

braucht man es eigentlich nicht.

Jochen

Ja.

Jochen

Ja.

Jochen

Okay.

Jochen

Also was für Appletten haben wir denn noch? Also ich

Dominik

kann jetzt natürlich die Liste hernehmen, aber

Dominik

wir haben jetzt Singleton gehabt, wir haben kurz Factory

Christian

Ja, es gibt noch zwei, die jetzt aus meiner Historie immer relevant waren. Das waren Proxys und Adapter. Da muss ich mal die ganz ollen kleinen Kamellen rausholen. Also SOAP 3 war damals tatsächlich, also SOAP 2 und deren Nachfolger SOAP 4 und SOAP 5.

Christian

Wie bitte was?

Christian

gab es auch einen. Bitte?

Christian

Soap, genau.

Christian

Es ist der

Christian

Open-Source-Urgroßvater

Christian

der Applikationsserver.

Christian

Z-O-P-E, Soap.

Christian

Ach, Soap. Ja, okay. Ja, genau.

Christian

Und

Christian

das war ursprünglich ja so ein

Christian

Through-the-Web-Entwicklungs-

Christian

Umgebungstool,

Christian

wo man halt nur durch einen Browser

Christian

mit Python und so ein paar HTML-Template-Sprachen

Christian

sich extrem schnell

Christian

Webanwendungen zusammenbauen konnte.

Christian

Das war original 96 entstanden, glaube ich, und 2001 rum gab es da einen Aufschlag zu sagen, so bauen wir alles nochmal neu mit besserem Engineering und da kam dann so ein SOP3-Projekt raus und da gab es schon mal so eine Zwei-nach-Drei-Transition, die nicht so smooth war.

Christian

Für SOAP war es tatsächlich, glaube ich, so ein bisschen auch dann der Untergang im Sinne von, das war sowas anderes, man hätte es nie SOAP 3 nennen dürfen. Es hat einfach nichts, also richtig gar nichts mehr mit dem vorherigen Ding zu tun gehabt.

Christian

Da war halt eine der Grundideen, dass es möglich sein sollte, Libraries und Anwendung oder Anwendungskomponenten, das nannte sich dann auch Komponentenarchitektur, so miteinander zu verheiraten, dass es eine zentrale Registry gibt, in der aufgezeichnet wird, wie man Dinge miteinander verbinden kann.

Christian

Also das war dann sehr stark Interface-basiert. Das ist jetzt auch was, was in anderen Sprachen stärker verankert ist als in Python. Und da hatten wir extra einen Interface-Typ für entwickelt, mit dem du dann deklarieren konntest, okay, das hier ist ein formales Interface, es muss folgende Methoden haben, die Methoden müssen folgende Parameter haben.

Dominik

Also ein Interface ist ja ein anderes Design-Pattern.

Christian

Nee, Interface ist noch nicht mal so richtig ein Design-Pattern.

Christian

Interface kommt eher aus dem Bereich der Typsysteme

Christian

und ist in einigen Sprachen sozusagen

Christian

eine Möglichkeit, Schnittstellen zwischen Code zu explizieren.

Christian

Also in Java ist es ja sehr explizit und in C++ auch.

Christian

Ich glaube, Modula 3, damit hatte ich gelernt,

Christian

ist es auch so ein Ding,

Christian

weil Dinge, die du nicht deklarierst,

Christian

kannst du nicht ansprechen, sozusagen.

Christian

Ja, du musst halt sozusagen immer,

Jochen

wenn du eine Funktion aufrufst oder eine Methode aufrufst,

Jochen

irgendwie, wenn du dir irgendwas übergibst,

Jochen

musst du dir halt sagen, was das denn ist.

Jochen

Kannst du dann nicht einfach irgendwas übergeben.

Jochen

Und wenn du jetzt Objekte unterschiedlicher Art da reintun willst,

Jochen

dann müssen die zumindest quasi vom gleichen Interface erben,

Jochen

sonst geht das halt einfach nicht.

Jochen

Du könntest zum Beispiel sagen,

Jochen

okay, ich habe hier irgendwie eine Methode,

Jochen

die schreibt irgendwie zum Beispiel,

Jochen

die lockt irgendwas weg oder so

Jochen

und ich gebe da jetzt irgendwas rein,

Jochen

aber was du jetzt reingeben möchtest,

Jochen

ist einmal vielleicht irgendein Log-File,

Jochen

in das reingeschrieben wird,

Jochen

aber du möchtest vielleicht auch,

Jochen

dass das irgendwie übers Netz in irgendein Socket geschrieben wird.

Jochen

Und dann kannst du sagen,

Jochen

okay, Socket und mein File haben beide ein File-like Interface,

Jochen

sozusagen, das sie implementieren

Jochen

oder dann halt auch explizit davon erben,

Jochen

wenn du das halt irgendwie so machen willst.

Jochen

Und dann kannst du das halt dann sozusagen,

Jochen

sagst du in der Methode,

Jochen

also ich habe hier, hätte ich gern ein Ding,

Jochen

dass das File-Interface sozusagen implementiert

Jochen

und kannst dann sozusagen darauf dann irgendwie

Jochen

write aufrufen oder so.

Jochen

Und die Menge der Methoden sozusagen,

Jochen

die man da aufrufen kann, das ist halt das Interface.

Christian

Also die Idee ist, der wichtige Unterschied ist,

Christian

dass du mit Interfaces halt Implementationen und Spezifikationen voneinander halt trennst.

Dominik

Das heißt, ich habe eine Art abstrakte Vordefinition.

Christian

Ja, also wir hatten es damals so gemacht, es gab einen speziellen Klassentyp,

Christian

also eine Basisklasse Interface, die konnte auch keinen richtigen Code haben.

Christian

Da wurde also, da hattest du immer nur Rümpfe von Methoden gehabt

Christian

Und dann konntest du halt deklarieren, dass eine bestimmte Klasse dieses Interfaces implementiert.

Christian

Und wichtig ist eben, dass die Implementationen nicht voneinander geerbt haben.

Christian

Es gab nicht irgendwie eine Basisimplementation oder du könntest das Interface gegebenenfalls

Christian

so etwas wie eine abstrakte Basisklasse nennen.

Christian

Aber das ist expliziter noch viel weiter voneinander entkoppelt worden.

Christian

Und Python, normalerweise, da gibt es ja das sogenannte Ducktyping.

Christian

Das heißt, solange es sich so verhält, wie es soll, ist mir als Laufzeitumgebung völlig egal, was du reinstopfst.

Christian

Das ist ja dann jetzt mit den Type Annotations kannst du da jetzt Laufzeitumgebungen nehmen,

Christian

die das halt ein bisschen strenger behandeln und auch mit statischer Analyse schon mal versehen.

Christian

Aber da ging es uns tatsächlich mehr darum, wenn man solche Annotationen hat,

Christian

dass man daraus dann auch den Vorteil zieht, dass ich sage, okay, ich definiere ein Interface für etwas

Christian

und wenn ein Objekt ein Parameter eines bestimmten Typs erwartet

Christian

oder ein Objekt erwartet, das ein bestimmtes Interface erfüllt,

Christian

dann wird nicht einfach gesagt, nee, du implementierst dieses Interface nicht,

Christian

sondern was dann passiert ist, dann wurde ein Adapteraufruf gemacht,

Christian

man hat also das Ursprungsobjekt genommen, was jetzt als Parameter in die Funktion reingereicht wurde

Christian

und hat dann geguckt, welches Interface soll es denn erfüllen,

Christian

hat einen Adapteraufruf gemacht und hat gesagt,

Christian

so, liebe Laufzeitumgebung, ich habe hier ein Objekt gekriegt,

Christian

mach bitte, dass es ein iLogger ist.

Christian

Und dann konntest du in der Laufzeitumgebung vorher registrieren und sagen,

Christian

ah, also, wenn jemand einen iLogger braucht und einen String bekommen hat,

Christian

dann mach bitte folgendes und dann kommt da dieses Objekt raus.

Christian

Oder wenn eine Methode einen iLogger braucht und da kommt ein Socket raus,

Christian

da wurde ein Socket übergeben, dann mach bitte das und geh dann weiter.

Christian

Und da kannst du sozusagen immer wieder beliebige Typtransformationen mitten reinsetzen

Christian

und hast dich dadurch flexibilisiert, dass jemand anderes plötzlich anfängt,

Christian

okay, ich gebe dir, liebes Programm, jetzt plötzlich Objekte anderen Typs rein

Christian

und deklariere an der dritten Stelle, wie diese Typtransformationen zu laufen haben

Christian

und dann kann ich

Christian

plötzlich halt Anwendungen auf Art benutzen,

Christian

die nie so vorgesehen waren.

Christian

Hört sich nach großer Magie an.

Christian

Das war ein Haufen Magie, da war ein Haufen Engineering

Christian

drin, um das auch schnell zu kriegen.

Christian

Also das war wirklich so, wenn man

Christian

bei Soap nachher in einer ernsthaften

Christian

Anwendung mal eine Seite aufgerufen hatte,

Christian

dann waren in einem Call bestimmt eine halbe Million

Christian

Adapter-Calls drin.

Christian

Und die waren aber auf C-Ebene

Christian

halt so optimiert, das waren halt nur ein paar Millisekunden,

Christian

die dafür draufgingen. Das war alles extrem schnell.

Christian

Da wurde extrem viel Arbeit reingesteckt.

Christian

Und da gibt es wirklich, also da gibt es Architekturen, die wir in Anwendung hatten, die waren extrem, extrem interessant.

Christian

Problem ist aber, die sind auch extrem aufwendig zu pflegen.

Christian

Also da spielst du dann halt Informatik wieder mit in der Klasse von, wir ziehen uns jetzt alle den Laborkittel an und designen das jetzt hier ordentlich durch.

Christian

Ansonsten fliegt uns das alles um die Ohren.

Christian

Da ist so ein iteratives Vorgehen

Christian

nur so begrenzt

Christian

getragen, weil du halt häufiger recht große

Christian

starre Refactorings hattest, die du dann halt

Christian

nehmen musstest. Aber

Christian

dieses Adapter-Pattern hat es extrem flexibel

Christian

gemacht. Also das

Christian

war schon richtig gut.

Christian

Und das zweite,

Christian

wo ich mich hier in

Christian

Fanatismus und Rage

Christian

vor euren Augen im Video

Christian

begeben hatte, was da auch eine Rolle

Christian

gespielt hat, waren sogenannte Proxy-Patterns.

Christian

dass also ein Objekt anstelle eines

Christian

anderes irgendwo reingereicht wird

Christian

und er emuliert alle Attributzugriffe

Christian

und alle Funktionsaufrufe,

Christian

macht irgendwas und reicht den Originalaufruf

Christian

dann an das Originalobjekt halt weiter.

Christian

Damit kannst du

Christian

zum Beispiel sowas machen wie ein Logging-Proxy

Christian

und das geht in Python tatsächlich total

Christian

super. Du kannst ein Objekt bauen,

Christian

der alle Attribut- und Methodenzugriffe

Christian

halt an ein anderes übergibt

Christian

und währenddessen zum Beispiel mitschreibt,

Christian

ja hier wurde gerade folgende Methode mit folgendem

Christian

mit folgendem

Christian

Parameter aufgerufen

Christian

und der Code, der das Objekt reingereicht kriegt,

Christian

der muss aber noch von nichts wissen. Der denkt einfach

Christian

nur, hier kommt ein Objekt, was halt irgendwie

Christian

keine Ahnung, eine Datei ist.

Christian

Eine Middleware quasi.

Christian

Genau, und

Christian

sowas wie eine Middleware,

Christian

nur genau umgedreht im Prinzip.

Christian

Du injectest das Ding in

Christian

was anderes rein.

Christian

Eine Middleware ist ja typischerweise was, was in der

Christian

Pipeline irgendwo drin sitzt und du kannst

Christian

aber halt beliebigem anderen Code

Christian

das Ding einfach unterjubeln.

Christian

Und das läuft dann durch diesen Code mit durch.

Christian

Und wie mache ich das?

Christian

Das ist relativ easy.

Christian

Also die Frage ist immer,

Christian

wann du bei Python

Christian

mit irgendwelchen Metafunktionen auf die Schnauze

Christian

fliegen möchtest.

Christian

Also die ernsthaften

Christian

Proxys, die wir hatten, waren dann

Christian

Security-Proxys.

Christian

Die waren in der Lage, anhand von

Christian

Access-Controls, einer relativ aufwendigen

Christian

Architektur tatsächlich für jeden einzelnen

Christian

Funktionsaufruf zu sagen, ob der

Christian

zulässig ist oder nicht. Ob dieser User mit den

Christian

Rechten auf dem Objekt,

Christian

das da aus der Datenbank kam, wenn das Objekt dann

Christian

auch noch zu dem Kunden gehört, da so,

Christian

darf der jetzt diese Funktion aufrufen, ja oder nein.

Christian

Das war halt eine sogenannte

Christian

Subject-Oriented Security

Christian

und das ist so ein Unterschied.

Christian

Heutzutage, viele Systeme haben

Christian

nur View-Oriented

Christian

Security,

Christian

dass du halt sagst, okay, darf ich jetzt diesen

Christian

View anschauen oder nicht. Und da

Christian

war es aber tatsächlich so, dass wir

Christian

praktisch alle Objekte,

Christian

die aus der

Christian

originalen

Christian

Factory mal rausgefallen

Christian

sind von, okay, hier ist deine Datenbank-Connection

Christian

oder sowas,

Christian

die wurden in solche Security-Proxys eingepackt

Christian

und dann konntest du nachher wirklich für

Christian

jeden einzelnen Attributzugriff

Christian

aussteuern, ob da jetzt Security

Christian

eingreifen soll und

Christian

sagen soll, nee, User mit den Permissions

Christian

dürfen halt auf die Passwortfelder nicht zugreifen.

Christian

Und wenn du das in deinem Template-Code

Christian

aber gemacht hast, dann ist aber der ganze Request

Christian

abgewürgt worden mit, das geht so nicht.

Christian

Da musst du halt dann noch

Christian

einen Check gegenbauen und sagen, ah, der darf

Christian

das nicht, dann wird das Template ordentlich gerendert.

Christian

Ansonsten hast du aber immer den Safety-Belt,

Christian

das ist dein Framework, selbst wenn du

Christian

Blödsinn im Code schreibst, du musst

Christian

da nicht drüber nachdenken, darf ich jetzt hier das Passwort

Christian

rausrendern oder nicht, das geht nicht raus. Im schlimmsten

Christian

Fall wird die Seite halt abgebrochen und du sagst, so hier

Christian

ist nichts.

Christian

Und die mussten wir aber tatsächlich auf

Christian

C-Ebene schreiben, um wirklich

Christian

alles komplett unterbinden zu können an

Christian

Protokollen, die Python so kann mit den

Christian

Doppel-Underscore-Methoden.

Christian

Einen einfachen Proxy kannst du in Python

Christian

schreiben, indem du einfach nur sagst, das ist eine Klasse,

Christian

die hat ein Init,

Christian

da übergibst du das Objekt, was geproxied

Christian

werden soll, also was eingepackt werden soll

Christian

und dann kannst du über die

Christian

GetAttribute

Christian

Protokolle

Christian

dann halt

Christian

sagen, okay, aha, hier versucht jemand gerade zuzugreifen

Christian

auf folgendes Attribut

Christian

und jetzt kannst du ein bisschen Log-Output

Christian

erzeugen und danach halt das Original-Objekt

Christian

mit genau diesem Objekt wieder aufrufen.

Christian

Und das ist der Vorteil bei Python, was diese Patterns

Christian

angeht, mit Python als

Christian

protokollorientierter Sprache.

Christian

Du hast immer irgendwas, was keine spezielle Syntax

Christian

braucht, sondern du kannst in der Metaprogrammierung

Christian

immer diese Doppel-Underscore-Methoden

Christian

benutzen, um dann wieder

Christian

über das System selber zu reden.

Dominik

Also dann Magic quasi direkt auf den

Dominik

Objekten, während die gebaut werden.

Christian

Und jetzt müssten wir im Podcast sozusagen ein bisschen Live-Coding machen, um da...

Dominik

Ja, ich kann mir nicht ganz genau vorstellen, an welcher Stelle das injiziert werden soll.

Dominik

Wenn du jetzt sagst, dass das schon gebaut wird, jetzt weißt du, die Init ist dann quasi schon durch.

Dominik

Also der Konstruktor ist quasi geschehen und dann habe ich ein fertiges Objekt.

Dominik

Genau, das ist aber das Proxy-Objekt.

Dominik

Also es hat aber doch erst ein Proxy-Objekt gebaut und das dann quasi die anderen Init-Methoden erst aufruft.

Jochen

Nein, du hast ein Proxy-Objekt, das kriegt das Objekt, was du hinter dem Proxy haben möchtest, das reichst du dem rein.

Christian

Also, ich versuche es ein bisschen bildlicher zu machen.

Christian

Du hast ein Objekt aus deiner Anwendung, zum Beispiel den Datensatz von einer Person aus der Datenbank als Objekt.

Christian

Class Person und die Instanz davon, die aus der Datenbank kam und jetzt mit den Daten gefüllt wurde, die hast du vor dir.

Christian

Person A.

Christian

Person A.

Christian

So, und jetzt würdest du sagen, ich habe einen Proxy, der loggt alle Zugriffe auf Attribute von Objekten mit.

Christian

Das Ding weiß nichts von Personenklassen oder irgendwas.

Dominik

Aber ich instanziere jetzt quasi den Proxy mit dem Objekt Person A.

Christian

Mit dem Objekt Person A als Parameter.

Christian

Bei dem Proxy heißt dieses Objekt intern nur Kontext, zum Beispiel.

Christian

Das speichert der bei sich auf under under Kontext, zum Beispiel.

Christian

Dann ein Contact, ja. Genau. Wichtig ist

Christian

under under, also auch hinten,

Christian

damit es in private Namespace kommt und so.

Christian

Und

Christian

wenn jetzt implementiert

Christian

der Proxy noch eine zweite Methode,

Christian

wenn du es ganz einfach machst, nimmst du under under

Christian

getAttribute under under.

Christian

Die wird ja immer dann getriggert,

Christian

wenn jemand auf ein Attribut zugreift, was

Christian

nicht definiert ist.

Christian

Da der Proxy selber kein Attribute hat,

Christian

wird es immer getriggert.

Christian

In dem Moment

Christian

würde er dann zum Beispiel ein Print machen

Christian

von, ja, hier wurde jetzt auf folgendes Attribut

Christian

zugegriffen

Christian

und ruft dann self.under

Christian

under context, under under, get attra

Christian

dieses Objekt auf.

Christian

Diese Attributnahme

Christian

auf. Erreicht sozusagen den Methodenaufruf

Christian

eins zu eins weiter und

Christian

gibt es auch wieder zurück. Und dieses

Christian

Objekt kannst du jetzt jedem anderen,

Christian

der von Logging keine

Christian

Ahnung hat, einfach in die Hand drücken

Christian

und könntest damit zum Beispiel

Christian

tracen, wer ruft denn hier

Christian

auf diesem Objekt jetzt, wenn ich jetzt folgenden Client-Code

Christian

habe eigentlich was auf.

Dominik

Was wird da gemacht? Da würde ich auch noch einen Debugger bauen oder sowas quasi.

Dominik

Kannst du dir einen Debugger mitbauen,

Christian

einen Flow-Debugger. Genau.

Christian

Oder kannst du halt auch

Christian

sozusagen, ja genau, einen Debugger.

Christian

Kannst du zum Beispiel auch was machen mit

Christian

Aha, den Code da hinten kann ich

Christian

nicht ändern, weil der ist so irgendwie, keine Ahnung

Christian

wie, komme ich nicht ran.

Christian

Aber jetzt mache ich so ein Proxy-Objekt

Christian

und wenn jemand auf dem Proxy-Objekt die Methode

Christian

A aufruft, dann starte ich ein PDB.

Christian

Ja. So, und das ist dann ein Proxy.

Christian

Du wickelst etwas ein

Christian

und gibst das

Christian

eingewickelte Ding weiter mit dem anderen, mit dem

Christian

Original drin. Da kann ich quasi

Dominik

alles mitlesen, was der da an Daten

Dominik

aus der Datenbank zieht. Genau, also in Python

Christian

kannst du, wie gesagt, es ist immer die Frage,

Christian

diese Double-Under-Methoden,

Christian

wenn du

Christian

sagst, der andere kann alles an Python

Christian

schreiben, was es gibt und du hast den Client-Code,

Christian

der ist völlig unbekannt, dann musst du

Christian

den auf C-Ebene schreiben, um wirklich

Christian

sicher zu sein. Wenn du aber weißt,

Christian

was der andere Code macht, dann kannst du

Christian

Proxys auch rein in Python schreiben.

Christian

Es ist nur in Python,

Christian

wenn jemand gegen dich arbeitet

Christian

mit deiner Metaprogrammierung, dann kommst du

Christian

gegen das Gegenarbeiten auch erst wieder an,

Christian

wenn du weißt, wie er gegen dich arbeitet.

Christian

Damit kannst du

Christian

keine Security bauen, aber du kannst halt

Christian

hilfreiche Dinge bauen.

Christian

Oder du kannst zum Beispiel eine Proxy bauen,

Christian

der alle Methodenaufrufe casht.

Christian

Und das Schöne ist, du kannst das

Christian

dann halt machen für Objekte, die du selber nicht unter Kontrolle

Christian

hast. Also, das ist sozusagen, du hast

Christian

einmal, die Objekte kommen von irgendwo, wo

Christian

du den Code nicht ändern kannst

Christian

und du steckst in irgendwas rein, wo du

Christian

auch nicht ändern kannst, was da passiert und

Christian

ein Proxy kann da an der Stelle halt

Christian

dann plötzlich neue Fertigkeiten einführen,

Christian

die

Christian

mit beiden Code-Basen im Prinzip nichts zu tun hatten.

Christian

Ja, da gibt es

Dominik

verschiedene Magie mit dem Flow irgendwie was.

Dominik

Genau.

Dominik

Das war der Proxy-Pattern.

Dominik

Das ist ein ganz interessanter Pattern.

Dominik

Ja, genau.

Dominik

So eine Strategy

Christian

ist halt auch was ganz Interessantes noch.

Christian

Vielleicht, das wäre so eins, was ich reinbringen würde.

Christian

Aber Max,

Christian

Jochen, magst du vielleicht noch eins?

Christian

Ja, also ich würde

Christian

zum Beispiel Fassade.

Christian

Das ist halt sozusagen wie

Jochen

baut man eine API

Jochen

sozusagen, wenn man eine komplizierte

Jochen

Geschichte hat mit vielen Objekten oder so,

Jochen

dann baut man davor halt

Jochen

eine

Jochen

API, die jetzt irgendwie einfacher zu bedienen ist.

Jochen

Das ist auch etwas, was man häufig hat

Jochen

und würde ich jetzt sagen, so in

Jochen

Python, was man da ganz oft macht,

Jochen

ist ja eben nicht das Pattern zu verwenden, sondern das

Jochen

halt irgendwie in

Jochen

PY zu schreiben sozusagen,

Jochen

was halt exportiert werden soll und

Jochen

quasi alles so

Jochen

umzuorganisieren, dass es dann halt von außen

Jochen

gut aussieht. Ja, genau.

Jochen

Ja.

Christian

Decorator sind ein Python-Sprachfeature inzwischen.

Christian

Das war auch mal ein separates Muster.

Jochen

Aber ich meine, Decorator-Pattern ist das nicht das,

Jochen

wo man so etwas machen kann,

Jochen

wie wenn man aus einem File liest,

Jochen

dann die Leerzeilen wegschmeißen oder sowas?

Dominik

Man rappt den Funktionsabruf und irgendwas.

Dominik

Input und Output kann man dann immer modifizieren.

Jochen

Nee, das ist ein Python-Decorator.

Jochen

Also das mit dem Add irgendwas drüber.

Jochen

Aber ich meine, das Decorator-Pattern wäre ein bisschen anders.

Jochen

Aber vielleicht täusche ich mich auch.

Jochen

Weiß nicht mehr genau.

Jochen

Ich meinte, das wäre halt irgendwie sowas,

Jochen

dass du halt

Jochen

sozusagen

Jochen

eben

Jochen

du tust halt so,

Jochen

als wäre das ein normales File, aber

Jochen

in Wirklichkeit schmeißt das Objekt,

Jochen

was du halt mit dem Decorator-Pattern

Jochen

gebaut hast, halt intern, weiß ich nicht,

Jochen

sowas wie Leerzeilen weg oder Dinge, die nicht gepasst werden können

Jochen

oder so. Tatsächlich ist es gerade

Christian

auch so ein bisschen ähnlich zu

Christian

dem Proxy, wie wir es beschrieben haben.

Christian

Da ist in Python der Unterschied nicht so groß.

Christian

Ja, ja. Hier wird nochmal,

Christian

Also ich gucke gerade immer so ein bisschen nochmal die Wiki-Seiten

Christian

nebenbei nach. Beim Dekorierer

Christian

wird nochmal explizit darauf

Christian

hingewiesen, dass man hier halt chainen kann.

Christian

Das kannst du mit Proxy aber auch machen.

Christian

Dass du da mehrere

Christian

hintereinander schaltest.

Christian

Ja.

Christian

Ja.

Christian

Ansonsten, was mir noch

Jochen

letztens

Jochen

ist mir das aufgefallen.

Jochen

Mysterium, ich weiß nicht, in welcher Episode wir das hatten.

Jochen

Da habe ich mich irgendwann mal gewundert.

Jochen

da dachte ich zuerst, das muss irgendwann letztes Jahr

Jochen

gewesen sein, ob das irgendwie eine Python 3.8

Jochen

Neuerung gewesen wäre oder so. Ich weiß es

Jochen

nicht. Ich hatte mit Listen von irgendwelchen Dingen zu tun,

Jochen

mit Listen von Integers

Jochen

und das war

Jochen

deutlich kleiner, als ich das

Jochen

gedacht hätte.

Jochen

Ich dachte so, hä, komisch,

Jochen

also es braucht tatsächlich nur

Jochen

irgendwie

Jochen

8 Byte irgendwie pro

Jochen

Integer. Eigentlich hätte ich jetzt mit

Jochen

deutlich mehr gerechnet. Irgendwie, weiß ich nicht,

Jochen

eher so

Jochen

23 oder weiß ich irgendwas von dem

Jochen

Dreh. Darum ist

Jochen

das so viel kleiner. Und

Jochen

die Antwort darauf habe ich jetzt gefunden und

Jochen

das ist eigentlich blöd, aber ich weiß nicht, wisst ihr

Jochen

das zufällig oder hättet ihr eine Ahnung gehabt, was das

Jochen

hätte sein können?

Jochen

Also ich habe halt eine Liste gemacht mit

Jochen

100 Millionen Integers und

Jochen

das war halt dann bloß 800 Megabyte im Hauptspeicher

Jochen

und ich hätte aber eigentlich erwartet, dass es deutlich mehr

Jochen

sein müssen.

Dominik

Okay, hat er Renundanzen weggelassen, oder?

Jochen

Ja, nee, das, was da tatsächlich passiert ist, ist halt intern benutzer der Python-Interpreter auch ein Pattern, um halt Integers, und zwar nur kleine Integers sozusagen, da Hauptspeicher zu sparen.

Jochen

Das Pattern nennt man Flyweight.

Jochen

Und die Integer von 0 bis 255, glaube ich,

Jochen

sind halt irgendwie immer die gleichen.

Jochen

Also man kriegt immer das gleiche Integer sozusagen zu sehen.

Jochen

Und deswegen ist das halt im Hauptspeicher deutlich kleiner.

Jochen

Das heißt, es gibt halt sozusagen nur...

Jochen

Ist ja auch eine Form von Singleton.

Jochen

Es ist sehr ähnlich zu Singleton, genau.

Jochen

Also eigentlich ist das halt für solche Dinge gedacht,

Jochen

wie, du hast halt, wenn du jetzt einen, weiß ich nicht, einen Textprocessor hast,

Jochen

irgendwie so ein Programm, sowas wie Word oder so, und wenn das jetzt irgendwie Buchstaben rendert,

Jochen

dann willst du halt nicht immer quasi alles, was halt in, der Buchstabe ist halt ein Objekt,

Jochen

dann willst du nicht immer alles für jeden Buchstaben, was da dran hängt, nochmal haben,

Jochen

sondern du willst es halt nur den Teil

Jochen

in dem Buchstaben austauschen, der halt ausgetauscht

Jochen

werden soll und der ganze Rest bleibt ja einfach immer gleich.

Jochen

Und genau, für sowas ist es eigentlich

Jochen

gedacht und in Python wird es halt auch für

Jochen

Integers verwendet.

Jochen

Und deswegen ist halt, wenn man jetzt

Jochen

sagt, Liste

Jochen

von 100 Millionen Integers, also für E in

Jochen

Range, weiß ich nicht, 100 Millionen,

Jochen

aber dann sagt man halt irgendwie sowas

Jochen

wie 0 oder 5 oder so, dann ist das halt

Jochen

sehr klein. Aber wenn man sagt,

Jochen

nicht, also

Jochen

nicht 0, sondern irgendwie

Jochen

i, dann wird es plötzlich sehr groß.

Jochen

Also dann hat man den Vorteil nicht mehr.

Jochen

Aber genau, da hatte ich mich

Jochen

irgendwann mal drüber gewundert und jetzt

Jochen

habe ich irgendwann zufällig gesehen,

Jochen

woran das lag.

Christian

In Python gibt es ja noch den Begriff in-turning

Christian

für. Das ist zu sagen,

Christian

da wird,

Christian

das kann man dann auch ganz gut sehen, wenn man halt die Objekte

Christian

dann mit einem Identitätsvergleich

Christian

halt anguckt.

Christian

Dann sind es halt tatsächlich wirklich immer,

Christian

dass das Is das gleiche ist.

Christian

Und das gibt es bei Strings halt auch.

Christian

Da gibt es auch in einem bestimmten Bereich

Christian

irgendwas mit Strings,

Christian

die kürzer sind als so und so lang

Christian

und kein Leerzeichen enthalten.

Christian

Und du machst ihn zweimal,

Christian

also du jagst ihn auch zweimal durch den Literal durch,

Christian

sind am Ende die gleichen Strings.

Christian

Das ist so ähnlich wie bei den Integern.

Christian

Ja.

Christian

So.

Christian

Wow.

Christian

Okay.

Christian

und also das, was ich halt sonst immer noch

Christian

ganz gerne mag, ist das Strategy-Ding

Christian

und das ist im Prinzip halt das Thema von

Christian

wie du halt Code flexibilisieren möchtest

Christian

und zwar

Christian

gegebenenfalls auch noch auf eine Plugable-Art

Christian

du könntest halt normalerweise, wenn du

Christian

ein komplexes If-Else

Christian

hast, oder

Christian

If-Else, If-Else, If-Else-Else

Christian

ähm

Christian

äh, Elif

Christian

ähm, und

Christian

du willst es flexibilisieren, weil da kommt noch ein Fall dazu

Christian

noch ein Fall dazu, noch ein Fall dazu

Christian

Zum Beispiel sowas wie, aha, du möchtest unterschiedlichen Code ausführen, je nach Sprache, die wir unterstützen.

Christian

Dann kannst du halt das lange Elif so refaktorieren, dass du jeden Teil davon in eine eigene Funktion packst.

Christian

Und entweder legst du die alle nach einem bestimmten Schema benannt in eine Klasse, sagst also sozusagen Class Country Address Format und die Methoden da drauf sind dann entsprechend zum Beispiel die ISO-Codes von den Ländern.

Christian

Und wenn du dann für eine Adresse, die du hast, dann sowas formatieren möchtest, dann kannst du sagen, so, dann schnappen wir uns die Klasse, lesen von dem Objekt runter den ISO-Code von dem Land und rufen dann die Methode auf, deren Namen dem ISO-Code entspricht.

Christian

Und dann kannst du natürlich dir auch überlegen, das muss ich ja nicht unbedingt auf einer Klasse machen, ich kann ja auch einfach ein Dictionary irgendwo hinlegen, wo diese ISO-Codes drinstehen und lade damit sozusagen andere Drittanbieter-Packages ein, in dieses Dict hinein, andere Arten von, noch andere ISO-Codes reinzuschreiben, die ich halt noch nicht kannte und mein Code ist dann in der Lage, halt jede beliebige Art der Formatierung aufzurufen.

Christian

oder jemand anders kann auch hergehen und sagen, hey, ich definiere dein Format für italienische Adressen, gefällt mir nicht,

Christian

also überschreibe ich jetzt diesen DICT-Eintrag von IT mit meiner eigenen Methode

Christian

und der Code, der das aufruft, der hat halt jetzt keine hartcodierten LFL-Zweige mehr,

Christian

sondern der macht immer bloß noch dieses Dictionary-Lookup von, ja, mit welcher Methode soll ich es denn formatieren?

Christian

Und das ist dann halt eine sogenannte Strategy im Prinzip.

Dominik

Und was ist ein Observer?

Dominik

Ich gucke nach.

Jochen

Muss ich hier auch nachgucken.

Jochen

Let me google this for you.

Jochen

Also ich glaube, das ist, ah doch, warte mal, das ist halt,

Jochen

wenn du benachrichtigt werden

Jochen

möchtest über, wenn sich irgendwo was geändert hat.

Dominik

Also bei dir auch, ob sie dir einen Bescheid

Dominik

sagt.

Jochen

du registrierst

Jochen

dich halt irgendwo quasi.

Jochen

Also alle, die benachrichtigt werden möchten,

Jochen

registrieren sich irgendwie und dann

Jochen

rufst du da einmal

Jochen

halt das auf

Jochen

und dann werden halt alle benachrichtigt.

Jochen

Ach Gott, ja, es ist lange her,

Jochen

dass ich mich damit verständigt habe.

Jochen

Das hat man im SOAP auch.

Christian

Das war das Event-Handling-System

Christian

tatsächlich.

Christian

Das ist halt ein

Christian

Du hast zwei Enden, die da mitspielen müssen.

Christian

Das eine ist, du möchtest halt, dass zu bestimmten Ereignissen in deiner Anwendung

Christian

andere Leute flexibel definieren können, was da alles noch passieren soll.

Christian

Das heißt, du hast sowas wie, okay, ich habe hier eine Methode,

Christian

ein Datensatz wird geändert, dann änderst du den Datensatz

Christian

und am Ende von der Methode schreibst du einmal sowas rein wie

Christian

Eventsystem.event

Christian

oder Trigger

Christian

und dann kannst du zum Beispiel

Christian

übergeben den Namen eines Events

Christian

à la Changed

Christian

Record

Christian

kannst auch alle möglichen Sachen

Christian

machen, um das zu identifizieren, du kannst auch

Christian

Singleton-Objekte machen, um Events zu registrieren

Christian

oder Interface oder was immer, aber im einfachsten Fall

Christian

sagst du sowas wie Event Trigger

Christian

Event Name

Christian

und danach übergibst du zum Beispiel

Christian

irgendeinen event-spezifischen Payload

Christian

Und das ist in Python ja auch schön zu machen, weil du ja auch mit Stern-Arcs, Stern-Stern-KW-Arcs arbeitest.

Christian

Aber du würdest halt sagen, so, Record Change als Event und hier ist das Objekt, was sich geändert hat und jemand anders kann zu dem Event-System als unparteiischen Dritten hingehen und sagen, so, hier ist eine Funktion, die übergebe ich dir jetzt, die rufst du bitte immer dann auf, wenn ein Record Change Event kommt.

Christian

Das ist so, wie man es in JavaScript ja auch kennt, dass man sagt, ich möchte bei einem Mausklick benachrichtigt werden, ich möchte bei einem Tastaturanschlag benachrichtigt werden, so kann man das natürlich auch einfach für beliebige Dinge kodieren und wichtig dabei ist halt, daraus baut man sich sein eigenes Framework.

Christian

in JavaScript ist über das DOM

Christian

definiert, welche Events da gibt

Christian

und das ist eine Art, wie man sich selber solche Events

Christian

halt bauen kann, dass man sagt, so, okay,

Christian

wenn auf

Christian

einem Record-Objekt

Christian

das Save aufgerufen wird, dann triggert der gleichzeitig

Christian

noch, wenn sich tatsächlich was geändert hat,

Christian

diesen Event und dann kannst du zum Beispiel

Christian

solche Dinge tun, wie wieder

Christian

loggen oder nochmal ein anderes Event

Christian

mitschreiben oder keine Ahnung.

Dominik

Also quasi Eventsignale abfangen quasi.

Dominik

Kann man Signale abfangen, genau.

Christian

Und wichtig ist halt an der Stelle, das ist in Python dann typischerweise eine synchrone Aktion, weil ja im Prinzip, du rufst die eine Funktion auf, die ruft dann, die macht ein sogenanntes, das nennt sich auch Method Dispatch, die ruft dann auf, die guckt dann nach, da kann man auch überlegen, darf es mehrere Händler geben oder nur einen, in welcher Reihenfolge werden die aufgeführt, das sind dann so wirklich so differenzierte Betrachtungen von dem konkreten Eventsystem, was man sich baut.

Christian

Oder gibt es nur ein Best-Match von, je nachdem, dass ich auch noch auf Typen von den Parametern matche, sowas wie, ich will aufgerufen werden beim Rekord-Change, aber nur, wenn der Rekord vom Typ Person war und solche Sachen.

Christian

Und dann kannst du halt solche Dinge machen wie, der erste, ein User setzt eine Bestellung ab und anderer Code von dir, ein anderes Modul, ist zum Beispiel dafür da, eine E-Mail rauszuschicken, wenn der User seine allererste Bestellung abschickt.

Christian

Ja, da kannst du das halt als völlig komplex, da geht es immer, also häufig geht es bei diesen Sachen darum, wie kann ich Code so geschickt modularisieren, dass ich halt später, wenn ich die Anwendung umbaue, möglichst wenig umstricken muss und mir selber auf den Füßen stehe.

Christian

Idealerweise kannst du halt dann auch mit sowas wie FeatureFlex ganze Module stilllegen und das ergibt aber trotzdem noch eine konsistente Anwendung und nicht, ah, da musst du in der Klasse die drei Zeilen da wegschmeißen, in der Klasse die drei Zeilen, in der Klasse die drei Zeilen, sondern daraus kriegst du halt so eine komponierbare Anwendungsarchitektur im Prinzip nachher.

Christian

Und auch da wichtig, Patterns sind etwas, die entstehen erst, wenn man etwas macht, deswegen ist das ja ein sehr handwerkliches Buch, ein handwerkliches Konzept, im Sinne von, die haben halt, das ist nichts, was man sich hinsetzt und sagt, so wir designen jetzt hier mal ein paar Patterns, sondern das ist halt ein so, wir haben jetzt hier so und so viel drölfzig Anwendungen geschrieben und das da sehe ich ständig in Variation.

Christian

was ist denn jetzt die Essenz von

Christian

diesem Ding in Variation? Ah, okay, das ist

Christian

ein Published Subscriber, das ist ein Observer.

Christian

Okay, alles klar, da hat man also dieses Ende

Christian

und jenes Ende und das Ende und hier jetzt geht der

Christian

Blumenstrauß auf von, wie könnte man das eigentlich

Christian

alles bauen? Und das heißt aber nicht,

Christian

dass man das halt jedes Mal ständig in der Vollausprägung

Christian

baut. Ich weiß, ich sage das jetzt

Christian

zum dritten Mal, aber ich habe

Christian

auch gelernt, wenn man Dinge zum siebten Mal sagt,

Christian

dann hat es die Hälfte der Leute zum ersten Mal gehört.

Christian

Und ich habe heute

Dominik

gelernt, weil du gerade vom Blumenstrauß an Methoden sprachst,

Dominik

es gibt auch welche Blumen in Blumensträußen?

Christian

Ja, genau. Es gibt auch Welkeblumen. Möchtest du unter den Patterns Welkeblumen suchen?

Dominik

Ja, tatsächlich. Du weißt ja nicht genau, was da stimmt, wenn du davon noch keine Ahnung hast und die eben nicht durch Pattern-Publishing von vornherein verstehst.

Dominik

Oh ja, das ist das, dies und jenes. Sondern du versuchst halt, dich irgendwie an eine, ich sag mal, clevere Architektur zu halten.

Dominik

Oder eine, die du für clever hältst, vielleicht, weil du es noch nicht verstehst.

Dominik

oder denkst, du möchtest halt in die Richtung

Dominik

entwickeln, um möglicherweise

Dominik

flexibel oder modular zu bleiben oder so

Dominik

oder halt verschiedene Schnittstellen aufmachen

Dominik

zu können, wenn du sie brauchst, dann

Dominik

könnte sowas ja passieren, dass man eine welke

Dominik

Blume baut, weil man da irgendwelchen Unsinn gebaut hat.

Dominik

Also speziell halt,

Dominik

das kommt dann eher aus dem Agilen, das

Christian

you ain't gonna need it. Also ich finde

Christian

halt, man sollte sich bei der Anwendungsbewegung extrem

Christian

stark auf den, erst mal

Christian

auf den Inhalt der Anwendung

Christian

konzentrieren

Christian

und erst, wenn man eine gewisse Menge

Christian

und Masse beisammen hat und überhaupt weiß,

Christian

worum es eigentlich geht und was man tut,

Christian

dann kann man irgendwie ans Gärtnern gehen

Christian

und kann gucken, okay, jetzt räumen wir hier mal auf.

Christian

Da ist Python als Sprache natürlich auch wieder

Christian

extrem gut positioniert, weil

Christian

ich habe jetzt

Christian

in den letzten Jahren häufig Projekte

Christian

angefangen mit so, ich fange mit einer einzigen Datei an,

Christian

ich baue bei keinem Package kein Nichts,

Christian

eine einzige Datei, keine

Christian

Dependencies, erstmal nur die Standard-Library

Christian

und mal gucken, wie weit ich komme,

Christian

um das eigentliche Problem mal so

Christian

80% zu lösen, was ich eigentlich gerade habe.

Christian

Und wenn ich dann weiß, worum es hier eigentlich geht, weil ich bin ständig dabei, dann alle Steine wieder auseinander und zusammen und auseinander und zusammen und vorwärts und rückwärts, wenn du da schon zu viel Code angehäuft hast in so einem Moment, dann macht dich das halt langsamer.

Christian

Und das ist ab einem gewissen Punkt dann auch halt legitim, wenn du feststellst, so, jetzt brauchen wir hier irgendwie ein Plugin für NFS und für Ceph und für ein S3 und für so, jetzt müssen wir anfangen, diesen ganzen Code zu restrukturieren, dann ist es halt schön, wenn man in der Hinterhand hat, was gibt es denn da für Patterns, wenn man sowas umstrukturiert, also bauen wir da jetzt, okay, guck mal, hier passt jetzt irgendwie eine Strategy und da passt noch ein Event-Handling-System und dann haben wir den ganzen Code irgendwie reduziert, dann ist es jetzt so, jetzt gefällt es mir.

Christian

Aber für mich ist das immer eine Sache,

Christian

das geht erst am konkreten Objekt.

Christian

Ich kann mich nicht vorher hinsetzen und sagen,

Christian

so, wir bauen jetzt ein neues Backup-System.

Christian

Wir brauchen einen Observer.

Christian

Und ich glaube, was eben ganz wichtig ist,

Christian

was bei den Patterns auch...

Christian

Also Yagni ist auch ein Pattern.

Christian

Nee, Yagni ist eine Methode,

Christian

die aus dem originalen Extreme-Programming kam.

Christian

Und das ist immer, wenn jemand sagt, ah, vielleicht könnten wir, nein. Aber irgendwann in Zug, nein. Aber wenn dann in zwei Jahren, nein.

Christian

Wichtig gegenüber Iagni ist halt, wenn wir auf der Ebene bleiben, ist immer noch Persistence. Persistency means having to say I'm sorry.

Christian

Also, wenn dieses

Christian

you ain't gonna need it wird ein bisschen,

Christian

kriegt ein Gegengewicht durch.

Christian

Ja, aber alles, was du

Christian

als persistente Daten wegschreibst, wird dir

Christian

halt auf Gedeih und Verderb im Nacken hängen.

Christian

Ja, Code ist flexibel.

Christian

Code ist total easy. Kannst

Christian

umbauen, kannst drehen, kannst wenden, solange das

Christian

Interface das gleiche bleibt, alles super.

Christian

Aber wenn du es einmal auf Platte

Christian

geschrieben hast,

Christian

dann kannst du aber wissen, dass das dich in 10 Jahren noch verfolgt.

Christian

Ja.

Jochen

Ja, und wenn man das richtig gemacht hat, dann

Jochen

hat man halt

Jochen

sozusagen auch später noch großen Nutzen.

Jochen

Der schöne Spruch da an der Stelle

Jochen

ist ja immer irgendwie Daten,

Jochen

also gute Daten altern wie Wein.

Jochen

Das ist halt schön, wenn man irgendwie mehr gute Daten

Jochen

hat. Schlechte wie Milch.

Jochen

Ja, Applikationscode,

Jochen

wenn man gesagt hat, Applikationscode altert wie Fisch.

Jochen

Das ist halt...

Jochen

Genau.

Jochen

Genau. Wer hat das geschrieben?

Jochen

Oh, das war ich.

Jochen

Ja, da kann ich mir so ein paar Sachen erinnern.

Jochen

Ich habe letztens

Jochen

einen Anschluss gekriegt von Jochen.

Jochen

Unmöglich, nee, so kannst du das nicht machen.

Jochen

Furchtbar, was sieht das denn aus?

Dominik

Nee, das geht aber gar nicht. Jochen, das ist von dir.

Dominik

Ja, eigentlich

Dominik

gar nicht so schlecht, ja.

Dominik

Ja, naja, das

Dominik

passiert auch

Jochen

demnächst. Das passiert durchaus ab und zu.

Jochen

Jaja.

Christian

Ich glaube an der Stelle auch, das ist halt der handwerkliche

Christian

Teil wieder.

Christian

Und jetzt mach ich mal die Schleife, wo ich gerade eben hin wollte, die Gang of Four-Leute, die haben alle ein extrem gutes Sprachverständnis selber gehabt von der Sprache, um die es eigentlich geht, mit warum ist das hier ein Problem und welche Mechanik der Sprache steht mir eigentlich im Weg und wie kann ich die halt counteren, sowas wie, wenn ich einen Konstruktor habe, dann bin ich halt auf den Typen festgelegt und kann ich das nicht machen, kann ich das nicht machen, nee, deswegen muss man...

Christian

Und ein Beispiel ist halt bei Java das Getter-Setter-Pattern.

Christian

Wenn du Leute ernsthaft Java-Code schreiben siehst,

Christian

dann bauen die halt für jedes Attribut immer ein, keine Ahnung,

Christian

Klasse Person, Geburtsdatum als Attribut

Christian

und dann ein Set-Geburtsdatum, Get-Geburtsdatum.

Christian

So, warum?

Christian

Weil es in Java später, wenn du mal irgendwie meinst,

Christian

du musst hier was ändern,

Christian

dann hast du keine Chance mehr, wenn irgendwelcher Client-Code auf Attribute zugreift, jemals noch irgendwie dich dazwischen zu hängeln.

Christian

Das ist ein reiner Future-Proofing-Aspekt und ich sehe immer wieder Leute, die aus der Java-Welt kommen, die in Python Code schreiben und dann für jedes Attribut eine Getter-Setter-Methode schreiben.

Christian

Und du siehst sofort, das ist Java.

Christian

Und wenn man dir irgendwann erzählt, nein, es gibt, du kannst im Nachhinein eine Property draus machen.

Christian

Du kannst machen, was du willst, dann ist alles schick.

Christian

Ja, aber, nee, nee.

Christian

Das ist halt, da merkt man halt, es ist extrem wichtig zu verstehen, wie die Sprache selber mechanisch funktioniert.

Christian

Weil nur dann diese ganzen Patterns tatsächlich irgendwie Sinn haben oder keinen Sinn haben.

Christian

Und das ist glaube ich was, was ich halt an der Stelle wieder diesem handwerklichen und sich selber weiterentwickeln mitgeben würde, ist, wenn man halt so Patterns gerade aus anderen Sprachen halt nach Python transportiert, muss man schon immer nochmal extrem gut auf die Suche gehen von, hat es hier nicht irgendeine andere Mechanik in Python, die das schon überflüssig macht.

Christian

Ja, wir haben die Dekoratoren,

Christian

wir haben die Konstrukturen, wir haben New,

Christian

wir haben Getter Setter,

Christian

also wir haben Properties,

Christian

die ganzen Sachen

Christian

und die erschlagen viele von diesen

Christian

anderen Sachen halt.

Christian

Ja, okay.

Christian

Also die Gang of Four Patterns

Dominik

habt ihr so einigermaßen einmal kurz

Dominik

eingekringelt und

Dominik

erwischt. Würde ich sagen.

Dominik

Ja, ja.

Dominik

Gibt es noch welche, über die ihr unbedingt reden möchtet?

Jochen

Naja, es gibt dann auch so ein paar, die halt

Jochen

später dazugekommen sind, beziehungsweise Sachen, wo man

Jochen

nicht so klar sagen kann, ist das jetzt eigentlich

Jochen

ein Design-Pattern oder sowas wie

Jochen

ja,

Jochen

MVC, weiß ich jetzt nicht, ist das ein Design-Pattern?

Jochen

Ja, nicht, ein bisschen größer, keine Ahnung.

Jochen

Model-View-Controller.

Jochen

Ja, genau, genau.

Jochen

Schwer zu sagen, oder sowas

Jochen

wie...

Jochen

Model-View-Controller ist älter.

Jochen

Das war nicht,

Jochen

also Model-View ist selber,

Christian

Das ist eine Anwendungsarchitektur.

Christian

Die kam aber

Christian

82, 83 irgendwann.

Christian

Also die war halt schon auch, bevor man sich mit dem Begriff

Christian

Patterns auseinandergesetzt hatte an der Stelle.

Christian

Ja, kann gut sein.

Jochen

Ja, oder halt

Jochen

so etwas wie, ich glaube, die kam aber dann

Jochen

tatsächlich später

Jochen

Datenbank, so ORM,

Jochen

so wie baue ich eigentlich ein ORM?

Jochen

so was, eben Active Record oder halt

Jochen

Datamapper-Pattern.

Jochen

Das ist halt auch so,

Jochen

tja,

Jochen

keine Ahnung, ob das

Jochen

Pattern sind oder...

Jochen

Was ist denn das jetzt schon wieder?

Jochen

Das ist halt die Frage, wie man

Jochen

sozusagen

Jochen

die Übersetzung macht zwischen Sachen,

Jochen

die jetzt in der Datenbank, vor allem in

Jochen

relationalen Datenbanken liegen und halt

Jochen

Objekten in Python

Jochen

beispielsweise und das sind halt

Jochen

diese beiden unterschiedlichen Dinge, also

Jochen

Active Record ist halt das, was Django macht

Jochen

oder halt auch Ruby on Rails

Jochen

und Data Mapper ist halt

Jochen

das, was SQL Alchemy macht

Jochen

und Hato.

Jochen

Und wo ist der Unterschied?

Jochen

Naja, also

Jochen

du hast

Jochen

du

Jochen

Kennst du dich

Jochen

Kennt sich jemand mit SQL-Alchemy gut aus?

Christian

Ja, ich kenne mich halt mit SQL-Alchemy aus.

Christian

Ich kenne mich wiederum mit Active Record nicht aus.

Christian

Super gut.

Christian

Ich lese jetzt gerade mal schnell mal wieder.

Dominik

Dann fangst du noch mit Active Record an, Jochen?

Dominik

Ja, also da ist es halt so,

Jochen

dass quasi jedes Objekt repräsentiert halt eine Zeile in einer Datenbank

Jochen

und die Attribute sind halt die Spalten.

Jochen

Und genau, wenn man halt irgendwie Dinge aus der Datenbank holt,

Jochen

dann hat man halt eine Liste von diesen Objekten.

Jochen

Und wenn man der Attribute ändert, dann speichert das halt die,

Jochen

kann man halt sagen, auf dem Objekt, auf der Zeile halt,

Jochen

speichert das und dann geht das halt zurück in die Datenbank.

Jochen

Und ja, genau, so sieht das halt ungefähr aus.

Jochen

Und normalerweise hat man halt eine Klasse, die,

Jochen

jedenfalls, ich sage jetzt mal so, wie es mit Django ist,

Jochen

hast du halt eine Klasse, die definiert,

Jochen

welche Spalten es halt in dieser Tabelle gibt.

Jochen

Also du hast pro Tabelle eine Klasse

Jochen

und die Spalten sind halt Attribute auf dieser Klasse,

Jochen

die halt so ein bisschen,

Jochen

das ist halt diese Deskriptoren-Geschichte,

Jochen

ein bisschen eigenartig definiert sind.

Jochen

Und dann kann man halt auch aus diesen Klassen

Jochen

die Tabellen direkt erzeugen,

Jochen

Auch die Relationen zwischen den Tabellen

Jochen

sind in den Attributen enthalten.

Jochen

Das heißt, ich kann, wenn ich mir diese Tabellen hindefiniert habe,

Jochen

auch komplett mein Datenbankschema aus den Dingern erzeugen.

Jochen

Immer wenn einzelne Sachen passieren sollen auf einer Zeile,

Jochen

dann sind das Methoden auf dieser Klasse.

Jochen

eine einzelne Instanz ist eben eine konkrete Zeile

Jochen

und wenn etwas alle

Jochen

Sachen betreffen soll oder viele Zeilen,

Jochen

dann sind das halt sogenannte, also in Django heißen die

Jochen

Model Manager,

Jochen

die dann halt irgendwie

Jochen

eine ganze Reihe von Sachen updaten oder halt

Jochen

irgendwie

Jochen

eine Reihe von Zeilen

Jochen

löschen und so kann man

Jochen

das dann halt aufteilen und alle Methoden, die irgendwie

Jochen

auf einer einzelnen Zeile was machen sollen,

Jochen

gehen halt in die Klasse und

Jochen

alle Methoden, die halt auf vielen Sachen

Jochen

was machen, gehen halt in den Manager auch,

Jochen

die jetzt irgendwas filtern oder so.

Jochen

Und dann, ja, genau.

Jochen

So funktioniert es ungefähr.

Jochen

Und jetzt kommt Psycholagmy.

Christian

Ja, Datamapper.

Christian

Genau, ich habe jetzt selber

Christian

erstmal noch mir die Active Record-Sachen

Christian

angeguckt. Das Interessante bei Active Record ist ja,

Christian

dass du relativ klar

Christian

Tabelle und Klasse aufeinander

Christian

mappst. Und beim Datamapper

Christian

ist es tatsächlich so, du entkoppelst es komplett

Christian

und die Objekte

Christian

müssen halt, also beim Active Record hat

Christian

zum Beispiel die Klasse gerne

Christian

irgendwie eine Save-Methode, wo du

Christian

sagen kannst, ich äh, ändere ein paar

Christian

Attribute und dann kannst du irgendwie Save aufrufen

Christian

und dann ist die irgendwie in der Datenbank.

Christian

Ähm, das ist zumindest das klassische Pattern dafür,

Christian

äh, wie es bei Django jetzt gerade aussieht, weiß ich nicht.

Jochen

Ja, ja, doch, ist genauso, ja. So, genau,

Christian

und bei Secret Alchemist ist es so, dass im Prinzip

Christian

deine Klassen von der Datenbank

Christian

überhaupt nichts wissen.

Christian

Ähm, es gibt

Christian

einen deklarativen Stil, bei dem du tatsächlich

Christian

dann wieder innerhalb, da kannst du wieder sagen,

Christian

doch, die Klasse weiß was davon, weil du es

Christian

halt eng aneinander koppeln möchtest, um solche Effekte zu haben,

Christian

wie dass du deine Datenbank anhand deiner Klassendefinition halt ableiten kannst.

Christian

Aber im Prinzip gibt es dann zwei getrennte Schichten von einmal,

Christian

okay, ich beschreibe hier Tabellen und ich beschreibe Klassen

Christian

und jetzt beschreibe ich, wie diese Tabellen auf Klassen gemappt werden.

Christian

Und da können halt auch alles mögliche reinspielen,

Christian

dass irgendwelche Attribute über komplexere Queries erst zustande kommen

Christian

und dass da irgendwelche komplexen Relationen zu sind und etc.

Christian

und SQL Alchemy bricht das auch extrem

Christian

abstrakt runter, dass du halt mit den Objekten

Christian

nativ arbeitest, ohne irgendwie über die Datenbank

Christian

nachzudenken, und

Christian

dann baut

Christian

der sich, und du brauchst kein separates,

Christian

wenn du viele Aktionen machst, kannst

Christian

du auch einfach auf 100 Objekten rumrechnen,

Christian

und er fasst das

Christian

nach hinten automatisch in die

Christian

optimierten SQL-Statements zum Beispiel zusammen,

Christian

dass er weiß, okay, der Herr hat

Christian

hier 100 Objekte angefasst, jetzt machen wir ein

Christian

großes Update-Statement, was irgendwie einmal sinnvoll aussieht,

Christian

bumm, anstatt halt

Christian

dann die eher naiveren Varianten

Christian

von, okay, jedes Mal safe drücken

Christian

ist jedes Mal irgendwie einmal

Christian

zur Datenbank laufen und speichern drücken oder so.

Christian

Und da

Christian

ist es halt einfach viel, viel flexibler, wenn

Christian

du das Datenbankmodell entkoppeln möchtest.

Christian

Das ist zum Beispiel auch dann, wenn du

Christian

konfrontiert wirst mit, ich habe hier eine fertige

Christian

Datenbank, die besteht seit 20 Jahren, die muss

Christian

jetzt hier irgendwie mal rein. Und dann

Christian

kannst du mit dem Datameter...

Christian

Blala, es ist Zeit fürs

Christian

Bett.

Christian

dann kannst du mal einen Data-Mapper-Pattern

Christian

nämlich

Christian

beliebige Transformationen machen,

Christian

um zu sagen,

Christian

okay, die Datenbank sieht aus wie Kraut und Rüben,

Christian

aber ich habe vorne ein ordentliches

Christian

Object-Model dran.

Christian

So, und bei SQL Alchemy ist das Ganze

Christian

sozusagen, wie heißt es denn da, so schön

Christian

auf 11 gedreht.

Christian

Da ist es so richtig

Christian

laut, da sind die Abstraktionen

Christian

so gut gemacht und die haben sich so viel Mühe

Christian

gegeben, was Performance angeht, dass so Zeug von

Christian

Du machst komplexere Abfragen und er weiß irgendwie, okay, wenn ich das jetzt mache, dann lade ich schon mal irgendwie die nächsten Relations mit und falte irgendwie die Relation-Objekte schon mal in die originale Seqquery mit rein, damit ich nur einmal einen großen Bulk-Transfer am Anfang habe, anstatt nachher bei jedem Attributzugriff nochmal zur Datenbank zu laufen oder so. Und das kannst du da extrem genau aussteuern.

Christian

Das macht ein Django-Manager, oder?

Jochen

Ja, in Django ist das, aber da gibt's

Jochen

das auch, da werden halt die Sachen,

Jochen

also

Jochen

das, was man halt nicht will,

Jochen

das droht bei Active Record natürlich, ist, dass

Jochen

wenn du jetzt zum Beispiel

Jochen

irgendwie ein Objekt hast

Jochen

und das hat halt irgendwie einen Foreign Key,

Jochen

ist halt mit einem anderen Objekt verknüpft

Jochen

und dann greifst du auf ein Attribut von dem

Jochen

verknüpften Objekt zu und das am besten

Jochen

in einer Liste irgendwie von Dingen,

Jochen

auf so einer Webseite, wo du halt eine Listenansicht hast

Jochen

und dann hast du halt irgendwie, zeigst du halt

Jochen

eine Tabelle zum Beispiel an oder halt

Jochen

eine Liste von Dingen und nimmst dann halt

Jochen

das Attribut von einer verknüpften

Jochen

anderen Geschichte, zum Beispiel einen Username

Jochen

oder so, der halt an einem von diesen Listenobjekten

Jochen

dranhängt, dann kann es halt

Jochen

sein, dass du halt, wenn du das naiv machst,

Jochen

kriegst du halt

Jochen

N plus 1 Queries

Jochen

gegen die Datenbank

Jochen

und das ist natürlich extrem

Jochen

fies und ein Haufen Performance-Probleme

Jochen

kommen genau deswegen, aber also in Django

Jochen

sagt man dann halt Select Related

Jochen

oder so, ja. Genau, dann

Jochen

zieht sie, oder Prefetch-Related

Jochen

für N

Jochen

zu M-Relationen und so, also das geht

Jochen

auch alles, man muss halt ein bisschen aufpassen. Machst du das am Model

Christian

oder musst du das irgendwann in der Query machen?

Christian

Das machst du an der Query.

Christian

Genau, bei SQL-Icon, wie kannst du das im Prinzip modellieren?

Christian

Da kannst du halt diese ganzen

Christian

Relationen alle ausdefinieren,

Christian

so mit diesem, auch so richtig mit

Christian

Vor- und Rückreferenzen

Christian

will ich die irgendwie als Listen oder Dicts kriegen

Christian

oder als Attribute oder

Christian

so ein Zeug und kannst dann halt sagen, so und

Christian

irgendwie die Richtung, die machst du bitte als

Christian

Eager-Load und die bitte nicht und folgende 10

Christian

Attribute bitte im Eager-Load wieder rauslassen

Christian

und das kannst du halt so alles

Christian

zurecht tunen, damit du halt dann möglichst

Christian

dummen, konkreten Query-Code

Christian

schreiben kannst, der über so ein Zeug

Christian

nicht mehr nachdenkt.

Christian

Und du kannst bei SQL

Christian

Alchemy auch sehr dynamisch,

Christian

die haben halt auch eine voll getrennte Schicht zwischen,

Christian

ich hab erstmal dieses Object-Mapping-Ding

Christian

und dann hat der nochmal eine komplette

Christian

Abstraktion über SQL drüber, das heißt

Christian

der kann dann halt die ganzen SQL-Dialekte

Christian

halt auch noch nach unten hin.

Christian

Der hat im Prinzip einmal SQL

Christian

in Form von diesem Bilder-Pattern.

Christian

Ja, da kannst du auch sagen, ich hätte gerne eine

Christian

Query, also Query, Klammer auf,

Christian

von folgendem gemappten

Christian

Objekt und dann Punkt

Christian

ähm

Christian

Filter

Christian

Punkt Join, Punkt

Christian

hast du nicht gesehen, immer so Funktions-Chains

Christian

hintendran und er baut dir

Christian

dann nachher tatsächlich einen für die Datenbank,

Christian

die du eigentlich hast, also Postgres und MySQL

Christian

ein syntaktisch korrektes und

Christian

optimiertes Query halt auf

Christian

unter Berücksichtigung von allem, was er über diese

Christian

Mapper weiß, was er gleich noch als irgendwie eager load

Christian

oder nicht machen soll und du kannst

Christian

halt mittendrin immer wieder die Ebenen

Christian

wechseln, ja, du kannst irgendwie im Object Mapping Teil

Christian

sein, drei Zeichen dann

Christian

von diesem generativen, also dann irgendeine Query mit

Christian

dem generativen SQL machen, da dann aber wieder

Christian

gemappte Objekte reinstecken und der kriegt das immer

Christian

so vor und zurück und vor und zurück

Christian

hat halt das Problem

Christian

wenn es, also es tut

Christian

sehr selten nicht, aber man muss sich halt dann

Christian

schon relativ viel mit, schon gut

Christian

mit dem relationalen Datenmodell auskennen,

Christian

um mit dieser Komplexität dann auch umgehen zu können.

Christian

Weil wenn es dir dann mal um die Ohren fliegt,

Christian

dann kommen da halt auch Fehler raus mit so,

Christian

was will der jetzt von mir?

Christian

Ja.

Christian

Naja.

Christian

Wir haben das in Projekten

Christian

eingesetzt, wo es halt teilweise um richtig, richtig

Christian

große Datenmengen ging und da

Christian

dann halt wirklich an diesen Stellen

Christian

alle Stellschrauben zu haben,

Christian

um das gerade zu ziehen,

Christian

das ist halt dann in dem Moment

Christian

extrem viel wert.

Christian

und umgekehrt das Active Record wiederum

Christian

du fängst halt an und hast sofort was, was du präsentieren

Christian

kannst

Christian

das entwickelt sich halt sehr schnell, das ist halt

Christian

super

Jochen

ja und dann, ich meine, das geht

Jochen

bei SQL Alchemy, ja auch

Jochen

ich meine, man kann ja auch immer noch dann einfach auf

Jochen

groß SQLs rückfallen, wenn halt

Jochen

irgendwas, wenn man irgendwas Spezielles machen

Jochen

unbedingt, ja

Jochen

ja

Jochen

da haben wir

Dominik

alle Patterns durch, tatsächlich

Dominik

Also du wolltest noch irgendwas zu Datenbanken sagen.

Dominik

Ich glaube, da gibt es noch so ein Solid-Modell

Dominik

oder sowas.

Jochen

Achso, nee, das ist dann nicht Datenbanken, aber das ist auch so

Jochen

genau...

Jochen

Ja, ich weiß nicht, ob das Patterns sind. Das ist eher so

Jochen

was sollte man, wenn man Dinge macht,

Jochen

sowieso beachten vielleicht.

Jochen

Das ist halt auch so eine ganz bekannte

Jochen

Geschichte. Ich weiß gar nicht, ob man es unter Pattern...

Jochen

Design-Prinzipien.

Jochen

Ja, ja.

Jochen

Was ist das denn?

Jochen

Ja, das ist

Jochen

auch etwas, was...

Jochen

Es gibt ja dieses Buch Clean Code von Robert Martin, Uncle Bob.

Jochen

Gibt es sowas auch in Python?

Jochen

Das ist, nee, das ist...

Jochen

Ich meine, ehrlich gesagt, ich bin ja ein bisschen peinlich berührt,

Jochen

wenn ich dann irgendwie so Observer-Pattern,

Jochen

keine Ahnung, habe ich schon mal gehört oder so.

Jochen

Bei den meisten Patterns ist es so,

Jochen

ich habe die schon mal gesehen, vielleicht irgendwann mal oder auch mal.

Jochen

Aber so wirklich viel zu tun habe ich mit denen ja eigentlich nicht.

Jochen

Also dieses ganze Thema kommt eigentlich eher

Jochen

aus so ein bisschen anderen Ecke der Softwareentwicklung.

Jochen

Und während das

Jochen

jetzt bei so Java-Geschichten oder so halt so

Jochen

ist, eben, da ist also

Jochen

für Juniorstellen irgendwie, wenn man

Jochen

sich da, wenn man dann im Vorstellungsgespräch ist,

Jochen

dann wird halt erwartet, dass man die alle kennt

Jochen

und ja,

Jochen

das wäre dann schon sehr peinlich, wenn man

Jochen

sagt, also ich habe keine Ahnung, was das eigentlich ist.

Jochen

Aber ja, zum Glück

Jochen

mache ich ja kein Java.

Christian

Ja, das Interessante ist auch, man kann

Christian

das Zeug ja im Alltag eben nicht

Christian

so benutzen wie

Christian

bei jeder Zeile Code, die ich schreibe, gehe ich

Christian

nochmal alle mir bekannten Patterns und Prinzipien

Christian

durch, ob ich die jetzt ja nicht verletze.

Christian

So funktioniert es halt nicht.

Christian

Und deswegen ist Pattern, glaube ich, auch für unsere

Christian

Kognition eigentlich ganz interessant.

Christian

Du willst aber, dass dein Gehirn eine ausreichende

Christian

Menge von so einem Zeug so dran trainiert hat,

Christian

dass wenn da irgendwie die roten Warnlämpchen

Christian

angehen, du halt weißt, Moment,

Christian

jetzt muss ich nochmal nachdenken, warum geht das hier schief?

Christian

Damit du dann halt wenigstens weißt, wo

Christian

du googeln musst.

Christian

Ich habe über Solid jetzt auch,

Christian

ich habe über Solid jetzt gerade nochmal schnell drüber geguckt

Christian

oh, das ist aber schon ganz schön alte Schule teilweise.

Christian

Also wenn ich halt

Christian

Liskov Substitution höre,

Christian

dann so, oh ja,

Christian

das Akademikerherz.

Christian

Das ist das L in Solid, ja,

Christian

das Liskov Substitution.

Jochen

Es ist halt auch alles relativ

Jochen

alte Geschichte und das macht halt in diesem

Jochen

Kontext von so statisch typisierten

Jochen

Programmiersprachen, macht das auch alles irgendwie

Jochen

gewisserweise schon Sinn,

Jochen

also durchaus und auch mehr Sinn halt

Jochen

vielleicht als bei Python, weil da viele

Jochen

Dinge einfach automatisch erfüllt sind, ne, also

Jochen

eben, ich würde sagen

Jochen

ja, ich würde

Jochen

Lischkows Substitution Principle

Christian

Ne, das ist ein Design-Thema

Christian

das musst du selber als Programmierer richtig umsetzen

Christian

Das ist

Christian

Typtheorie und das ist die

Christian

Aussage, dass

Christian

Objekte in einem Programm

Christian

also aller Programmcode, der Objekte verwendet

Christian

also mit Objekten arbeitet

Christian

sollte

Christian

immer in der Lage sein, alle

Christian

Subtypen dieser Objekte zu

Christian

akzeptieren, ohne die Korrektheit des

Christian

Programms zu verletzen.

Jochen

Genau, also ich würde jetzt mal so als

Jochen

konkretes Beispiel, wäre

Jochen

jetzt für mich sowas wie,

Jochen

man macht eine Vorschleife über Mitarbeiter

Jochen

und wenn man

Jochen

in der Vorschleife so

Jochen

Fallunterscheidungen macht, also

Jochen

nehmen wir an, man hat eine Typarchie,

Jochen

es gibt halt irgendwie eine

Jochen

Oberklasse Mitarbeiter und dann

Jochen

gibt es halt Konkretere, die

Jochen

halt irgendwie davon erben, also weiß ich nicht, irgendwie

Jochen

keine Ahnung, CEO

Jochen

oder irgendwie Senior Vice President

Jochen

Facility Management oder sowas

Jochen

und

Jochen

wenn man jetzt aber in der Vorschleife

Jochen

iteriert über alle und weiß jetzt nicht genau, welchen

Jochen

konkreten Typen man hat, man weiß nur, es sind halt schon

Jochen

irgendwie Mitarbeiter und macht dann Fallunterscheidungen

Jochen

wie, also, wenn das jetzt

Jochen

irgendwie, keine Ahnung,

Jochen

der CEO ist, dann machen wir aber folgende

Jochen

Ausnahmegeschichten, wenn wir jetzt zum Beispiel

Jochen

Gehalt auszahlen, wir rufen

Jochen

nicht einfach Gehaltauszahlen-Methode auf, sondern

Jochen

Wir sagen nochmal, okay, wir machen Speziallogik, je nachdem, was das denn für ein Typ ist.

Dominik

Also du weißt schon, dass der Senior Vice President Facility Management ein ziemlich stiller Witz ist.

Dominik

Wieso? Das ist doch voll wichtig.

Jochen

Also dann hätte man sozusagen, aus meiner Perspektive, hätte man jetzt eben Lischkoffs Substitution Principle verletzt.

Jochen

Weil eben der Code nicht funktioniert, unabhängig davon, was das für ein Typ ist, sondern weil man da noch überprüft wird.

Christian

Ja, noch nicht so ganz. Also Spezialfälle zu erlauben ist ja kein Problem, es muss bloß die Korrektheit gewährleistet sein. Aber Beispiel, wenn man zum Beispiel sagt, und Korrektheit ist tatsächlich auch immer eine spannende Frage von, das gehört eigentlich auch für mich dazu, im Sinne von erfüllt tatsächlich auch nachher für den User was Sinnvolles.

Christian

Und du sagst zum Beispiel, alle Mitarbeiter müssen eine private Telefonnummer haben und bei den CEOs legt man dann fest, nee, da ist die immer null, weil die privaten Nummern der CEOs werden nicht rausgegeben und das würde einem Subtyp entsprechen.

Christian

dann hättest du halt in dem Moment das verletzt, im Sinne von, ja jetzt machen wir hier mal für Weihnachten die Telefonliste der Mitarbeiter fertig und machen die Secret Centers für hier und den kannst du anrufen, um noch ein bisschen was abzufragen und plötzlich kommen bei den CEOs halt da keine Telefonnummern raus.

Christian

Ja, nee, das war jetzt halt kaputt.

Christian

Und das ist eine Designanforderung

Christian

nicht von dem Client-Code, der damit

Christian

arbeitet, sondern das ist eine Designanforderung

Christian

von Objekten, von

Christian

Unterobjekten, von Unterklassen.

Christian

Von Subklassen.

Christian

Dass eine Subklasse

Christian

den Raum

Christian

der Möglichkeiten erweitern, aber nicht einschränken

Christian

darf.

Christian

Okay, das ist L.

Christian

Jetzt haben wir noch

Christian

S-O-I-D.

Christian

Das würde ich gerne

Christian

verschieben.

Christian

Ich habe vorhin schon meinen

Christian

Zungenbrecher

Christian

gehabt und wir haben heute etwas

Christian

Zeit, wir haben ja relativ gut

Christian

zeitig angefangen, mit dem

Christian

Nachteil, dass meine Technik heute ein bisschen

Dominik

Ja, du hast inzwischen durchführlich alleine geredet.

Christian

Ja, und auch bis wir zum Reden gekommen

Christian

sind, weil irgendwie hier

Jochen

alle gegen mich gearbeitet haben. Wir machen das einfach zu selten, wir müssen

Jochen

das häufiger machen.

Christian

Das stimmt. Sehr gerne.

Christian

wie gesagt, von meiner Seite

Christian

immer gerne. Wir müssen einfach immer sofort

Christian

den nächsten Termin ansetzen. Ja, das machen wir.

Christian

In drei Monaten. Schön, dass ihr aber

Christian

alle wieder eingeschaltet habt heute. Ja, genau.

Jochen

An der Stelle müssen wir uns eigentlich auch entschuldigen. Wir haben im letzten Monat

Jochen

irgendwie verbasselt, aber ich meine, es war viel zu tun

Dominik

und so. Ja, es war viel zu tun und zwar ein bisschen

Dominik

sehr. Corona. Ja.

Dominik

Ja, eigentlich wollten wir auch zwei aufnehmen,

Dominik

da ist wieder was ausgefallen und so. Ja, ja.

Dominik

Die Termin-Findungs-Koordinations-

Dominik

Schwierigkeiten kommen noch übrigens dazu.

Jochen

Ja, aber wir geloben Besserung, das kriegen wir auch schon

Jochen

irgendwie hin. Genau.

Jochen

Genau, nee, dann am besten,

Jochen

ja, wir haben ja auch schon echt viel Zeug gemacht,

Jochen

dann verschieben wir das mal. Solid ist

Jochen

ein gutes Thema.

Jochen

Ja, und halt auch noch so diverse Architektur-Patterns,

Jochen

halt so Repository-Pattern,

Jochen

Unit of Work, weiß ich nicht. Es gibt da ein

Jochen

schönes Buch, das sei dann schon sozusagen Vorbereitung aufs nächste Mal.

Jochen

CosmicPython.com

Jochen

Ich glaube, das heißt

Jochen

dann auch tatsächlich, wenn man es als Buch kauft,

Jochen

also kann man da online lesen.

Jochen

Ja, es ist halt auch

Jochen

Architectural Patterns for Python

Jochen

oder irgendwie sowas.

Jochen

Ist von dem, na, wie heißt er noch?

Jochen

Der auch Obey the Testing Goat geschrieben hat.

Jochen

Und einem anderen.

Jochen

Verdammt.

Jochen

Okay, weiß nicht mehr genau.

Jochen

Da kann ich eigentlich auch sofort nachgucken.

Jochen

Percival.

Jochen

Percival, ja.

Dominik

Kosmos ist die Opposite of Chaos.

Dominik

Aha, Kosmos ist die Opposite of Chaos.

Jochen

Genau, das ist auch einer der Gründe, warum ich dieses Pattern-Thema überhaupt irgendwie interessant fand, mal darüber zu sprechen, weil ich gerade momentan halt auch zum ersten Mal irgendwie so ein bisschen eine größere Geschichte habe, wo es einfach nicht reicht, einfach nur so Django-Modelle zu haben oder irgendwie so, sondern wo man das vielleicht trennen muss, irgendwie Business-Logik von.

Christian

Ja, das kannte ich noch nicht und das sieht aber tatsächlich

Christian

gut aus. Das sind so tatsächlich die Patterns,

Christian

die ich auch kenne, die in Python

Christian

gerne kommen. Unit of Work

Christian

ist so ein SQL-Alchemy-Ding auch, Event-Driven

Christian

und Message-Bus klingt gut,

Christian

Commands klingt gut,

Christian

Dependency-Injection ist super.

Christian

Das klingt interessant, das kommt in die Leseliste.

Christian

Super, dann haben wir auf jeden Fall

Jochen

auch noch eine Menge Stoff für den nächsten, für den zweiten Teil.

Jochen

Okay.

Dominik

Ja, wir haben einige zweite Teile noch offen übrigens.

Jochen

Ja, ja, Async muss man auch unbedingt

Jochen

nochmal dran.

Dominik

Ja, vielen Dank, dass du wieder da warst, Christian, Conny.

Dominik

Danke, dass ich dir bei sein durfte.

Dominik

Na klar.

Dominik

Und ja, schön, dass ihr reingeschaltet habt.

Dominik

Und gute Nacht, guten Morgen, guten Abend, gute und so weiter.

Dominik

Dann bis zum nächsten Mal.

Dominik

Bis dann.

Dominik

Tschüss.

Dominik

Ciao, ciao.