Puh. Okay, ich habe den Link auf dieses Video,
habe ich Ihnen auch ins Komsi gestellt.
Diese Veranstaltung dient ja auch dazu, Sie mit der Welt
da draußen der Softwareentwicklung, der Softwaretechnik ein bisschen bekannt zu machen.
Es gibt eine ganze Reihe von diesen Blogs, Streams,
was es so an neumodischen Kommunikationsmöglichkeiten gibt.
Ich kann Sie nur herzlich auffordern, also be part of it.
Nehmen Sie daran teil. Ob Sie das jetzt amüsant finden oder nur informativ,
also es lohnt sich auf jeden Fall, über den Tellerrand dessen,
so was wir ihnen hier vermitteln, also dass man mitzunehmen, was da draußen diskutiert wird,
weil doch viele Sachen also passieren, die wir ihnen,
wir vermitteln ihnen ja hier Konzepte, von denen wir hoffen,
dass die so tragfähig sind und ihnen so viel Futter geben,
dass sie die Diskussionen da vielleicht nicht alle, aber dass sie lernen,
also sich nicht nur an diesen Diskussionen, dass sie die zu rezipieren,
sondern dann gegebenenfalls auch, wenn sie dazu Lust haben, sich daran zu beteiligen.
Die Welt wartet darauf, dass sie sich, dass sie das tun.
Wo ich dabei bin, die Welt wartet darauf.
Sie wartet auf noch was anderes. Sie sind jetzt
zwei Semester lang, fast sind sie ja durch
Sind sie liebevoll betreut worden? Hoffe ich jedenfalls von
ihren SE1 und SE2 Tutoren, von den studentischen Hilfskräften.
Das Leben geht weiter. Auch wenn sie jetzt mit SE2 durch sind,
nächsten Winter geht es ganz konkret weiter und da wird es weitergehen mit RC1.
Und da hätten wir gerne sie,
weil sie sind die nächste Generation von SE1 Tutoren.
Wenn sie Lust haben, sagen wir mal,
wenn sie SE2 bestanden haben und sie Lust haben,
SE1 Tutor zu werden, dann melden sie sich doch bitte bei dieser Adresse.
Die dürfte ihnen auch schon aus anderen Kontexten bekannt sein.
Das ist nicht nur eine ruhmreiche Aufgabe.
Es gibt auch Geld. Ah, es gibt Geld und
es gibt also der entscheidende Teil des Links abgeschnitten.
Wenn sie eine Übungsgruppe übernehmen wollen,
dann sind sie 14 Wochen lang mit 5 Stunden pro Woche
zum Satz von 9,29 Euro sich beschäftigt.
Was 650 ergibt und wenn sie zwei Übungsgruppen übernehmen wollen,
dann ist es das Doppelte,
was sie an Zeit und Zeit
aufwenden und ein Geld dafür bekommen
Die 5 Stunden für eine Übungsgruppe, das,
was sie hier unten... Obstern, auf der letzten Zeile sehen,
die ergeben sich aus 3 Stunden Präsenzübung.
Das ist das Zeug, was sie jetzt,
also auf der anderen Seite mitbekommen haben.
Eine Stunde gibt es die sogenannte Betreuerrunde,
da treffen sich alle SE1, 2 Übungsgruppenleiter und einer Stunde,
die wir ihnen gönnen als individuelle Vorbereitung.
Wenn sie langsamer sind, brauchen sie mehr,
wenn sie schneller sind, brauchen sie weniger.
Das kontrolliert, glaube ich, keiner.
Also nee, das wäre zu viel Arbeit,
das zu kontrollieren
Also in diesem Sinne, Sie sind herzlich eingeladen,
wie viele Leute suchen wir? 40. Okay. 40. Das
ist ja schon mal eine Hausnummer, oder? Okay,
ja, dann hoffe ich, dass ich viele von Ihnen
nächsten Oktober sehe und Sie als Betreuer begrüßen darf.
Das dazu. Okay. So, jetzt zum eigentlichen Thema dieser Vorlesung.
Refactoring. Also Robert Zie Martin hat es ja kurz,
ich weiß nicht, ob Sie diesen Zyklus gesehen haben,
Bad Green Refactor, Red Green Refactor.
Das ist der Zyklus der Entwicklung bei Test-Driven Development.
Ich habe das vorhin schon mal so,
als ich das Video angefangen habe, schon mal kurz gesagt,
also die Idee von Test-Driven Development besteht darin,
dass man zunächst den Test entwickelt.
Also die Idee, die dahinter steckt, lautet,
überleg dir zunächst mal, was du implementieren möchtest.
Und diese Überlegung wird dadurch befördert,
dass man eben zunächst mal den Test schreibt,
der gelingen soll
Gegen was möchte ich denn jetzt eigentlich programmieren? Ich programmiere gegen einen Test und ich überlege mir halt,
was soll bei diesem Test, also was soll bei diesem Test herauskommen? Und wenn ich diesen Test geschrieben habe und ich lasse das das erste Mal durchlaufen,
dann schlägt dieser Test fehl,
weil ich habe das ja noch nicht entwickelt,
wogegen ich diesen Test dann laufen lasse,
dann entwickle ich das Stück Programm, so Gott will,
ist dann also der Test, also gelingt,
dann ist man auf der Ebene grün und das Refactoring bedeutet dann,
ich möchte, also das, was ich implementiert habe,
muss ich so umschreiben, dass es auch,
sauberer Code ist, damit nicht die Effekte eintreten,
die Robert C. Marcin jetzt gerade beschrieben hat, Messi Code,
Burnout, bloß nicht anfassen,
weil dann gehört es einem selbst,
dann ist man schuld und dann treten Effekte ein,
von die man nicht haben möchte.
Das Refactoring selbst ist, sie sehen hier die Definition und das
ist jetzt nicht Robert C. Martin, sondern das ist Martin Fauler.
Den Namen habe ich auch schon an der einen oder anderen
Stelle genannt. Also Martin, Fauler sollten sie,
wer von innen hat einen Twitter-Account, Es sind überraschend wenige.
Ich hätte jetzt vermutet, dass ich außer mir höchstens noch zwei,
drei Leute nicht melden. Und ich bin kurz davor.
Also selbst ich bin kurz davor, sowas zu haben.
Martin Fauler zu, wie Neudeutsch, Followen, ist,
glaube ich, keine schlechte Idee, weil der hat ein Talent,
komplexe, softwaretechnische Zusammenhänge, verständlich auszudrücken.
Also wenn es diesen Wissenschaftspreis, ich weiß,
vielleicht gibt es den auch im Englischen, also drücke komplizierte Dinge nachvollziehbar aus.
Dafür ist der immer ein Kandidat. Also der hat sich
vor allem im Bereich Softwarearchitektur Da schreibt er also sehr,
sehr nachvollziehbare Artikel. Und ich kann Ihnen das hier wiederum nur empfehlen,
also die, das zu verfolgen, womit der sich beschäftigt.
Also sie werden, wenn sie sich in der Richtung interessieren,
in Softwaretechnik, aber auch in Software-Architecture,
werden sie dem noch an der einen oder anderen Stelle begegnen.
So, Refactoring. Was ist das? Das ist eine
, wer von Ihnen studiert,
So, sie sind ja dann so ganz nah an der Betriebswirtschaft,
so wenn man so im industriellen Kontext, also sagen,
der Manager sagt,
ich möchte jetzt mal ein wenig Zeit und damit auch Geld haben für das Refactoring,
der sie vielleicht anschauen und fragen,
was kommt dabei raus und was sie dann sagen ist, nichts.
Keine nach außen hin sichtbare Änderung des Verhaltens, dieses Stück Software.
Und wird ja wahrscheinlich sagen, nö, dann nicht.
Dann implementiert doch mal lieber ein Feature. So,
dann sehe ich da, was habe ich was für mein Geld. Dann können sie ihm die Folie zeigen,
die Martin, die Robert Zee Martin gerade gezeigt hat,
nämlich wann, Produktivität runtergeht,
wenn man sich nicht mitunter, also das Refactoring,
also in Anführungsstrichen gönnt, das ist jetzt wirklich die falsche,
der falsche Begriff dafür, wenn man Refactoring,
nämlich das Aufräumen, so wie es da steht,
das Aufräumen ernst nimmt.
Jetzt müssen wir uns dem Ganzen, das ist so die generelle Idee des Refactoring.
Wir werden uns das jetzt noch etwas genauer anschauen.
Natürlich, deswegen sind wir hier und sie werden also an
verschiedenen Stellen wird ihnen ein K und ein Tee begegnen.
Deswegen ist es hier, also wenn wir uns über den Arten des Refactorings,
Arten von Refactorings und über die Tätigkeit des Refactorings jetzt gleich genauer unterhalten.
Deswegen ist das hier rot hervorgerufen. Also was bezeichnet man,
wenn man sich das näher anschaut, was bezeichnet Refactoring?
Das eine ist eine Klasse von Restrukturierungen. Also eine Menge von gleichartigen, restrukturierungen,
die alle dem Zweck dienen, den Code so weit aufzubereiten,
dass er für nachfolgende Änderungen besser geeignet ist.
Und sie sehen hier auch so ein Beispiel für eine von
diesen Restrukturierungen, also eine Methode zu extrahieren.
Es sind sogar zwei Beispiel oder ein Interface zu extrahieren.
Wir werden eine ganze Reihe von diesen Refactoring-Techniken,
werden wir kennenlernen und auch die Art und Weise,
wie die durchgeführt werden sollen.
Die Grundidee ist immer dieselbe. Sie wollen verhindern,
dass ihr Code an einen oder mehrere Bad Smells entwickelt,
beziehungsweise sie wollen verhindern, dass also sich diese Bad Smells zu einem Chaos entwickeln.
Sie wollen erreichen, dass durch die Tätigkeit des Refactorings durch
die Tätigkeit des Restrukturieren die hier so etwas metaphorisch,
blumig ausgedrückten Leichen im Keller verschwinden und aufgeräumt werden.
Das ist die Grundidee und ich kann das nur noch mal aus dem Video,
sie wollen ja Happy Programmers werden, also die Power haben.
Wir gucken uns jetzt, wir sind ja Freunde,
nicht der Leichen im Keller, aber die Freunde der Metaphern.
Was sind denn so Metaphern? Sie sehen jetzt mal eine
schlechte Metapher für Refactoring. Also es geht nicht um Dekorieren
. Es geht nicht darum, irgendwas hübscher zu machen,
sodass man sich wohler fühlt. Und es geht darum,
Also, dass der Code eine aus Ingenieurssicht eine nachvollziehbare Qualität hat und diese Qualität ist,
wir haben schon über verschiedene Arten von Qualität gesprochen.
Die Qualität ist das, was uns so quasi als Lebensversicherung dient,
dass wir nicht nur heute ein Stück Funktionalität abliefern können,
sondern on time, on budget mit Qualität,
auch morgen noch in der Lage sind, unseren Code so weiterzuentwickeln,
dass wir den Anforderungen unserer Benutzer und den Anforderungen der Qualitätssicherung genügt.
Also dekorieren ist zwar nett, aber ist nicht das,
worauf es ankommt
Öl raustragen, scheint uns die bessere Metapher zu sein. Ich weiß nicht,
ich frage jetzt mal lieber nicht, wer von ihnen noch nicht noch,
wer von ihnen zu Hause oder in der WG kocht,
weil das ist so, sind so Erfahrungswerte,
die man so beim Kochen sammelt, wenn man die nicht hat,
kann man diese Metaphorik hier vielleicht schlecht nachvollziehen.
Also wir wissen ja in der Regel,
also selbst sie hört sich jetzt so arrogant an,
aber auch sie wissen schon, so bei den kleinen Projekten,
die sie jetzt so im Übungsbetrieb hier durchführen,
sie erzeugen,
während sie programmieren Müll
Mindestens nach Selbsteinschätzung und spätestens, wenn also ihre Betreuer draufschauen und das,
was sie gekocht haben, als Müll bezeichnen.
Gut, das ist jetzt nochmal eine andere Geschichte.
Also sie wissen, was sie tun. Das hoffe ich
jedenfalls. Davon gehe ich jetzt mal stark aus.
Und wenn wir ihnen die Zeit geben würden,
dann könnten sie den Müll, den sie da angerichtet haben,
um eine Aufgabe zu erledigen, könnten sie denen auch refaktorisieren.
Würden sie ja auch tun, weil sie daran interessiert sind,
eine saubere Küche, ein sauberes Stück Code zu hinterlassen.
Das ist die Idee, die zugrunde liegende Metapher für
das Refactoring
Das, was die,
jetzt sind ja hier an der Universität und ich glaube,
das waren jetzt, also Patcher Culture ist von Architekten erfunden worden und die eine Idee,
die dem Refactoring, die das so nachvollziehbar macht,
warum das eine gute Idee ist, ist die sogenannte Broken Window Theory.
Das sind so Experimente, die, ich glaube,
so in den 70er, 80er Jahren des letzten Jahrhunderts wurden die durchgeführt,
bin ich mir aber wirklich nicht sicher.
Also so wie das Auto aussieht, könnte das jedenfalls zu dem Zeitpunkt gewesen sein.
Also man stellt so ein Auto in eine Gegend und das Auto
sei heile und es dauert dann einfach eine gewisse Zeit,
bis also jemand auf die Idee kommt,
ich klaue mal, das Navigationssystem oder so.
Das kann man dann, stellt man viele Autos, in viele Gegenden,
das kann man dann messen, das kann man empirisch nachweisen.
Okay, jetzt stellt man ein Auto mit einem,
von mir aus abgerissenen Außenspiegel, stellt man auch irgendwo in eine vergleichbare Gegend.
Dann ist es so,
dass vergleichsweise viel schneller das Auto in einem viel desaströseren Zustand ist,
als also das Auto, das keine sichtbare Schäden vorgewiesen hat.
So, diese Broken Windows-Theory sagt, also für Catelonga-Story-Short.
Während den Anfängen. Also pass lieber auf, dass alles ganz sauber bleibt,
weil das erzeugt also viel mehr Disziplin bei allen am Prozessbeteiligten.
Und deswegen auch, sobald irgendwo ein Graffiti entdeckt wird,
sofort weg damit. Weil wenn wir anfangen, das Zeug,
also die Wände insgesamt verrotten zu lassen, dann,
also geht der Prozess des Müll ansammeln, es geht viel schneller.
So, diese Theorie, was man so Theorie nennt.
Also dieses beobachtbare Verhalten wurde eben, das ist,
ich will nicht sagen 1 zu 1,
aber das ist doch im Großen und Ganzen, ist es übertragbar auf Softwareentwicklung.
Also wenn der Code erst mal so richtig verrottet ist,
dann hat man ja auch keinerlei Hemmungen mehr, noch mehr.
Also es macht ja dann auch keinen Unterschied mehr.
Also sich auch nicht mehr sauber zu verhalten, während man,
wenn man gleich den Anfängen wehrt und ständig damit beschäftigt ist,
seinen Code zu refactern, zu restrukturieren,
dann ist die Wahrscheinlichkeit dafür,
dass dieser Code verrottet,
Also es ist keine, dieser kurze Ausflug nur,
das sind alles keine, also fast alles,
was ich hier vortrage, so was so einen gewissen metaphorischen Beigeschmack hat,
ist nicht von der IT, nicht von der Softwaretechnik,
nicht von Softwaretechnikern, also genuin erfunden worden,
sondern ist eine Anleihe aus einer anderen Wissenschaft.
Wenn wir diese Idee verfolgen,
Refactoring ist also gut und wir sollten uns diese Zeit gönnen und wir können dann auch gegenüber Betriebswerten,
Wirtschaftsinformatikern, können wir Argumente, also wir Softwareentwickler,
nicht das Wirtschaftsinformatiker, keine Softwareentwickler sind, wir also argumentieren,
warum das auch betriebswirtschaftlich sinnvoll ist, ingenieursmäßig sauberen Code herzustellen.
Dann können wir jetzt eine Stufe weitergehen und die sogenannte Mechanik von Refactorings anschauen. So,
und die Mechanik bedeutet, das legt es ja auch,
das legt diese Metapher wiederum nahe,
das ist jetzt keine Kunst, so ein Refactoring durchzuführen,
sondern für jedes Refactoring können wir die 5, 7,
9, 12 Schritte angeben, die notwendig sind,
um dieses Refactoring durchzuführen.
Sie sehen hier so Beispiele, wenn also Was ist das hier?
Also so eine Reihenfolge, die sieht fast aus wie,
dass ihn, ich weiß nicht, wie sehr sie das mögen,
aber sieht fast aus wie ein Programmierdiktat, oder?
Das ist, ich will nicht sagen, dass wir die Programmierdiktat,
also dass das entlehnt ist aus der Mechanik des Refactorings,
aber die Idee erzeuge eine Klasse mit einem bestimmten Namen,
das könnte doch wirklich in einem Programmierdiktat vorkommen.
So, das müssen sie übersetzen können. Und für jedes Einzelne,
für jeden Einzelnen dieser Schritt,
jeder Einzelne dieser Schritte eines Refactorings sollte so zweifelsfrei und klar benannt werden,
dass es da eben wenig Interpretationsspielraum gibt
Du hast ja auch die Idee von Programmierdiktaten.
Also auch dieses Element, dieses von uns didaktisch,
pädagogisch eingesetzte Instrument, also findet man an anderer Stelle wieder.
Ich weiß nicht, ob das jetzt ihre Gefühlslage gegenüber Refactorings
positiv beeinflusst, wie dem auch sei.
Das ist ja... So, ein Beispiel für eine Mechanik
des für die Methode, für das Refactoring-Methode extrahieren.
Warum soll man, oder was bedeutet das?
Sie sehen das gleich auf den ersten Zeilen.
Naja, wenn jemand auf die Idee kommt,
eine Methode ist zu groß
So. Und irgendwo ist man da. So, zirkliedern von großen Methoden,
also irgendwas, was größer ist als 30, 40 Zeilen.
20 Zeilen, je nachdem, was für eine Komplexität dieser Code hat.
Dann soll das Refactoring Extract Method angewendet werden.
Und das Ziel ist es, diese Methode in,
also so weit aufzuteilen, dass sie eben in überschaubaren Einheiten darstellt.
Und jetzt kann man das so in Art eines Programmierdigitals,
kann man das halt wieder kümmern,
die Mechanik dieses Refactorings beschreiben
Wäre die neue Methode mit einem sprechenden Namen.
Okay, bitteschön. Übersetze. Wird wohl klappen. Kopiere
den zu extrahierenden Abschnitt in die neue Methode. Huhu,
kopieren, Code-Dublikate, Bad Smell. Also für den Moment,
so nehme ich das mal hin, das versteht man.
Suche in der neuen Methode nach Referenzen auf lokale Variablen der alten Methode,
mache diese entweder zu Parametern oder zu langen lokalen Variablen der neuen Methode.
Ja, verstehe ich auch. Kann ich machen, gesagt,
getan, übersetze und teste. Da sind wir wieder beim Test-Driven Development.
Da muss also der entsprechende Test geschrieben werden. So,
und dann kann ich in dieser Mechanik fortfahren, Und in der alten Methode,
den extrahierten Quelltext ersetzen durch den Aufruf der neuen Methode.
Übersetzung teste. In kleinen Schritten wird mit einer Mechanik
der Code, langsam aber sicher verbessert.
Das ist das Ziel. Und verbessern bedeutet in diesem,
also jetzt erst mal, was dieses Refactoring anbetrifft,
ich mache aus einer großen Methode anderthalb kleinere Methoden.
Na gut, sagen wir zwei. Es sagt in
keiner Art und Weise, was ist jetzt die Pragmatik?
Nach der jetzt die, nach der diese große Methodik unterteilt werden sollen.
Ob das die ersten zehn Zeilen oder die letzten zehn Zeilen,
also was so der Grund ist.
Aber wenn sie sich dazu entschieden haben, einen bestimmten Teil auszuextrahieren,
dann ist das die Mechanik, nach der sie verfolgen können.
So, Typen von Refactorings, was gibt es so für Refactorings?
So, Entschuldigung. Typen von Refactorings,
also es gibt also eine ganze,
also es gibt so ein Buch zum Thema Refactorings,
was ja zunächst mal ein Indiz dafür ist,
was man alles falsch machen kann
Wenn man große Systeme schreibt, so dass man die dann,
also dass es so ein Buch braucht,
um alle irgendwie für Refactorings zu beschreiben, ist ja eher ein Indiz dafür,
wie komplex ist das Geschäft, in dem wir uns bewegen.
Sie sehen hier mal ein paar Beispiele, für Arten von Refactorings,
die durchgeführt werden können und für die jeweils diese Mechaniken vorhanden sind.
Und die Hoffnung ist, dass also, wenn diese Refactorings durchgeführt werden,
mindestens, wenn sie sie kennen und sie angewendet haben,
dass dann ihr Code nachvollziehbarer nachvollziehbar und besser weiterentwickelbar wird.
So, eins wollte ich mal, habe ich hier nochmal rausgenommen,
einen Refactoring, nämlich das Screenfactoring von Werten, also zu Werten und Objekten,
jeweils also in die eine oder in die andere Richtung.
Das hat jetzt mehrere, sagen wir mal, zwei Gründe,
warum ich das hier, warum ich das hier aufführe.
Weil ich möchte nicht den Eindruck erwecken,
dass also wenn sie jetzt so gut refacted einen Code haben und sie sagen,
ich habe also neun von zehn empfohlenen Refactorings habe ich angewendet,
jetzt muss mein Code doch gut sein, das kann sein,
das muss aber nicht, also mindestens weiß ich,
also wir wissen gemeinsam etwas über Refactorings.
Warum das so ist, also sehen Sie hier,
weil es gibt einmal so ein Refactoring-Change Value to Reference und ein Refactoring-Change Reference to Value.
Jetzt können Sie sich fragen, ja, was denn nun?
Soll ich das in die eine Richtung oder in die andere Richtung refactern?
Und die Antwort darauf ist, im Großen und Ganzen kommt drauf an.
Was einem, wenn man unsicher ist, nicht wirklich weiterhilft.
Aber dazu sind Refactorings auch nicht da. Sie sind für denjenigen da,
der sich sicher ist,
eine bestimmte Entscheidung zu treffen wenn sie diese Entscheidung getroffen haben,
dann können sie mit einem Refactoring nicht mehr viel falsch machen,
weil die Mechanik ihnen ja sagt, was sie zu tun haben.
So, das ist der zweite Grund, warum ich ausgerechnet diese Refactorings hier,
oder die Seth Refactoring angesprochen habe, ist,
eben jener Martin Fauler greift hier mit seinem Refactoring eine Diskussion auf,
die wir hier auch geführt haben.
Oder die in der Werkzeugmaterialarchitekturblaupause auch so vorkommt. Wir unterscheiden ja zwischen Materialien,
also Arbeitsgegenständen, die eine Identität haben,
die einen Zustand haben, die veränderlich sind und Fachwerten,
die das nicht haben, die also absolute Werte repräsentieren.
Und das ist hier, würden sie diese Bleibwüste mal so lesen,
während ich hier vor mich hinrede, wenn sie diese Bleibwüste so ein klein wenig studieren,
ist das also die Zusammenfassung dessen, worüber ich letzte Woche gesprochen habe.
Reference Objects ist das, was wir als Materialien bezeichnet haben und Value Objects,
ist das, was wir als Fachwerte bezeichnet haben. So,
natürlich habe ich, also weil ich hier keinen Pitcher Kutscher mache,
sondern eine Vorlesung, habe ich das so auf Moleküldicke ausgewalzt,
aber im Großen und Ganzen, wenn sie das,
was ich immer beruhigend finde, ist, Das ist so diese Beobachtung,
die man auch in der Mathematik machen kann.
Also wenn anderthalb tausend Leute unabhängig voneinander den Satz bis Pythagoras bewiesen haben,
also mit verschiedenen Beweismethoden, dann kann man ziemlich sicher sein,
dass diese Ideen, dass die nicht falsch ist.
Wenn wir uns über Materialien und Fachwerte Gedanken machen,
ist das ja eine Sache, kann man denken,
das ist so ein gallisches Dorf, eine spinnerte Idee,
wenn jetzt aber jemand wie Martin Fauler auf die Idee kommt,
zwischen Reference und Value Object zu unterscheiden und ich kann eine Nähe zwischen diesen Ideen,
also zwischen seinen und unseren Ideen feststellen,
dann finde ich das halbwegs beruhigt,
Dann kann das nicht völlig falsch sein.
Also wir sind mindestens schon mal zwei. Und es gibt noch andere Leute,
die sprechen von Domain Objects. Das ist also auch synonym für Reference Objects. Value Objects,
Fachwerte, das sprechen eigentlich weniger Leute von, aber dadurch,
dass das hatte ich ja letzte Woche auch gesagt,
dass das in den Java-Sprachstandard übernommen wird, dass jedenfalls eine Idee,
dass es geht in dieselbe Richtung wie Fachwerte,
es ist nicht total dasselbe, sei es drum,
ist das auch eine Verstärkung, also unserer Sicherheit,
was diesen Gedanken anbetrifft.
So, wenn das schon so eine Mechanik hat,
das Refactoring, dann ist es ja, liegt die Frage nahe,
Gibt es eine Art von Werkzeugunterstützung für Refactorings?
Und da ist die gute Nachricht, das wird immer besser.
Das wird immer besser. Ich clips selbst, unterstützt ja schon
eine ganze Reihe von Refactorings. Und hier sind diejenigen,
die Werkzeuge, also hier sehen sie zwei Beispiele für Programmierumgebung,
ob das jetzt IntelliJ-Eclipse oder eine andere Programmierumgebung ist.
Dadurch, dass sich das Gedankengut über die Sinnhaftigkeit von Refactorings,
also immer weiter durchsetzt,
also wird auch die Werkzeugunterstützung für diese Art von Programmiertätigkeit
immer besser
Sie sehen hier noch so einen kleinen Ausflug, also in Richtung,
in Richtung C plus plus. Das ist ja klar,
also wer von Ihnen hat schon mal EC plus plus programmiert?
Also 12 Fraktionen, die sich da gefunden hat. Okay,
und mindestens Sie wissen ja, dass also C plus plus ist,
das Verhältnis, ich versuche das mal bevorsichtig auszudrücken,
auch für diejenigen oder mir klarzumachen,
die noch nicht in C plus plus programmiert haben.
Im Vergleich zu, sagen wir mal, dass das
normale Auto heutzutage hat eine Automatik. Das heißt also,
wenn sie auf das Pedal unten rechts drücken,
dann wird das Auto schneller und wenn sie auf das Pedal unten links drücken,
dann wird es langsamer.
Also viel mehr braucht man eigentlich nicht wissen. Während wenn sie
so früher in so ein Auto gestiegen sind mit einem unsynchronisierten Schaltgetriebe,
dann hatten sie schon mal drei Pedale.
Das linke Pedal hatte eine Bedeutung, wenn man das gedrückt hatte,
dann musste man irgendwas mit dem Arm machen.
Und was das ermöglicht, einfach so Sachen so,
man kann das Auto drehen.
Also nicht so,
sondern so drehen
So Sachen, die man im Alltag nicht so häufig macht.
Und man konnte aber auch so Sachen machen, die man im Alltag
immer macht, so anfahren, kann eine Schwierigkeit darstellen.
Man muss einfach viel besser sich mit dem Zeug auskennen.
Eine Sprache wie C Plus Plus ist wie ein Auto mit einem unsynchronisierten Schaltgetriebe.
Es hat nämlich zum Beispiel keine Garbage Collection.
Das ist so eine Entwurfsentscheidung, die haben die mal getroffen.
Bitte. Java ist wie ein Auto mit Automatikgetriebe.
Hat zum Beispiel eine Garbage Collection. Jetzt braucht man also
der Sprachumfang von C Plus Plus als hybrider Programmierschwaches
viel größer als der von Java als einer reinen objektorientierten Programmiersprache.
Braucht man natürlich für CPlus plus auch eine viel stärkere Refactoring-Unterstützung.
Und das dauert dann eben auch ein bisschen länger,
bis das also in den entsprechenden Programmierumgebungen umgesetzt worden ist.
Da kommt diese Sprachdiskussion, kommen noch viele andere Aspekte dazu,
was man, glaube ich, mitnehmen kann an der Stelle,
ist also, dass die Refactoring-Unterstützung als solche unbestritten ist und dass das immer mehr in Programmierumgebungen dann auch eingesetzt wird.
So, ein Punkt noch, wo wir schon beim Autofahren sind,
unabhängig davon, ob man Automatik oder mit Schaltung fährt,
der Zusammenhang zwischen Refactoring und Testen ist unmittelbar.
Wenn ich irgendwo hinkomme, weil mich jemand angerufen hat und gesagt hat,
es ist alles langsamer, unsere Softwareentwicklung,
das Programm hat nicht die nach außen hin sichtbare Qualität,
das heißt, es stürzt manchmal ab
Es ist langsam. So, dann komme ich mit meinem Werkzeugköfferchen
dahin. Und die aller, aller, allererste Frage,
die ich den Softwareentwicklern dort stelle, ist, wie hoch ist die Testabdeckung?
Und wenn die dann so 5 Prozent, doch,
da hinten habe ich auch noch einen Test,
also 5,5 Prozent,
dann kann ich eigentlich meinen Werkzeugköfferchen nehmen und wieder gehen
Das kann ich den Code und die Architektur, kann ich alles analysieren,
bloß dann kriege ich möglicherweise raus, das Ding ist verrottet.
Es ist erodiert, es ist gealtert.
Und dann gucken sich alle ein und sagen, ja,
ja, ja, wir sind schuldig, wir sind Sünder.
Aber wir hatten keine Zeit, ist alles gut, Leute.
Bloß, wenn ihr keine Testabdeckung habt, was wollen wir jetzt tun?
Wie wollen wir dieses Stück Software jemals auf eine solide Basis stellen,
wenn wir jetzt anfangen an der Stelle mit unseren
Factoring-Buch. Da nehmen wir jetzt Refactorings vor und
wir wissen nicht, läuft es dann nachher noch?
Ich hatte ganz am Anfang gesagt, Refactoring bedeutet Verbesserung der inneren Struktur,
ohne dass nach außen hin sichtbare Verhalten zu verändern.
Refactorings ohne Testabdeckung ist, ins Auto steigen,
nicht ohne Sicherheitsgurt, sondern mit einer Augenbinde.
Das ist eine Veranstaltung, also die kann man eigentlich nicht verantwortungsvoll durchführen.
Deswegen also auch dieser faulische Zyklus, Wir entwickeln den Test grün.
Wir haben das zu testende entwickelt. Refactory. Also diese beiden,
wir haben ja auch über Tests und J. Unit,
das müssen sie ja auch.
Und in den Vorgaben für SE2 ist es ja auch.
Also es wird nichts entwickelt, ohne dass ein entsprechender Test
dem entgegensteht. Also das sind so ineinandergreifende Techniken,
die sie hoffentlich nicht nur hier im Lehrbetrieb,
sondern auch nachher in ihrem Berufsleben anwenden werden.
Ja, das stimmt, was da steht.
Ja. Oder hätte ich aufschreiben können. Es sind ein,
zwei, drei, vier, fünf, sechs.
Einen Punkt fehlt, aber egal. Ja,
ich hoffe, ich habe ihn mit meinem Appell,
also für gute Softwarequalität und dem, was man tun kann,
habe ich ihn gehörig, ja, ich habe ihnen was gegeben,
was sie mitnehmen werden.
Und dann sage ich jetzt schon mal, schönes Wochenende.
Wir sehen uns nächsten Mittwoch zur letzten SE2-Vorlesung.
Vielen Dank. So,
da bin ich wieder
Heute ist eine ganz besondere Vorlesung. Nicht nur,
weil es die 13. ist, das war ja angeblich Unglück bringen,
sondern weil wir heute mal ein kleines Web-System testen wollen zusammen.
Ihr sollt also sozusagen in die Vorlesung heute eingebunden werden.
Wer von euch hat Internetzugang einmal handhoch?
Hat hier irgendjemand, oh ja, das ist doch gut.
Sehr schön. Okay, das ist also ein System,
das wurde von einem Bachelorarbeiter bei uns gebaut,
der ist auch heute anwesend und unterstützt mich heute
hoffentlich tatkräftig
Ja, mit diesem System soll es eben möglich sein,
dass ihr Fragen stellen könnt in der Vorlesung,
die hier sichtbar werden, dass ihr eine Abstimmung teilnehmen könnt,
dass ihr irgendwelche Anmerkungen oder Ideen hier reinschreiben könnt.
Und vielleicht trauen sich dann auch mal andere Leute in Frage
zu stellen, als immer dieselben fünf.
Okay. Gut, was mache ich denn jetzt mal als erstes?
Ah ja, genau. Betreuer werden, das interessiert mich
doch. Also ich habe hier so eine Abstimmung vorbereitet,
ob ihr Lust habt, betreuert zu werden.
Muss ich die irgendwie starten
Die ist schon gestartet, okay, also ihr seht,
wenn ihr hier oben auf diese Seite geht, hoi.com,
und hier ist noch so ein zusätzlicher Buchstabe irgendwo, das SE2 dahinter,
müsst ihr nicht unbedingt angeben, das kommt dann von alleine,
dann solltet ihr irgendwie die Möglichkeit haben, daran teilzunehmen.
Also wenn ihr Lust habt, SE1 betreut zu werden,
dann sagt ihr, ja, wenn ihr definitiv keine Lust,
keine Zeit habt, sagt ihr,
nein, und wenn ihr euch das zwar vorstellen könnt,
aber noch nicht so ganz sicher seid,
dann nehmt ihr vielleicht.
Aber das ist wahrscheinlich die Anzahl der Stimmen, die
bisher angegangen sind. Das ist ja schon ganz ordentlich.
20 Leute haben schon eine Meinung,
Oh, kann ja jeder eine Frage stellen,
wie beantworte ich das hier, ne?
Oh, so kurz die Antwort? Okay. Gut,
wir haben schon 29 Leute, die 40, das war ein großer Sprung.
Okay, wollen wir mal, ich glaube 40 reicht, oder?
Kann sich noch jemand melden, der noch abstimmen will,
aber technisch noch nicht so weit war, weil,
ja, ein,
ja,
wollen wir
bis 42 warten
Okay. Ja, ich glaube, 40 ist okay.
Muss ich das jetzt aktiv stoppen? Muss ich jetzt hier
stoppen drücken oder kann das weiterlaufen? Das muss einmal gestopft
werden, ne? Oh. Okay. Oh, 56
, wow. Dann klicke ich jetzt mal hier rauf.
Aha. Oh, das ist doch nicht schlecht.
44 Prozent von, ah, da steht es über die
absolute Zahl, das ist auch toll.
Also 25 Betreuer könnten wir sozusagen schon mal akquirieren,
alleine aus denen heute anwesen.
Ist doch nicht schlecht. Vielleicht sind auch noch ein paar,
vom letzten Jahr wollen wir vielleicht
nochmal machen,
das war auch
ganz nett
Okay. Ja, das freut mich, dass so viele
dazu bereit sind. Das sind ja so ungefähr jeder,
ist es weniger als die Hälfte. Okay. Vier von
neun, das wollte ich, glaube ich, sagen.
Okay. Okay. Ja, das freut mich auch.
Was haben wir noch? Kann ja jeder eine Frage stellen.
Ja, also die Leute scheinen viel Spaß zu haben.
Okay. Gut. Was wollte ich als nächstes
mit euch machen? Damit ich nicht durcheinander komme,
habe ich mal wieder einen Fahrplan für heute.
Das habe ich gemacht. Das habe ich auch gemacht.
Ah ja
, richtig
Was ich heute noch machen wollte mit euch,
können wir ja eigentlich gleich die nächste Abstimmung starten.
Genau. Also es gibt ein Buch, das habe ich
als Kind sehr gerne gelesen. Darf ich verraten, wie
es heißt? Ich verrate mir nicht, wie es heißt.
Ich weiß ja nicht, vielleicht sagt das schon zu viel.
Und ein Zitat an jedem Ende eines jeden Kapitels war,
doch das ist eine andere Geschichte und soll ein andermal erzählt werden.
Und die Frage ist, wer hat dieses Buch geschrieben?
Der Zusammenhang zur heutigen Vorlesung ist, ich habe so den Eindruck,
ich habe in vielen Vorlesungen, ja,
muss ich zu früh aufhören und wollte dann irgendwie noch Dinge zu Ende bringen,
zum Beispiel letztes Mal mit den Werttypen.
Und heute wollte ich mal so ein oder zwei
Geschichten zu Ende bringen oder zumindest weiterführen.
Okay, oh, zehn Leute kennen das Buch.
15 Leute. Also nicht googeln oder so, ja?
Nach dem Zitat. Ja, wir können ja mal
wieder gucken, dass es so ungefähr 40 werden.
30, ja. Oh. Okay, ich glaube,
das reicht. Dann schauen wir mal. Ja, sehr gut.
Neun von zehn Leuten wussten es entweder oder haben das,
es war vielleicht ein bisschen suggestiv, als ich erzählt habe,
dass ich das heute zu Ende bringen will.
Na gut, okay. Wer weiß denn,
wie das Buch hieß
Könnt ihr dann ja auch im Prinzip hier unten einfach reinschreiben,
oder? Soll ich die Frage einfach mal stellen?
Ich schreibe, nee, das ist eine Antwort,
wo kann ich selber eine Frage stellen?
Ganz oben. Hier? Okay. Wie heißt das Buch?
Hm, das funktioniert. Danke für deinen Post, okay?
Und jetzt müsste man die Frage ja irgendwo sehen.
Ah, hier ist sie. Mal gucken,
ob da irgendjemand drauf antwortet. Ob es irgendjemand war jetzt
Ja, solange das passiert,
wo ist denn jetzt die Frage, ah hier.
Ach, die fand jemand interessant, die Frage.
Das ist doch auch schön. Kuchen. Hm. Soll
ich nächstes Mal Kuchen mitbringen? Ich kann Snickers mitbringen.
Könnte ich machen. Okay. Zwei Leute finden die Frage
interessant. Okay, wir können mal am Ende gucken,
ob da was Spannendes bei rauskommt.
Ja, was wollte ich denn als nächstes mit euch machen?
Aber das freut mich, dass das alles zu funktionieren scheint.
Ah genau, ich wollte auch was zum Thema der
heutigen Vorlesung beitragen. Also zurück in die Clips, Bruchrechnung
Genau. Jo, die Equals-Methode. Die haben wir ja
letztes Mal zusammen geschrieben und es ist so ein Standardmuster,
nochmal kurz als Wiederholung. Hier hat man den Typ-Test,
der schaut, das Objekt, was da eingereicht wird,
hat das überhaupt einen sinnvollen Typ?
Ist das auch ein Rational? Ich kann ja nur Rationals
mit Rationals vergleichen und nicht irgendwie Rationals mit Konten oder so.
Wenn man sich davon überzeugt hat,
dass es der richtige Typ ist, braucht man einmal diesen Cast,
damit man dann auch auf die Rationaleigenschaften zugreifen kann.
Und dann kommt der eigentliche Vergleich. Und jetzt könnte man
schon sagen, eigentlich ist die Methode ein bisschen lang.
Also rein von den Anzahlzahlen jetzt vielleicht nicht, aber
hier passiert irgendwie diese Typ-Prüfung und so. Und das,
was ja eigentlich so interessant ist, passiert dann, hier,
auf die Idee kommen, lass uns das auch vielleicht aufteilen in zwei verschiedene Methoden.
Eine Methode, die sich nur hier rumkümmert zum Beispiel.
Ja, das können wir doch mal machen. Wollen wir erst mal gucken,
ob wir einen vernünftigen Test für die Equals-Methode haben?
Hier. Oh, und was ich vielleicht auch sagen sollte,
das habe ich völlig vergessen.
Jetzt musst du mir noch mal helfen. Wo können die
Studenten anklicken, dass sie verwirrt sind oder etwas interessant finden?
Ist das das hier? Nee,
das nimmt man in der 3. Achso,
dann gehe ich einmal ganz kurz in ein privates Fenster
Ah, richtig. Also ihr könnt, wenn ihr das irgendwie interessant findet,
was ich hier erzähle, könnt ihr auch interessant klicken.
Ich habe hier so ein Tacho. Soll ich
da mal einmal ganz kurz zeigen, damit ihr wisst,
wie er aussieht, hier, ne?
Genau, also diesen Tacho habe ich hier nochmal, ja.
Also 14 Leute finden das interessant, 17. Oh Gott,
ich weiß nicht, was passiert, wenn es mehr als 20 werden.
Und verwirzen offenbar auch einige Leute. Okay, ich schließe
den Tacho wieder, aber ich habe ihn hier eben sichtbar.
Okay. So, wo war ich stehen geblieben bei dem Test?
Wo ist denn mal ein Test für das Equals?
Habe ich da überhaupt
einen Test für
Hm. Wird ja irgendwo das Equals benutzt? Hätte ich jetzt eigentlich gedacht,
dass es irgendwo, hm, ja, nee,
das ist das In-Equals, das ist mit den Strings.
Hier haben wir es. Also,
es gibt jetzt nicht eine eigene Testmethode für das Equals,
sondern das wird eben benutzt,
weil ich halt hier erwartete Ergebnisse mit tatsächlichen Berechnungen vergleichen.
Okay, also was machen wir hier? Wir berechnen etwas,
wo irgendwie 15, 24. dabei rauskommen sollte und gucken,
ob da wirklich 15, 24 drüber rauskommt.
Hier berechnen wir etwas, wo 10 Leute rauskommen sollten und gucken,
ob das auch wirklich rauskommt und so ein ähnliches Spiel hier.
Hat irgendjemand Ja, vielleicht eine Anmerkung,
ob man das irgendwie, ob das verbesserungswürdig ist.
Also ich habe jetzt drei Tests, die testen.
Ob das rauskommt, was man erwartet.
Kann ich dafür nicht auch diese Heu verwenden.
Also könnte ich jetzt nicht hier eine Frage stellen. Moment,
wenn ich jetzt mit hier in einem privaten Modus,
aber ist ja eigentlich egal, eine Frage kann ich ja trotzdem stellen.
Ja, was ist an den bisherigen Tests in Bezug auf
Equals Verbesserungswürdig? Fragezeichen. So. Okay, ich kann es
ja auch nach heute stellen
Okay. Ah. Ah, das ist auch spannend.
Okay, hier ist ein bisschen Spam nebenbei,
was das bedeutet, weiß ich nicht. Ach ja,
das ist natürlich ein klassisches Problem von solchen Systemen.
Okay, bis jetzt wusste keiner, wie das Buch heißt.
Das ist ja schade. Doch. Muss ich auf,
hier. Hier? Einfach auf hier rauf?
Ah. Ja, genau. Ah, hier hat es
jemand auf Englisch gelesen, das freut mich. Ja,
das ist nicht richtig, das wird gleich mal down gevotet.
Okay, dann gehen wir doch nach oben.
Hier, ne? Ja. Ah, das ist eine
Antwort. Okay. Dann sage ich es vielleicht mal.
Was würde passieren? Wenn wir das Equals einfach so implementieren.
So. Alles ist Equal. Probieren wir doch mal.
Mal ausführen
Ja, läuft alles, ne? Das ist ja irgendwie nicht
so schön. Ja, was machen wir denn jetzt?
Ja. Damit wir auch berichten, dass wir den Namen der Plätze haben.
Das klingt sehr abstrakt. Kann man das in einem
einfachen Test... Hat jemand noch eine andere Idee?
Ich meine, wir testen bis jetzt nur den Fall,
dass True zurückkommt
Ja, irgendwie ist Shurt Ford und dann gibt es sowas wie A
Shurt Not Equals. Ich bin mir da gar nicht
so sicher, wie weit da Jay Unit ist.
Ich tue das mal nach ganz unten. Das ist hier
schön chronologisch ist. Public Voy, Test,
Nord Equals oder so, weiß ich jetzt nicht.
Könnte man hier nicht zum Beispiel mal testen. A Shurt,
ja, weißt du, gibt es sowas wie Not Equals?
Hallo? No, Defore Proposals. Ich komme kurz,
was ich hier oben alles importiert habe. Ich sage einfach mal,
ich will alles aus dem Paket importieren,
sonst kennt ihr das möglicherweise nicht, falls es das geben sollte.
Versuche ich nochmal. Ah, gibt es. Gab es
, glaube ich, nicht immer. Okay, A
Shurt Not Equals mit zwei Objekten
Ja, jetzt können wir uns mal irgendwelche nehmen.
Also Rashional Value of, keine Ahnung, fünf Siebtel.
So, also nicht gleich sein mit Rashional Value of
sieben Fünftel zum Beispiel, ja?
So, zwölf Leute sind verwirrt, kleines Update.
Oder in den letzten fünf Minuten waren zwölf Leute verwirrt.
Jetzt führe ich den Test nochmal aus und jetzt müsste er fehlschlagen, ne?
Sehr schön. Okay, was sagt mir eigentlich Joey 100?
Values, should be different? Actual 5 durch sieben.
Schade, dass er das andere nicht anzeigt.
Na gut, aber wir wissen ja, was das Problem
ist.
Gehen wir mal wieder hier rein und machen den Unsinn mal
wieder rückgängig. Und dann müsste der Test wieder laufen.
Und dann habe ich nicht, dann bin ich sozusagen überzeugt,
dass wir eine sinnvolle Testsammlung haben.
Und jetzt habe ich keine Angst mehr, das Equals anzupacken.
Ich traue mich jetzt hier mal, ja, das Equals anzupacken.
Okay. Okay, ich will also eine eigene Methode machen,
wo diese Logik ausgelagert ist. Wo fangen wir jetzt an?
Wollen wir erst diese Methode schreiben oder wollen wir so tun,
als wäre sie schon da und wir benutzen sie?
Ich glaube, ich schreibe sie erstmal.
Dann ist es eine Ecke weniger, um die
man denken muss
Soll ich die genauso nennen oder ist das verwirrend?
Ich nenne sie erst mal genauso, vielleicht ganz interessant.
Mal sorgen. Und jetzt kann ich diesen Vergleich,
weiß nicht,
ob ich euch den Trick schon mal erzählt habe,
wenn ihr die Alttaste gedrückt habt und könnt ihr mit den Causa-Tasten-Code verschieben,
dann müsst ihr nicht Steuerung X und Steuern V machen.
So, ganz nett. Okay, jetzt habe ich die Methode
hier unten geschrieben. Sie kriegt also bereits einen Rational Objekt rein.
Das ist also statisch typsicher auf jeden Fall in Rational.
Ich kann also direkt diesen Vergleich vornehmen.
Was fehlt hier oben jetzt noch? Ja, der Aufruf.
Also sagen wir mal, Return, Equals that.
So macht das so irgendwie Sinn
Okay. Danke für das mit der Alttaste.
Ah, ja, gern geschehen. Okay. So,
kann man das ein bisschen abkürzen? Diese Variable will ich
jetzt nicht haben. Moment. Ha, ich muss ja
erstmal den Test durch und haben wir nichts kaputt gemacht.
Immer zwischendurch testen. Wir haben offenbar nichts kaputt gemacht.
Das ist doch schon mal schön. So,
jetzt will ich diese Variable nicht haben, weg damit.
So, geht es noch? Okay. Was würde
eigentlich passieren, wenn ich das hier wegnehme?
Im queeren Standard. Ja, und dieser hier, die Standard-Equels-Methode, ne?
Da hätten wir eine Endlos-Rekordsion, wahrscheinlich irgendwann ein Stack-Overflow.
Okay, das ist also wirklich wichtig, dass ihr diesen Cast macht.
Okay. Das ist ein ganz interessantes Muster. Also,
wenn eine bestimmte Bedingung zutrifft, das prüfe ich also irgendwie als erstes,
trifft sie zu, wenn sie tatsächlich zutrifft,
dann prüfe ich auch noch diese zweite Bedingung.
Okay. Und wenn sie nichts zutrifft,
dann gucke ich mir die zweite Bedingung gar nicht mehr an.
Stattdessen gebe ich sofort Fouls zurück. Soll ich mal
eine Live-Abstimmung machen? Ich weiß nicht, ob ich das
so schnell hinkriege, wie man das kürzer machen könnte.
Ich will mal eine neue Abstimmung machen.
Mit welchem Operator? Kann Fred den Code auf eine Zeile kriegen? So,
das sind ja zwei bulische Bedingungen und kann man die irgendwie
so sinnvoll kombinieren, dass ich das Üff nicht mehr brauche?
Was gibt es denn da so vor Operatoren?
Was sind denn die Standarddinger? Oder nicht exklusiv oder gleich,
gleich, ungleich. Mir fallen mir gerade nicht ein,
ups. So, die erstelle ich jetzt. Okay,
jetzt ist sie erstellt und jetzt muss ich sie noch aktivieren
Hier. So, ne? Also das sind die Operatoren,
jetzt gehe ich nochmal zurück zum Quelltext,
dass wir euch das nochmal rüber überlegen können.
Also kann ich dieses If irgendwie, also diese Zahlen,
die Sinne? Kann ich das irgendwie zusammenschrumpfen auf eine Zeile,
indem ich einfach einen dieser vier Operatoren, sechs Operatoren verwende?
Dass ich also sozusagen diese Bedingungen und diese Bedingungen
einfach mit einem polischen Operator verknüpfen kann.
Das wäre eigentlich eine tolle Klausuraufgabe, oder? Ah,
wisst ihr, das kann ich dir nicht mit einer Klausur verwenden.
So, schauen wir mal kurz, wie viele Leute
schon abgestimmt haben? Da sehe ich das nur hier.
Ah, genau
Okay, immerhin schon 13 Leute, ich zeige den Quelltext
nochmal kurz, könnt ihr euch ein bisschen Gedanken machen.
Schaut mal kurz, wie der aktuelle Stand ist.
Ach so, falsches Dings. Ah, 25 Leute,
ja, wir warten zwar nochmal,
bis es 30 sind oder so,
sonst sind nachher nur die in der Abstimmung drin,
die es sofort wussten und dann verfälscht das wahrscheinlich das Ergebnis
und so,
weiß ich nicht
Oh ja, Dreisburg, okay. Ich glaube,
das reicht. Ich stoppe das mal. Dann schauen wir
mal. Oh, sehr schön. Ich bin begeistert.
83 Prozent haben die richtige Antwort genommen. Hm. Ist
das irgendein Anzeigefehler hier? Oder? Ah, nee.
Hm. Okay. Ich kann es größer machen.
Hier? Ah, okay. Aber irgendwie sind da nicht
alle sechs Optionen, oder? Wahrscheinlich wurden manche
gar nicht angeklickt und deswegen tauchen sie hier nicht auf.
Das kann natürlich sein. Vielleicht wurden nur vier überhaupt angeklickt.
Okay, kann man sich ausrechnen. Also 25 und 26, 29,
30. Ja, die anderen wurden einfach gar nicht angekriegt.
Okay, das und, und. Warum? Naja,
also damit hier True zurückgelefert werden kann,
muss ich ja erst mal in diesen Blog reinkommen.
Ich komme nur in diesen Blog rein, wenn diese Bedingung True ist.
Und dann gebe ich ja das zurück, was aus dieser Bedingung rauskommt.
Und da muss eben auch True zurückkommen, damit insgesamt True zurückkommt. Also nur,
wenn das wahr ist und wenn auch das wahr ist,
wird der True zurückkommen in allen anderen Fällen, wird er fort zurückkommen.
Ja, dann machen wir das doch einmal kurz.
Also, das returne ich und dann so einmal Steuergeschäft F.
Ob es nee, das Return gehört da nicht hin
Ja, kann man so machen. Muss man nicht. Oh,
ich finde das irgendwie ganz nett. Also ich prüfe erstmal,
ob es den richtigen dynamischen Typ hat und wenn es den hat,
dann prüfe ich anschließend noch,
ob es auch wirklich gleich ist mit dieser Methode.
Ja, okay, zwei Leute finden das interessant.
Gut. Das war also das. Das habe ich gemacht
. Ah, nächste Schritte, gleich die nächste Abstimmung.
Das macht ja Spaß. Genau. Ich wollte jetzt wieder
in die Klasse Rational, da wollte ich jetzt weitermachen.
Die Frage ist, was wollen wir da machen?
Wollen wir vielleicht Subtraktionen jetzt machen? Dann kommt man vielleicht
noch in den Bereich, es gibt negative Brüche,
das hatten wir vorher gar nicht, das Problem.
Oder wollen wir mal Ich tue ein String rein. Also irgendein String,
wo drin steht, eins, zwei, slash 3,
4. Und dann soll das eben interpretiert werden als 21, 34. Können.
Das ist, glaube ich, ganz nett.
Oder zum Beispiel, dass man verschiedene Regionals miteinander vergleichen kann,
welcher ist größer oder welcher ist kleiner.
Ja, man will vielleicht auch mal wissen,
ob ein Bruch größer oder kleiner ist als ein anderer und nicht nur,
ob sie gleich sind.
Das ist sehr häufig bei Wehrtypen, dass man so eine Funktion habe,
um sie irgendwie anordnen zu können.
Da könnt ihr sie in ein Order Z zum Beispiel reintun.
Okay, einer ist schockiert, dass nur 83 Prozent
die richtige Antwort posten
Ja, wenn es um Meinung geht, dann kommen die Stimme
immer sehr, sehr schnell. Das ist doch cool.
Ja. Ja, wir sind über 42, das reicht.
Dann schauen wir mal, was sollen wir machen?
Das ist das Value of String, ne? Okay,
kleine Mehrheit für, oder nee, eigentlich die eindeutige Mehrheit
für Value of String und dann können wir anschließend das Comperto machen.
Und das Minus findet ihr offenbar nicht so interessant.
Gut, dann machen wir das doch so.
Das Volk hat gesprochen. They you of String.
Test Riven Development. Wir schreiben erst mal einen Test.
Public Roll. Test, ja, aus String oder so
. Okay
Ach, wir können ja ruhig den Bruch nehmen, den ich gerade gesagt hatte.
Also ich erwarte, dass 21,34 Süssel rauskommt.
Wollen wir die auch Value offen nehmen? Wir können uns
gleich mal überlegen, ob wir die anders nennen wollen,
aber ich mache das jetzt erstmal so.
So eine Standardmethode, so. Ich glaube,
wir sind uns alle einig, dass das ist,
was wir machen wollen. Ich will also diese Methode schreiben,
die einen String reinbekommt und dann soll eben dieser Bruch dabei
letzten Endes rauskommen, okay?
Gut. Dann schreiben wir doch mal
diese Methode
So it. Shady wanted mit seinem Object.
Ich werde es nie verstehen. So, es springt da
wieder irgendwo anders hin. Ich weiß nicht, warum.
Okay. Habt ihr schon irgendein Hilfsmittel kennengelernt? Mit jemandem
einen String nehmen kann und schauen kann, ist er im richtigen Format?
Und wenn ja, will ich Informationen extrahieren?
Ja. Split? Sprint Def. Das ist das Gegenteil.
Damit kannst du Zahlen nehmen und sie in einen String umwandeln,
aber ich will jetzt ja das Gegenteil haben.
Das kann sogar sein, dass es sowas gibt,
aber damit kenne ich mich leider nicht aus
Hat Jörg Durstenforsch, du hast einen Vorschlag.
Reguläre Ausdrücke, gab es eine eigene Vorlesung drüber, ne?
Toll. Das heißt, wir müssen uns erst mal überlegen,
wie sind denn diese Strings generell aufgebaut?
Oh, ich habe hier eine Leertaste eingefügt.
Na gut, jetzt habe ich sie da reingeschrieben,
dann muss ich sie auch da lassen.
Okay. Ja, was haben wir denn da?
Also wir haben ja erst mal hier mehrere Ziffern.
Okay, das kriege ich, glaube ich, hin.
Also wir haben das immer gemacht, wir haben uns für
so einen Pattern gemacht. Pattern hieß die Klasse,
wie wir uns nennen,
fällt gar nichts Besseres ein
Und dann musste man das so schreiben. Und jetzt kann man hier
den regulären Ausdruck reinschreiben. Wie sage ich denn jetzt?
Ziffern. Oft, das kann ich ja eigentlich auch hier machen.
Ich stelle eine Frage. Meine Frage lautet, mit welchem Regulären
Ausdruck sagt man, ich will eine Ziff erkennen, Fragezeichen.
So. Okay, hier ist die Frage. Guck,
ob das noch jemand weiß oder vielleicht schummelt auch jemand
und guckt bei Google,
wer von mir
ist auch okay
Ach so, die Antworten,
sehe ich die Antworten wieder nur hier oder ist das egal?
Ist egal, oder? Die müsste ich auch hier sehen.
Da muss ich das irgendwie aufklappen oder so. Nee. Okay,
also ich kann das ja schon mal hier so mit drei Fragezeichen symbolisieren.
Ich weiß noch nicht genau, was da rein muss.
Dann dieser Slash, der hat keine besondere Bedeutung in
regulären Ausdrücken und dann dasselbe nochmal, ne?
Mal gucken. Ist da mittlerweile was angekommen? Ah,
okay, also die relevante Information ist hier, ne?
Backslash, Backslash, D sagt, ich möchte ein Digit haben,
eine Ziffer. Das ist korrekt, sehr gut.
Dollar Strack ist das PHP
APHP, alles klar. Da gibt es ja auch reguläre Ausdrücke.
Okay, ich sage also, backslash, backslash.de.
Ich bin, glaube ich, gar nicht so zufrieden mit
meiner, ups, mit meiner Testwahl.
Ich würde den Test einmal ganz kurz ein bisschen einfacher machen.
Ich will mal sagen, ein Drittel.
Könnt ihr euch vielleicht schon denken, warum? Okay,
das ist, okay, das ist der reguläre Ausdruck.
Wie ging das jetzt weiter? Sowas muss man
natürlich nachgucken, wenn man das wochenlang nicht gemacht hat.
Man sagt dann, ich will einen Metcher haben,
dazu sage ich diesen Pattern,
ich brauche einen Metcher und der soll matchen über diesen String
Wenn ihr das Thema gemacht habt, dann erinnert ihr euch.
Ich muss importieren. Und ihr müsst keine Sorgen haben.
Ich erwarte nicht. Hallo? Ich erwarte nicht,
dass ihr auswendig wisst, zum Beispiel in der Klausur,
wie diese ganzen Methoden heißen oder dass man sowas machen muss oder so, ja?
So, ich könnte mir vorstellen,
dass man vielleicht sowas bauen können muss,
aber ihr müsst nicht dieses ganze Java-Zeug drumherum machen.
Das wäre, glaube ich, ein bisschen viel verlangt.
Okay, jetzt haben wir diesen Match,
jetzt kann ich diesen Match auch fragen, ob er matcht.
Lieber Matcher, match du.
So, okay
Gesundheit? Wenn er matcht, dann wissen wir zwar,
dass er korrekt aufgebaut ist, aber ich würde jetzt ja
auch ganz gerne an diese Teile irgendwie rankommen.
Ich würde gerne wissen, was stand denn hier für
eine Server und was stand denn hier für einer Ziffer?
Weiß da noch jemand, wer hat heute noch nicht,
du hattest schon, du hattest noch nicht.
Capture Groups und ich glaube, das sind diese Klammern, oder?
Ich glaube, das sind die Klammern für Capture Groups.
Die Geschweifenklammern sind für Anzahl. Genau. Jetzt habe ich
also diese Capture Groups und jetzt kann ich darauf zugreifen.
Ich kann nur so sagen, String, Noom ist gleich,
matcher.group 1. Dann kriege ich also den String,
der hier stand
Und ich kann sagen, String Dan ist gleich Matcher,
ups, Group 2. Dann kriege ich den String, der hier stand.
Und es ist auch garantiert, dass sie da stehen,
weil sonst hätte der ja nicht gesagt, dass er matcht.
Das ist doch schon mal nicht schlecht. Okay. Habe ich
jetzt also diese beiden Informationen? Und was muss ich jetzt
noch machen? Ich kann jetzt ja nicht einfach sagen,
Beturn Rational Value of Num und Denn, warum geht das nicht?
Ich habe doch jetzt diese beiden Informationen und hier konnte ich
das doch auch wunderbar in diese statische Methode reinstecken.
Warum geht es hier
unten nicht
Du hattest aber noch nichts, im Blauen. Es sind
Strings. Wie mache ich denn daraus jetzt einen Int?
Genau, ne? Irgendwas mit Intridger Pars in.
Ich schreibe das jetzt mal hier rein.
Oder ich glaube, mit Value off geht's auch.
Ich weiß immer gar nicht, was da einfacher ist.
Ich nehme mal um das, was mir gerade einfällt.
So, ne? Okay. Gut. Ja, was
machen wir denn jetzt? Ja, wenn der Benutzer da
jetzt Unsinn reingesteckt hat. Das ist ein anderes Thema,
das lassen wir jetzt erstmal offen.
Ich mache mal hier To-do
Was machen bei unsinnigen Eingaben? Damit kümmern wir uns später.
So. Jetzt gucken wir erst mal, ob unser Test durchläuft.
Nochmal zur Erinnerung, wir haben ja gesagt, ich will,
dass aus diesem String eins, glaube ich, drei,
dass daraus dieses ein Drittel wird, also das korrekt passt.
Schauen wir mal, ob das klappt.
Okay, scheint zu klappen. Acht von acht Tests.
Vorher waren es nur sieben. Gut. Machen wir vielleicht hier
einstellige Zahlen, nenne ich das mal so, ja?
Okay, was sollte ich jetzt als nächstes machen?
Vielleicht mehrstellige Zahlen
Und dann nehme ich meine, nee, doch,
12, 34., hatte ich das, ist auch egal.
So, schauen wir mal, ob das funktioniert.
Das funktioniert jetzt noch nicht. Warum denn nicht?
Rashen. Warum funktioniert das noch nicht mit mehreren Zahlen?
Du, ja, nee, du hattest auch schon irgendjemand,
der noch nichts hatte. Du hattest, glaube ich,
noch nichts, oder?
Also,
das Wecker
Weggepresst. Also die, die ja im Traum heilen sind,
haben gewollt, haben sich bedient, viele zu machen.
Sehr gut. Es ist nur eine Ziffer,
dann kann ich auch eigentlich gleich mal eine Frage stellen.
Wie kann ich mehrere, hallo? Mehrere Ziffern erkennen.
So, könnt ihr mal drüber nachdenken.
Ob ich noch erinnere aus Vorlesungen, was war das,
sieben oder neun? Wo ist meine Frage? Ist das
ein bisschen langsam, das könnte an meinem Computer liegen.
Warum ist das so lahm? Hier. Ach, jemand
gefällt die Frage nicht. Aber ich finde sie wichtig.
Was haben wir hier? Wäre rein theoretisch... Nee,
zwischen diese geschweiften Klammern muss man ja Zahlenangaben machen.
Also man würde da sowas schreiben wie,
wenn mein Laptop Lust hat, zu antworten.
Nee, da muss ich es einfach mündlich sagen.
Ah doch. Nein, diese Klammern benutzt man so,
ups,
es ist langsam
Warum ist das so langsam? Ja,
also man tut normalerweise Zahlen in diese Klammern,
dass man sagt, irgendwie 4,6, das heißt,
es müssen zwischen vier und sechs sein.
Ja, warum das jetzt so langsam ist, das weiß
ich auch nicht. Ah, jetzt kann ich wieder.
Ich lasse es mal lieber. Jetzt habe ich das schon gesagt
. Vielleicht macht das das Ganze sonst nur noch langsamer.
Okay, gab es hier schon Antworten?
Oh, fünf Stück. Nochmal aufdrücken. Ah. Genau,
also das richtig, so kann man
es machen
Das ist jetzt die spannende Frage, ne? Plus wurde hier vorgeschlagen,
hier wurde Stern vorgeschlagen, das kenne ich nicht.
Ah, willst du eine bestimmte Anzahl von zu davon erkennen?
Mindestens eine beliebig viele. Das könnte man verwenden,
da könnte man also sagen, also 1, hm,
vielleicht acht oder so, mehr macht, glaube ich,
sowieso nicht Sinn, plus Sternchen beliebig viele plus,
mindestens ein A, jetzt, wir haben ja schon gesagt,
was es bedeutet, ne?
Richtig. Also mit dem Sternchen würde ich auch erlauben,
dass jemand gar keine Ziffern reinschreibt und zum Beispiel nur den Slash,
das wäre ein bisschen blöd,
dann nehmen wir doch den Stern, oder?
Ah, sieht ich mal, man kann auch das hinter
dem Komma weglassen. Das ist total super, dieses System.
Also ich habe schon so viel gelernt heute.
Gut, dann machen wir das doch mal.
Also, slash Specslash D plus, Specslash D plus.
So, das war die einzige Änderung. Also nochmal zur
Wiederholung. Das bedeutet eine Ziffer oder irgendeine Ziffer.
Und das bedeutet, was auch immer davor stand,
beliebe ich oft, aber mindestens einmal.
Ja, und man kann sich jedes Mal für eine andere Ziffer entscheiden.
Ja. Oh, durch Null teilen, daran habe ich
überhaupt nicht gedacht. Darum kümmern wir uns gleich.
Danke. Okay, aber der Test läuft zumindest schon mal durch.
Okay, wollen wir uns jetzt, ja,
was machen wir denn, wenn jemand durch Null teilen will
Gute Frage. Das müssen wir irgendwie abfangen, ne?
Ah, man könnte es im regulären Ausdruck schon verbieten.
Das gefällt mir sehr gut. Also du sagst,
die erste Ziffer darf keine Null sein,
es muss eins bis neun sein.
Und dann, die liebe ich viele Ziffern dahinter.
Hat jemand noch einen Verbesserungsvorschlag, ja? Es müsste der Stern sein,
weil eine Ziffer haben wir ja auf jeden Fall schon hier vorne.
Aber das können wir eigentlich mal direkt testen,
wenn ich es mit dem Plus mache,
müsste ja der Test mit den einfachen Ziffern
müsste dann ja fehlschlagen
Ja, seht your Test aus String einstelliges Zahlen,
geht jetzt nicht mehr. Toll, oder?
Dieser grüne Knopf, also der ist das wahrscheinlich.
Hat uns schon so oft das Leben gerettet. Nee,
den Test wollte ich nicht anfassen. Ich wollte den regulären
Ausdruck anpassen. So, und jetzt wird es sofort wieder getestet.
Ich habe nur eine Taste auf der Tastatur gedrückt und
sofort teste ich wieder. Ja. Ach, toll.
Ich habe ein richtig gutes Gefühl bei der Sache.
Gut, man kann also nicht irgendwie aus Versehen durch Null teilen.
Das ist doch ganz nett. Ja, was wollen wir denn
dann machen? Also momentan wird hier ein Hall zurückgegeben.
Was macht man normalerweise, wenn man irgendwie sagt,
nur bestimmte Eingaben sind zulässig, wenn jetzt jemand Unsinn eingibt,
dann will ich irgendwie Dem Klienten signalisieren,
dass das nicht so gut war.
Welche Möglichkeiten kennt ihr da, ja?
Ne Exception schmeißen. Warum muss man es mal tun?
Dann sagen wir doch mal Throw, New, Inlegal Argument,
Acception. So. Tja, ich weiß gar nicht,
man kann da, glaube ich, noch einen String angeben.
Ich vergesse das immer, ob man den Matcher um eine bestimmte Fehlerbeschreibung ergänzt.
Ich mache mal To-do, sinnvolle Fehlerbeschreibung. Tue ich jetzt
einfach mal hier rein. Dann erscheint die bei diversen Tests.
So, und jetzt kommt was Spannendes. Wie können wir
denn jetzt testen, ob bei falschen Eingaben tatsächlich diese Acception geschmissen wird?
Ah. Gleich wieder eine Frage stellen. Ach Gott,
das ist nicht so schnell, leider. Soll ich
den Browser einmal neu starten oder woran kann das liegen?
Also mein Browser tendiert leider dazu, manchmal langsam zu werden.
Das ist nicht nur bei diesem System so.
Ich versuche es erstmal so. Was wollte ich jetzt fragen?
Ah ja, genau. Nee, ich muss ihn,
glaube ich, einmal neu starten.
Das hat sonst, glaube ich,
keinen Sinn
Habe ich in, das muss ich auch wegtun.
So, dann versuche ich es einfach nochmal. Dafür muss ich
auch nicht eingeloggt sein, um eine Frage zu stellen.
So, mal sehen, ob das jetzt schneller geht. Ah ja,
was für eine Art Test oder wie nennt man einen Test,
der testet, ob eine bestimmte,
ob auf eine ungültige Eingabe mit einer bestimmten Acception
reagiert wird.
So, okay
Wie nennt man ein Feststätter? Okay. Oh Gott, interessant, null.
Tja, also testen ist wohl nicht das interessanteste Thema.
Wir gucken uns noch mal ganz kurz an,
wie der Code aussieht, den wir testen wollen.
Das ist ja der hier. Ich will also quasi testen,
wenn hier Falseby rauskommt, dann soll diese Exception geschmissen werden.
Ich kann ja vielleicht schon mal, was?
Hat jemand Nein gesaugt? Nein. Vielleicht gibt es mittlerweile
eine Antwort. Nee,
bis jetzt nicht
Fritz sollte die Fragen nach Beliebtheit sortieren. Warum? Ich
meine, ich kann es ja machen, aber hm.
Okay. Oh. Sehr gut. Das ist die richtige
Antwort. Und hier steckt es sogar, wie man es
in Jay Unit macht. Super. Das könnte man denken,
dass es sowas gibt wie Third West, aber tatsächlich,
man nennt es Negativtest und wir haben euch bis jetzt nie gezeigt,
wie man das macht Venture Unit.
Und so macht man es tatsächlich. Toll. Gut,
dann gehe ich wieder in meine Testplasse rein.
Und dann nenne ich das doch mal Test,
wie wir es nennen
Ungültiger String oder so. So. Und jetzt sag ich einfach mal,
Rational Value Off, zum Beispiel eins durch Null.
Das sollte ja nicht gehen. Und jetzt tut man nicht,
ja, hier rein und wie Code, der sagt,
ich es hörte, dass das irgendwie raced oder so,
sondern ich sage hier oben, expected, gleich illege,
argument, Acception, Pops.class.
Das ist jetzt wieder ein bisschen komisch.
Also diese sogenannten Annotationen kennt ihr schon,
also at overright habt ihr zum Beispiel kennengelernt,
habt ihr
noch was kennengelernt
Ad-Test. Und bei manchen Annotationen kann man eben Parameter übergeben,
wenn man so will, ja.
Und diese Parameter haben Namen und der Parameter heißt hier Expected und
der Wert dieses Parameters ist eben, ja, was ist das denn?
Also ihr könnt quasi jeder Klasse von Java sagen,
gib mir mal ein spezielles Objekt, was die Klasse an sich repräsentiert.
Was kann man mit so einer Klasse machen? Man kann sagen,
gib mir mal eine Liste deiner Konstruktoren oder gib mir mal eine Liste deiner Methoden oder so.
Und hier ist es einfach nur dazu da,
damit man sozusagen eine Art Typ übergeben kann an dieses Expected,
damit er weiß, ja, was wird denn erwartet,
welche Acception da geschmissen werden soll.
Das ist einfach so eine Sünde, ihr könnt sie auch einfach akzeptieren,
ihr müsst diesen technischen Hintergrund dahinter nicht unbedingt verstehen.
Das ist also wirklich Tada, unser erster Negativtest im SE-Zyklus.
Sowas haben wir vorher noch nie gemacht, das ist wirklich was Besonderes.
Okay. Gut. Wollen wir mal gucken, ob der auch durchläuft?
Zehn von zehn, das ist doch toll, ne?
Und wenn man das jetzt zum Beispiel vergisst,
ich kommentiere das mal kurz hier aus,
diesen Parameter, dann würde der Test nicht durchlaufen,
dann würde hier irgendeine Acception geschmissen werden und Jay Unit würde sagen,
Achtung, Achtung, hier ist eine Acception geschmissen worden,
damit habe ich nicht gerechnet.
Das würde dann so aussehen. Testungültiger String, Java,
illegal, argument acception to do, sinnvolle Fehlerbeschreibung.
Ach genau, da wollte ich ja jetzt noch einmal gucken,
man hier zum Beispiel den Matcher fragen kann,
was genau eigentlich der Fehler war.
Ich mache erstmal das nicht. Also ich habe das neulich
nicht gefunden, diese Methode. Ich hoffe jetzt einfach mal,
dass wenn ich Tour String aufrufe, dass dann was halbwegs Sinnvolles dabei rauskommt.
So ist der Kommentar. Was kommt mit dir in das Blut?
Nee, das ist richtig, aber ich wollte hier unten
die Fehlermeldung sehen. Hier ist sie ja tatsächlich.
Also hier seht ihr jetzt die Fehlermeldung. Die Fehlermeldung ist
Pattern gleich. Also man sieht einmal den regulären Ausdruck.
Ihr seht hier auch wunderbar, dass ihr nur einen Backslash
zur Laufseite sind und nicht mehrere
Okay, nee, so sinnvoll ist das leider nicht.
Schade. Vielleicht könnt ihr herausfinden, Sneakers für euch nächste Woche,
wenn da irgendwie stehen würde, nach dem Motto,
wie an dieser Stelle hat es geknallt oder so, ja?
Weiß ich nicht. Oder sagt das, die sind fünf?
Ich weiß es ehrlich gesagt nicht. Ich versuche das mal herauszufinden,
dass der Benutzer ein bisschen mehr Informationen kriegt,
wo denn jetzt das Problem war.
Okay, dann nehme ich jetzt diesen Kommentar wieder weg.
Wir wollen ja, dass diese Acception kommt,
was da jetzt die Meldung ist, ist jetzt nicht ganz so spannend.
Hoch? Oh, nein, was habe ich gemacht?
Ich wollte ja nur den Kommentar wegnehmen, aber nicht den Parameter.
Okay. Gut. Ach, das ist doch
ganz nett
So, was habe ich noch? Ach so, nächste
Schritte. Kann ich mir diese Abstimmung eigentlich nochmal angucken?
Ist die noch irgendwie... Dafür muss ich mich einloggen, oder?
Ja. Warum ist meine eigenen Fenster? Das ist ein
super Geheimpasswort. So. Okay. Also öffnen. Und genau,
da wollte ich nochmal sehen, wie jetzt hier die Meinung war.
Ob wir in den letzten fünf Minuten auch irgendwas Sinnvolles machen können.
Das haben wir gemacht. Ah, Comperto. Genau.
Sehr gut. Comperto wollen wir als nächstes implementieren.
Ja, dann schreiben wir doch erstmal wieder einen kleinen Test
Compare oder Test? Compare. So. Ja, jetzt müssen wir einfach
mal gucken, was tun wir da rein oder nicht.
Ich mache vielleicht mal drei verschiedene Tests.
Ich mache immer Test-Smaller. Ich werde also einen Test haben,
der testet auf ein gewisser Bruch kleiner als ein anderer.
Gut, dann sagen wir mal Folgendes.
Gibt es sowas wie Asserd Negative oder so, zufällig?
Ah, gibt es gar nicht. Schade. Dann muss ich
es mit Aserd True machen. Okay. Also ich sage zum Beispiel,
Aber wir haben doch oben so ein paar Brüche.
Ich nehme mal welche von da oben, dann muss ich sie mir nicht erzeugen.
Also nehmen wir mal ein halb und drei Viertel,
nehmen wir mal, ja. Da weiß ich,
glaube ich, auswendig, wie in welchem Verhältnis die stehen.
Also, one half, wenn ich das compare mit three quarters.
Ich weiß nicht, ob jemand diese Comperto-Methode überhaupt kennt.
Vielleicht sage ich es einfach mal ganz kurz. Diese Methode
liefert eine negative Zahl zurück. Wenn das kleiner ist als das,
sie liefert null zurück, wenn das gleich ist das,
und sie liefert eine positive Zahl zurück,
wenn das größer ist als das.
Und in diesem Fall, ja, was muss jetzt zurückkommen?
Eine negative Zahl, null oder was Positives
Ja. Eine negative Zahl. Aber ein halbes Jahr nur weniger.
Also da muss irgendwas, rauskommen, was kleiner ist als neu.
Okay, Comperto gibt es noch nicht. Ich mache noch mal
kurz die anderen Tests. Tests sind immer wichtig. Machen wir einmal,
ja, Equal, will ich es jetzt nicht nennen,
weil das Evil Zeiss schon so, hm, blöd,
wie nenne ich es denn jetzt?
Samekling so nach Identität, ne? Equalent. Und Greater
Okay, dann sagen wir mal, wenn ich One-Have mit
One-Have vergleiche, dann müsst ihr da null rauskommen.
Und wenn ich jetzt andersrum Three-Quarters vergleiche mit One-Have,
dann müsst ihr da was größer als neu rauskommen.
Okay. Dieses Comperto ist, greift man nicht so aus
dem Luftwehrenraum oder ist nicht nur eine Namenskonvention,
sondern man kann bei Klassen sagen, ich implementiere ein bestimmtes Interface.
Und dieses Interface heißt Comparable. Also ich sage mit,
ich bin vergleichbar. Jetzt muss ich das einmal importieren
Muss ich nicht. Ah, ich muss ein Typ-Argument angeben.
Also das ist vielleicht ein bisschen komisch, ja.
Also ich sage, die Klasse oder Objekte der Klasse
Rescional kann man vergleichen mit Objekten der Klasse Rescional.
Okay. Theoretisch könnte man da auch was anderes reinschauen,
aber es wurde, glaube ich, keinen Sinn machen.
Okay, at unemplemented methods. Gehen wir einmal runter, hier ist sie.
Und wir können uns einmal ganz kurz nochmal vielleicht angucken,
wie das oben aussah, also in, ah nee,
Quatsch, das ist ja ein Interface.
Kann ich Eclipse irgendwie sagen, ich will mir angucken,
wie das im Interface aussieht.
Ach, hier ist der Kommentar
Ich will einfach, dass ihr seht, dass er wirklich
dasselbe noch mal steht. Seht ihr das hier?
Returns in negative Initure, Zero, Oppositive Editure,
ands of this object is less land equal to algreator.
Denn the specified Object. Also wenn ihr das irgendwann mal vergesst,
könnt ihr einfach nachgucken in dem Interview, wie ist denn diese Konvention?
Okay. Tja. Und jetzt irgendwelche Vorschläge von eurer Seite
. Woher wissen wir denn, ob ein halb kleiner,
größer oder gleich zum Beispiel Dreiviertel ist?
Kann man da irgendwas ausrechnen oder wie entscheidet ihr das, ja?
Was für eine Methode? Mit einer Minusmethode und dann
gucken, wie das Vorzeichen ist oder so
York, das könnte man machen. Und wenn ich eine
Minusmethode noch nicht habe, irgendwelche anderen Vorschläge, ja?
Ja, die Opa-Methode, die 40 Feiern, das ist die Gleichzeit.
Ich gebe Urlaub, da zählt ein eigenes. Wir geben
ein Buch bei den Minusmethoden. Das ist ein Feiern.
Und jetzt, ich war, da geht für Minus Feiern.
Die ganze Welt. Du bist drei, drei,
vier, sieben
Okay, ich versuche das mal,
du hast jetzt sehr viel gesagt, das klang alles gut.
Also wir müssen erst mal das Verhältnis bilden, ne?
Das wäre also quasi this over that. Jetzt habe ich
das Verhältnis gebildet. Und jetzt muss ich prüfen,
ob es klein ist als eins oder größer als eins.
Okay, also quasi auch der Zähler kleiner als der Nenner.
Kann ich das so sagen? Genau, ne? Also wenn der Zähler kleiner ist,
als der Nenner, dann gebe ich einfach mal minus eins zurück,
kopiere ich mir das einmal kurz, ich bin faul,
wenn er größer ist,
dann gebe ich Plus 1 zurück und ansonsten gebe ich,
ja, null, das stimmt ja schon, ne.
Macht das Sinn? Ich führe einfach den Test aus,
wir haben ja die Tests geschrieben,
die werden uns ja hoffentlich auf die Finger klopfen,
wenn wir was falsch gemacht haben.
Oh, scheint es okay, okay. Ja,
ich habe dir das jetzt einfach mal so geglaubt, dass es geht.
Ich habe ja gar nicht Gedanken darüber gemacht.
Das Sinnvollste, was scheint sinnvoll zu sein?
Vielleicht gibt es noch eine einfache Möglichkeit,
dass man dieses Verhältnis nicht bilden muss,
aber das scheint mir doch ganz nett zu sein.
Ja, okay, wollte ich am Ende noch irgendwas machen.
Aber ich wollte mit euch Mainz-Reaper erweitern,
dass man Flaggen setzen kann, wisst.
Ach ja, eine Abstimmung wollte ich noch mit euch machen.
In welchem Modus bin ich jetzt hier gerade
So eine Anmerkung. Bin ich hier der Lecturer?
Ja. Ah, hier. Hallo? Genau. Da
, das wollte ich einmal wissen. Also,
wir haben ja in der Vorlesung einige verschiedene Projekte kennengelernt.
Ich habe angefangen mit Stack die ersten Wochen,
wo man so veränderlich und unveränderliche Stacks gebaut hat.
Dann hatten wir die Animal Farm, wo wir über Acceptions geredet haben,
was ist, wenn ich keine Internetverbindung habe?
Ich habe reguläre Ausdrücke erklärt anhand der Animal Farm.
Dann hatten wir irgendwann, als wir Entwurfsmuster hatten,
habe ich ein Projekt gehabt, wo man mit den Iterator erklären konnte.
Dann hatte ich eins gehabt, diese Excel-Klon, wo man
den Beobachter mit erklären konnte. Dann hatte ich dieses Gleitkomma-Zahlenprojekt,
wo man so Gleitkommazahlen eingeben konnte und dann hat man so Nachbar nach links,
Nachbarn nach rechts, Buttons und so, dass sie das erste Mal Actionlisten da kennengelernt habt.
Dann hatte ich dieses Mindstreeper. Und jetzt hatten wir
letzte Woche und diese Woche dieses Bruchrechnenprojekt.
Und mich interessiert einfach, welches davon hat euch am besten gefallen?
So könnt ihr euren eigenen Kriterienkatalog anwenden. Also ich habe
das meiste gelernt bei dem Projekt oder es war irgendwie spannend oder lustig
oder ich würde es zu Hause auch spielen oder so.
Ja, stimmt da doch einfach mal ab.
Da gibt es also keine richtige und keine falsche Antwort.
Das interessiert mich einfach nur
Wir warten mal wieder, bis das Platz ungefähr bei 40 ist.
Ich hoffe, dass in der Zwischenzeit niemand den Raum verlassen hat.
Ja, vielleicht kann man sich auch einfach nicht entscheiden.
Die waren alle so gleichwertig. Okay, ich glaube,
da kommt jetzt nicht mehr viel, ne?
Gut, dann stoppe ich das mal.
Ah, okay, 35. Was hat mir am besten gefallen?
Also vom Pädagogischen her fand ich das Bruchrechnen ganz nett,
weil man da dieses Test-Driven Development mal gesehen hat.
Aber mein Spear war, macht irgendwie am meisten Spaß.
Also ich würde die anderen Systeme zu Hause nie benutzen.
Mal gucken. Also mein Sweeper oder Bruchrechnen, ich vermute mal,
dass die Animal Farm auch recht weit oben ist.
Mal gucken
Und das ist wieder größer. So. Oh. Welches? Ah nee
, das ist meins wie bei dieses Blaue, ne?
Oh, 50 Prozent meins wie, aber das ist doch cool,
okay. Und 25 Prozent ist die Animal Farmer.
Die ist also auch recht weit oben. Okay. Und
dann haben wir hier noch den Stack mit irgendwie drei Leuten,
die fanden das irgendwie interessant.
Und was haben wir noch? Ja, der Rest ist,
glaube ich, nicht erwähnenswert, eine Bruchrechnung.
Hätte ich gedacht, dass das mehr Leute interessant finden.
Okay. Ja, wenn Mainstreeper so interessant war,
vielleicht können wir dann ja noch in der nächsten Vorlesung die Flaggen einbauen.
Mal schauen. Okay, ich möchte mich bei euch bedanken.
Ich möchte mich bei Julius bedanken für das Tool und ich
hoffe, ihr Leute, Leute.
Viel Spaß und bis nächste Woche