Average Process
Know0
Don't know0
Haven't started454
Flashcards in the set

Haven't started (454)

G
5051911386530f40b1ad9c1.51607372php0GkA5R.jpg
H
11934514366530f4347b56d0.82636523phpFgFpXx.jpg
G
12462287216530f5e0be4be3.44761627phpqXCwTg.jpg
H
3780388146530f60e1f17e9.00587630phpZHr80Z.jpg
V
14254129796530f6c2a14e63.38677511phpu8Bwzn.jpg
H
2351500086530f8451f6087.04305885phpGLtwaA.jpg
H
13668433626530f8773256d2.19102907phpnJ3LUH.jpg
H
9135941126530f942dcc576.73727801php6tbdtG.jpg
F
10994272226530fa48478af0.14596370php8UhU0n.jpg
H
12442470336530fe25177e98.94893724phpK0VGJ1.jpg
H
7687160356530fea5406fb9.06912716php0utVDX.jpg
G
980959899653100270c7809.20596080phpPhMd8U.jpg
G
684347382653100bd3307c8.06874741phpH5LUXT.jpg
F
97272126265310182815951.51905048phpGBZAB1.jpg
G
788400275653101e9776141.25479215php0MA9jk.jpg
G
1622099273653103b62dbbf0.88071842php42p9yF.jpg
Beispielfoliek sind nicht drin
K
17163765636531061abc4830.66051208phpubeALM.jpg
K
16509812646531067d1b7704.44515528phpRtaztA.jpg
cd..

Um ein Ordner zurückzuwechseln
Um ein
Ls

Um ordner zu listen
Nur
Touch

Für dateien anlegen
J
Nano (dateiname)

Um dateien zu bearbeiten

^ steht für strg.
Jo
rm

Zm löschen
J
mv (dateiname) (neuername)
K
rm -rf

Für verzeichnis
J
Git commit -m " Kommentar"

Sachen die zusammen gehören mit selben kommentar versehen
J
git checkout (hashzahl)

Git checkout master

Um auf hauptbranch zurückzukommen
H
Git log

Nur fürs repository
J
gitignore um z.b .odf dateien zu ignorieren
F
Mit git diff

Wird datei vom arbeitsbereich und repo verglichen
I
Git add -p

Um zu gucken was geändert wurde ?
U
? Für erklärungen von den Befehlen
U
916395805653ce8ae819315.92805553phpNxsaOA.jpg1372140389653ce8dfe9fbe7.31104103phpCM8njV.jpg
F
647202949653ce957183b46.40775244phpWozj2h.jpg
1772844747653ce96850a9f4.74690348php4jf6YW.jpg1642005985653ce97d346998.43698877phpnXPRvi.jpg
1936935381653ce9aa8faed1.00336983phpROcy9Q.jpg1588931038653ce9cb8c2826.69652168phpHFrZVw.jpg
1040395913653ce9f8440297.49386623phpkF9plq.jpg591907187653cea3ace63b7.50366868phpHbtIgo.jpg
G
1795512003653ceaf24ff545.10951450phpdLp7gl.jpg
1/4
2146326084653ceb075dcec4.52533084phpW83SJT.jpg372492008653ceb12151bd6.41128448php9DUCLZ.jpg
3/4
547372867653cebba251229.17033756phpyWlCST.jpg1129381554653cec0b3f2b24.57382172phpSTMrJT.jpg
U
977148765653ced864faa84.29525441phpqpn6mX.jpg
1/4
47589329653cedb723c054.07212281phptUzg8Z.jpg1035950726653cedfd47bdf1.38208509phpqExKPA.jpg
3/4
1044977786653cee64575d69.27991321phpumb0nv.jpg101121812653ceef382dab0.96946192phpmqRkFm.jpg
H
1213482655653cf27cb03a01.07932185phpFEOxm0.jpg
659319694653cf32c60cad3.83995839phpHgssf0.jpg1158786953653cf33a3b3b94.36931587phpZrzXUN.jpg
H
903178935653cf40e109041.69626087php1gaZGA.jpg
U
1699759837653cf44c853528.07259483phpLYGTUF.jpg
388404148653cf4b0004a55.15417666php6EsuTQ.jpg1793002904653cf4bd82ea15.51122584phpAQBwJq.jpg
451164189653cf51661d6a8.23741260phpCr6mqX.jpg930054390653cf523e1ae67.29960406php0XaMRQ.jpg
V
1689357636653cf66c21e851.49225309phpthrgo8.jpg
H
1846770589653cf6c4034da8.80678346phpQThHtN.jpg
1377580159653cf6ef222de7.84643592phpZrV93A.jpg854602834653cf6fe552ec5.29035436php3o5iz2.jpg
450870876653cfa50d74c93.06833821phplCjTsX.jpg1283448482653cfa60f1e871.44075255phps9L2UR.jpg
1134165479653cfae2e90761.31363375php3FExYb.jpg1646913007653cfacacdb9d1.76984411php9KZwJr.jpg
Kann im detached...
G
2014084810653cfba9a2f800.62046841phpKcUnLy.jpg
1267557038653cffbcb85567.87734380php2XMiD4.jpg1778286387653cffd7de4749.73235823phpq4NFDs.jpg
J
183386614653d26bf198908.65688228phpy85Sfc.jpg
Z
1717336753653d26db5d1f19.53683487phpD4SRsy.jpg
H
1043260977653d2714a23146.97110051phpwUVMm7.jpg
108095479653d275343c988.98870535phpu6M3I8.jpg1614241773653d276450dcb3.85944438phpcRnGOH.jpg
H
438663237653d28c4000079.85778082phpIPo7jG.jpg
G
171674879653d2a39161cf1.70207514phpYPpg8J.jpg
G
1844018266653d2aecde0087.91535524phpk9iKy2.jpg
F
675952799653d2b39be6629.43476598phpsSTIBy.jpg
776319792653d2c0346f788.04183846phpuQgtIx.jpg424104316653d2c14853241.07818233phpeMJJYM.jpg
Z
1538223094653d2c408589d8.40239972php3cAgra.jpg
G
217641365653d2c6300f6d3.63863000phpWf4sqG.jpg
Genau
634130995653d2cb1ad49a3.98799264phpjyy922.jpg
D
960757242653d2ce5f26e40.82298850phplJvMk4.jpg
R
1095225715653d2d29da0fb3.19389840phpGtQj07.jpg
G
495025177653d2d606ba998.64249289phpjToiwa.jpg
Was ist ein Remote Repository
1609647382653d2dd43b6df5.67834335phpeRNixr.jpg
C
1210112449653d2ea050de11.16624386php6bXmUV.jpg
F
1815034017653d2f241769b7.36800923phpIx2DMb.jpg
G
616762455653d3073ef0107.97474202phpNpDmyQ.jpg
818760982653d30a99e88c5.69304002phplsoyHl.jpg68418349653d30c0f1e7b9.55058262phpRvyFeT.jpg
1917551334653d314adee1b9.95130258phpV0e4q9.jpg281338648653d3158959a15.66780097phpMUDRC5.jpg
1848585436653d3186722d64.52752274phprtR1bs.jpg1417923882653d31931f9e60.48703563phpS5QgAm.jpg
301254443653d31fc3de375.97538387phpdqiA9U.jpg2084294108653d320a40a6b9.70651181phpr3DODg.jpg
338880851653d32dcdd7999.70736634phpd4uLfg.jpg473132233653d32f5728bf8.46876494php0LCVgr.jpg
B
387780408653d33195bfbd0.92840530phpBXlfZV.jpg
G
842782446653d333640a023.66871272phpCOaXjf.jpg
H
1784390091653d34ba543381.14222831phpwwmlJb.jpg
N
259673156653d34df113cf2.10693047php25UZEK.jpg
B
1827956899653d39684fbe79.28411104phpqC48ZN.jpg
1208527882653d3aa6a15f30.39208454php3MrVuE.jpg398642054653d3a9ac70d41.85670403phpf1OtAx.jpg
Origin/main bleibt bei c1 head nicht
H
2084151546653d3b961a4290.44817894phpAqkuAE.jpg
889542983653d3edbe1d8d8.37011320phpKoECM8.jpg1818615984653d3ee8f32cc2.28248801phpgAWt3H.jpg
B
1048595751653d3ff0075067.03134182phpDclmlY.jpg
H
236641326653d416361b910.22812206php7wyu1w.jpg
1309236446653d41cac53314.48821153phph8spF2.jpg1936580658653d41d7439282.75865517php7dxv0E.jpg
U
1780891292653d61aaa1d231.22033403phpysWmZg.jpg
Vor
1290878751653d62490e94a5.21645206phpJoJcJE.jpg
H
284363630653d7286c7f393.85701955phpj95BQh.jpg
Vor
2133661773653d7537090078.77378156phptNCZw6.jpg
1/3
63901523653d87603d7886.11887880phpXquz6A.jpg1946850064653d87642d8b80.87818815phpzqREgB.jpg
3/3
H
416838004653d8771da66a6.18591564phpjSkaSn.jpg
switch für branch wechseln
F
Bei git checkout ... wird headpointer dort hin gesetzt
H
git branch -D um branch und die commits davon zu löschen
U
Bei ls -ahl

Sieht man nur die Dateien die sich in dem branch befinden, wo wir gerade sind
X
Wenn man jz git rebase wip

Dann wird auch der feature branch verschoben.

Hätte feature noch einen ectra commit der nicht in wip ist dann würde der feature commit weiter existieren
X
Es kann mehrere Remotes geben
H
Mit git checkout bekommst du den letzten commitetten zustand einer datei

Git reset wenn du änderungen behalten willst
F
G
G
Mehrere Remote repositories

Um z.b

Den Zugriff auf das repo nur auf bestimmte Personen zu begrenzen.

Oder wenn man am rumprobieren ist und für andere Menschen unverständliche Dachen macht (erst später wird es dann sauber auf ein hauptrepo commited
G
Bei Refactoring soll sich das externe Verhalten nicht verändern
H
Änderung von sichtbaren funktionsnamen ist kein refactoring
F
Sagen sie mir wo sind hier die Effekte

Klausurfrage
B
Mutate tests

Verändern den Code dee funktion

Damit sollen möglichst alle Tests fehlschlagen.

Wenn Tests nicht fehlschlagen, dann waren diese keine gute Tests
U
Robustness beim testen
Fehler die vorkamen, als Test implementieren, sodass der selbe Fehler bei Änderung des Codes nicht nochmal auftritt
Test documentation
Tests können nicht veraltet sein wie Kommentare. (Zumindest sieht man wenn der Test fehlschlägt, dass was verändert wurde

Mit tests kann man den code besser verstehen

Wie werden funktionen aufgerufen?
Was sind Beispielwerte?
Test

Review
Wenn es tests gibt unf man bemerkt, dass ein Teil an nötigen Tests nicht abgedeckt wurde, kann der reviewer schneller sehen, welche Schwachstellen es geben könnte.

Bzw. Weis er wo wahrscheinlich weniger fehler sind
Test

Maintanance
Man muss keine angst haben dass ein recatoring das erwartete verhalten verändetrt, da dies die autoamtisierten Tests sofort anzeigen würden
Setup

Wenn die Software Effekte hat und z.b davon abhängt welche Dateien existieren, dann müssen diese erstmal hergestellt werden
D
46690118165a520d5eb8af1.59173566phpIUmCIM.jpg
Beim Teardown von Tests

Muss der alte Zustand vor dem Setup wieder hergestellt werden.

Z.b temporäre dateien wiederlöschen

Um nächste Tests Ordnungsgemäß ausführen zu können
X
SUT

System under test
F
Bei eigenen Typen muss man evtll eigene assertions implementieren
F
65082201565a52a40b38006.51194362phplagw3D.jpg
Flaky tests

Tests die ab und zu mal fehlschlagen

Liegt an Seiteneffekten
Jetzt
Fragile tests

Zu spezifische Tests

Tests müssen robust sein also nicht zu viele Details überprüfen
H
Specifitation based Testing
1. Verstehen was ist die Spezifikation

2. Programm ausführen (evtl source Code anschauen falls möglich)

3. finde Äquivalenzklassen , weil ein repräsentant die gesamte klasse abdeckt, d.h ein test reicht für jede klasse

4. Grenzen analysieren, da dort häufig fehler sein könnten

5. tests für äquklassen schrieben und für grenzen
6. Automatisier die
Tests. 7. von vorne anfangen
Bei den Testäquivalenzklassen könnte man dokumentieren, welche Art vok Gruppen dieser Test abbildet
Z
Am besten wählt man in den Test Äquivalenzklassen

Wo?
An den rändern zu ander klassen
Code coverage metrics
Misst den Zustand nur indirekt, da nur die abgedeckten Codezeilen berücksichtigt werden
Preconditions geben an mit welchen inputs der Implementierer maximal rechnen kann

Es kann sein, dass oft einfache Inputs gegeben werden, der Entwickler kann sich darauf aber nicht verlassen
F
Postconditions
Wenn Vorbedingungen gelten sollen Nachbedingungen gelten

Wenn vorbedingungen nicht gelten ist es egal was implementierer macht
Invarianten sind Eigenschaft während der Programmausführung, die davor oder danach gelten müssen

Benutzer und Implementierer sind beide dafür verantwortlich
J
Gefahr bei pre und post conditions
Man könnte in eine Endlosschleife kommen
Precondition

Require
Gut um sich zu schützen vor dem aufrufer

Verständlichere Fehlermeldungen
Asserts require ensure sollte was nicht haben?
Keine Seiteneffekte
Wenn invariante von public variable abhängen kann ein user diese z.b außerhalb verändern und so die invariante verletzen, deswegen ist der User auch verantwortlich
J
An der stelle ist die Invariante verletzt. Bei parallelisierung kann das zu problemen führen.

Wenn ein prozess z.b put ausführt dann wird prozeds gedwitched und der andere prozess führt get aus.
H
56755276865a6a727c29604.52837173phpgIlqiF.jpg
Valid refinement bedeutet
Man kann Verträge durch einen besseren Vertrag austauschen

Und alle inputs die im alten Vertrag möglich sind, funktionieren immer noch. (Es kann nur sein dass man noch mehr inputs geben kann, die es davor nicht gab)

Bei postcondition anders herum outputs können beschrönkter sein
(Ausser wenn im kommentar steht dass dieser output kommen muss, dann darf der nicht mehr gestrichen werden)
Ist valid weil bei interface vat steht dass methode addTax buyable zurückgebt

Bookvat implementiert vat

Addtax gibt ein buch zurück aber ein buch ist auch kaufbar
V
134089969965a6c05e92b789.37143340phpgOlIUj.jpg
Invarianten müssen im subtyping erhalten bleiben

Wenn es invarianten in klasse gibt
Und man erweitert die klasse und fügt neue methoden hinzu

Dann dürfen die Invarianten nicht verletzt werden. Die müssen weiterhin gelten
G
Unterschied zwischen privaten und öffentlichen Invarianten
Man unterscheidet häufig private Invarianten (private), die nur der Implementiererin bekannt sind von öffentlichen Invarianten (public), die sowohl der Implementiererin als auch dem Nutzer bekannt sind. Für letztere sind natürlich beide Parteien verantwortlich und können sich darauf verlassen.
Auf was muss man bei privaten Invarianten achten
Bei privaten Invarianten sollte die Implementiererin sicherstellen, dass der Nutzer diese nicht aus Versehen beobachten oder verletzen kann.

Zum Beispiel könnte eine private Invariante sein, dass ein Feld in einer Klasse korrekt initialisiert ist. Die Implementiererin kann dies zum Beispiel dadurch erreichen, dass das Feld im Konstruktor korrekt initialisiert wird und nicht von außen erreichbar ist. Alternativ wäre es denkbar im Vertrag der Klasse zu erwähnen, dass zuerst eine Initialisierungsmethode aufgerufen werden muss, bevor andere Methoden aufgerufen werden können. In letzterem Fall verschiebt sich die Verantwortung von Implementierung auf Nutzung, was allerdings häufig Fehleranfälliger ist.
Defensive programming
In der Praxis gilt es natürlich auch andere Kriterien zu berücksichtigen wie zum Beispiel die Robustheit gegen Fehlverwendung und Sicherheitsaspekte. Häufig werden die Vorbedingungen deshalb nochmals am Übergang von Nutzung zur Implementierung innerhalb der Software Komponente überprüft, auch wenn dies eigentlich die Aufgabe des Nutzers wäre (siehe auch "defensive programming").
H
138400059165ae5e63d19963.52451271phpZK27kT.jpg
5026829665b3b7e378f3e9.00186880phpZRdI3J.jpg74291281265b3b801003859.14232310phpzcADeh.jpg
J
4992072265b943105ba052.84069829phpvUtRsM.jpg
H
182348815065b9471210bc14.17164542phpzFThE5.jpg
G
194961545665b94761a6f671.16637102phpwBNGhJ.jpg
Bei print(e) kommt () raus
H
17178654065b94ab3c2fde7.67847040phpZMgc3L.jpg
H
152631976765b94ba062fbc4.65367399phpr2qwLz.jpg
H
142832256365b94ecc88c202.42510248phpkzUBuD.jpg
1/2
106326567765b9c7ca05b782.08951962phpgLojOp.jpg9713531665b9c7ddc48e95.20138024phpK76KR8.jpg
V
83488277865ba1ccc9aa855.60005134phpBDtADy.jpg
Race conditions nicht rennbedingungeb haha
J
116759435165ba1d3a4db2d2.88279335phpqKJpKV.jpg
J
151119656265ba269c3b7016.09154959phpZn5Tdf.jpg
H
124024536065ba278e774f67.57657082phpnQfyJv.jpg
V
189220360865ba2b42bcf334.10751247phpNcOKkr.jpg
H
5214383665ba2d40b339f0.32530369phpF5SloW.jpg
1/2
124650734665bab4138a3534.92745797phpoSiVKD.jpg50324404065bab427ab83a9.77770088php6lwdtX.jpg
H
134628183965bb150d7d5d34.59152931phpANU2Z9.jpg
V
21104188465bb653c01a807.56642954php32oERI.jpg
1/2
Gegenbeispiel
140743080165bb6aa3802869.74178758php6KYIcv.jpg9283782365bb6abb64cbe9.58855582phpG13GOr.jpg
Nenne die 5 Prinzipien von SOLID
68374987765bb9a39dbecd4.63162793phpG3gZ9e.jpg
Genau eine Sache zu erledigen

Die Wartbarkeit

nur die verantwortlichen Klassen sollen geändert werden.
Für was ist eine Komponente in SRP
verantwortlich?

Was möchte SRP an eine System verbessern?

Wie solten neue Funktionalität implementiert werden?
Angenommen wir arbeiten an einem Webformular und wollen bei einem Klick auf eine Schaltfläche überprüfen, ob eine angegebene Datei existiert. Wo sollte der Code zur Überprüfung hinzugefügt werden?

In dem onclick Eventhandler der Schaltfläche?
In der Klasse, die die zu sendenden Formulardaten serialisiert?
In der Klasse, die die Formulardaten validiert?

Was ist Problematisch an dem ersten
Der Druck auf die Schaltfläche führt zwar zur Validierung, eventuell gibt es aber auch andere Stellen im Code, die auf die Validierung angewiesen sein könnten.

wie testen wir die Validierung, wenn sie nur bei einem Klick ausgeführt wird.

Aus diesem grund überprüfung der Datei bei anderen Formularüberprüfungen in der entsprechenden Klasse ansiedeln.
Warum ist das Problem wenn man SRP verletzt
2 von 4


fragil — die Komponente hat mehrere Gründe geändert zu werden. Aspekte die eigentlich nicht von einer Änderungen betroffen wären müssen so eventuell trotzdem berücksichtigt werden.

schwer zu verstehen — die Komponente enthält verschiedene Aspekte, die individuell verstanden werden müssen. Eventuell werden diese Aspekte innerhalb der Komponente vermischt, was das Verständnis zusätzlich erschwert.
Warum ist das Problem wenn man SRP verletzt

Letze beiden gründe
schwer wiederzuverwenden — da die Komponente mehrere Verantwortungen trägt, ist es schwieriger, Teile davon in anderen Kontexten zu nutzen, ohne unnötige Abhängigkeiten oder irrelevanten Code mit einzuschließen. Dies führt zu einer geringeren Modularität und Flexibilität in der Softwarearchitektur.

schwierig zu testen — Komponenten mit mehreren Verantwortlichkeiten erfordern komplexere Testfälle, da für jede Funktion innerhalb der Komponente unterschiedliche Bedingungen und Szenarien getestet werden müssen. Dies erhöht den Aufwand für die Testentwicklung und -wartung und kann dazu führen, dass Tests weniger präzise sind, was die Qualitätssicherung beeinträchtigt.
Wann sollte man eine Komponente aufteilen?
Eine Aufteilung einer Komponente ist indiziert, wenn:

anzunehmen ist, dass sich Verantwortungen stets getrennt verändern
verschiedene Verantwortungen meistens von unterschiedlichen Nutzern verwendet werden (siehe auch ISP)
wenn wir manche Verantwortungen / Aspekte optional machen wollen
Gegen eine Aufteilung spricht, wenn:

anzunehmen ist, dass sich die Verantwortungen meistens gemeinsam ändern
verschiedene Verantwortungen häufig von Nutzern gemeinsam genutzt werden
alle Verantwortungen nicht-optional sind
Nachteil wenn man Komponenten zu stark aufteilt

Insbesondere führt das exzessive Aufteilen von Komponenten zu einem Entwurf mit einer vielzahl kleiner Komponenten, die jeweils wenig Implementierung enthalten. Hier ist an die Modularitätsvorlesung und Ousterhout's hinweis "Modules should be deep" zu erinnern.

Außerdem ist eine Aufteilung in mehrere Dateien mit einem zusätzlichen kognitiven Aufwand verbunden, da Programmiererinnen nun mehrere Dateien navigieren und öffnen müssen, um sich einen Überblick zu verschaffen
Was ist kohäsion
Wie zeigt sich kohäsion


Kohäsion (engl. cohesion) beschreibt, wie eng die Funktionalitäten (oder Teilkomponenten) innerhalb einer Komponente (z.B. Methoden in einer Klasse, oder Klassen in einem Paket) miteinander verbunden sind. Eine hohe Kohäsion in einer Komponente bedeutet, dass ihre Funktionalitäten eng miteinander verwandt und auf ein gemeinsames Ziel ausgerichtet sind. Dies zeigt sich zum Beispiel darin, dass diese Teilkomponenten sich vermehrt gegenseitig aufrufen.
Das SRP fördert diese hohe Kohäsion, indem es sicherstellt, dass eine Komponente nur eine Verantwortung hat und somit alle ihre Teile auf verschiedene Aspekte dieser einzelnen Aufgabe ausgerichtet sind.
Wie förder SRP Kohäsion
Warum ist lose Kopplung erstrebenswert

Wie unterstützt das SRP
Kopplung (engl. coupling) hingegen bezieht sich auf das Ausmaß der Abhängigkeiten zwischen verschiedenen Komponenten. Eine lose Kopplung ist erstrebenswert, da sie bedeutet, dass Änderungen in einer Komponente minimale oder keine Auswirkungen auf andere haben.

Das SRP unterstützt lose Kopplung, indem es verhindert, dass eine Komponente zu viele Verantwortlichkeiten übernimmt, die möglicherweise starke Abhängigkeiten zu anderen Teilen des Systems schaffen würden.
Vorteil von SRP
Das befolgen von SRP kann also zu einem Entwurf führen, in dem die Komponenten hochkohäsiv und lose gekoppelt sind. Dies wiederum führt zu einem wartbareren, erweiterbaren und robusteren System, in dem Änderungen effizienter durchgeführt werden können.
Was ist Directmapping

Und was ist der Unterschied zu SRP
Das SRP hängt auch mit der Modularitätsregel "Direct Mapping" zusammen, die verlangt, dass technische Lösungen die Struktur des Problems widerspiegeln. Allerdings lässt sich das SRP auch auf interne Implementierungsdetails anwenden, die nicht direkt von Anforderungen des Endnutzers abhängen.
Was ist OCP
Offen für Erweiterungen. Es sollte möglich sein auf geänderte Anforderungen zu reagieren und Funktionalität anzupassen oder hinzuzufügen.
Geschlossen für Veränderungen. Es ist ausgeschlossen den ursprünglichen Sourcecode einer Komponente zu verändern.
Warum sollte funktionierender guter Sourcecode geschlossen für Veränderungen sein?
ode zu verändern kann zu neuen Fehlern in der geänderten Komponente führen, die eventuell vorher nicht existiert haben.
Sourcecode zu verändern kann zu Fehlern bei Nutzern der geänderten Komponente führen.
Sourcecode zu verändern ist unter Umständen nicht möglich, da der Sourcecode nicht verfügbar ist.

Das Problem hierbei ist, dass der Nutzercode der Entwicklerin, die die Komponente verändert, eventuell nicht bekannt ist. Wie soll sie sicherstellen, dass ihre Änderung keine Fehler bei den Nutzern eingeführt hat?1
Wie wird OCP umgesetzt
Beim Programmentwurf sind zukünftige Änderungen der Anforderungen zu berücksichtigen.


Welche Erweiterungen sollten unterstüzt werden
es sollte die Erweiterbarkeitsdimension gewählt werden, bei der es am Wahrscheinlichsten ist, dass Änderungen / Erweiterungen auftreten.
es sollte nur über einen Erweiterbarkeitspunkt abstrahiert werden, wenn es mehrere, verschiedene Anwendungsfälle (zum Beispiel 3 oder mehr) gibt.
Abstraktion ist ein mächtiges Werkzeug, um Software erweiterbar zu gestalten. Sie führen aber auch recht schnell zu zusätzlichem kognitiven Aufwand
Was besagt liskovshe Substitutionsprinzip
Informell heißt dies, dass Nutzer nicht von Objekten eines Subtyps "überrascht" werden sollen:

Bislang hat der Nutzer immer nur Objekte vom Typ T erhalten.

Der Nutzer konnte bisher beliebige Beobachtungen über diese Objekte vom Typ T machen, was dazu führt, dass seine Implementierung sich auf diese Beobachtungen verlässt.

Wenn wir nun einen Subtyp S einführen und dem Nutzer stattdessen Objekte vom Typ S übergeben, sollte dieser immer noch "funktionieren". Insbesondere sollten alle zuvor gemachten Beobachtungen auch noch immer zutreffen.
Wie könnte man lsv berücksichtigen
Ein häufig einfacher Ansatz das LSP zu berücksichtigen ist es konkrete Implementierungsdetails hinter einer Schnittstelle zu verbergen (siehe Vorlesung zu Modularität und "information hiding"). Offensichtlich können Methoden, die einem Nutzer nicht Verfügung stehen auch nicht genutzt werden, um Beobachtungen zu machen.

Eine alternativer Ansatz, der häufig dabei behilflich ist, das LSP wiederherzustellen ist es auf veränderlichen Zustand zu verzichten. Im Unterschied zur üblichen
Durch das Fehlen von "setter"-Methoden, kann diese Invariante nicht verletzt werden.
Smells bei LSP
Das Überschreiben von Methoden führt häufig zu einer Verletzung von LSP und sollte, wenn möglich, vermieden werden. Ein Sonderfall ist das leere Überschreiben von vermutlich nicht verwendeten Methoden, welches als "Verweigertes Erbe" (engl. refused bequest) bekannt ist.

Eine Subklasse, die in ihrer Dokumentation angibt, dass bestimmte Methoden nicht mehr oder nur in bestimmter Reihenfolge verwendet werden sollen ist häufig ein Anzeichen fragilen Codes.
Weitere Smells bei LSP
Veränderlichen Zustand von Basisklassen zu verändern führt häufig zu verletzten Invarianten sowohl bei Nutzern als auch in der Basisklasse selbst.

Zusätzliche Exceptions zu werfen wird zwangsläufig Nutzer überraschen, da diese nur die Ausnahmen der Basisklasse behandeln.
Wie kann man Vererbung vermeiden
Um Implementierungen wiederverwendbar zu machen ist es häufig besser sich an "Composition over Inheritance" zu halten und über Werte zu abstrahieren, anstatt Vererbung zu nutzen
Überschreiben von konkreten Methoden sollte möglichst vermieden werden
Vererbung kann gezielt verhindert werden (z.B. durch finale Klassen in Java oder den sealed Modifikator in Scala)
Inwiefern verbesser ISP modulrität
Modularität: Durch das Aufteilen von großen Interfaces in kleinere, spezifischere Interfaces ermöglicht das ISP eine bessere Modulbildung. Jedes Interface repräsentiert eine klar definierte Funktion oder Verantwortlichkeit, was die Lesbarkeit und Verständlichkeit des Codes verbessert. Module können unabhängig voneinander entwickelt, getestet und gewartet werden.
Inwiefern verbesser ISP Wartbarkeit
Wartbarkeit: Durch die Reduzierung der Abhängigkeiten zwischen Klassen und Interfaces erleichtert das ISP die Wartung von Software. Wenn eine Änderung an einer Klasse oder einem Interface vorgenommen werden muss, sind nur die betroffenen Module davon betroffen. Dies reduziert das Risiko Fehler einzuführen und erleichtert Debugging und Refactoring.

ist. Es fördert eine saubere Trennung von Verantwortlichkeiten, erhöht interne Kohäsion und reduziert die Kopplung zwischen Komponenten.
DIP
Module auf höherer Ebene sollten nicht direkt von Modulen auf niedrigerer Ebene abhängen. Beide sollten von Abstraktionen abhängen.Höhere Schichten enthalten hierbei typischerweise Domänenlogik, während untere Schichten für technische Implementierungsdetails verantwortlich sind.
Inwiefern zielt DIP darauf ab die Modulariät zu erhöhen
indem diese verschiedenen inhaltlichen Ebenen entkoppelt werden.
Was könnte passieren wenn ein Beispiel nicht DIP befolgt
zu schlechter Modularität führt:

Wartbarkeit: Änderungen in der Datenbankimplementierung erfordern eventuell Änderungen in BookingSystem
Wiederverwendbarkeit: Es ist nicht möglich die Datenbankimplementierung auszutauschen, ohne BookingSystem signifikant zu ändern
Testbarkeit: Es ist nicht möglich BookingSystem zu testen, ohne eine Datenbank aufzusetzen und diese mit entsprechenden Daten zu füllen.
Verständlichkeit: Um bookRoom zu verstehen, müssen sowohl technische Details, als auch Domänenaspekte verstanden werden.
ISP
Das DIP suggeriert, dass die höhere Ebene nicht direkt auf untere Ebenen zugreifen sollte. Stattdessen, sollte es die Dienste, die notwendig sind, um die höhere Ebene zu implementieren, in einer Schnittstelle beschreiben. Diese Schnittstelle ist dabei konzeptionell Teil des höheren Moduls, nicht der technischen Ebene. Die erforderten Dienste entsprechen den Vorbedingungen im Design-by-Contract.
Zusammenhang zu functional Core imperative shell
Auf Datenbanken zuzugreifen ist ein Seiteneffekt. Das in der Vorlesung zu Effekten behandelte Functional Core Imperative Shell Entwurfsmuster würde in unserem Beispiel zu einer recht ähnlichen Lösung gelangen. Zumindest würden wir hierbei über die Datenbank (hier MySQL) und ihre effektbehafteten Methoden executeQuery und executeUpdate abstrahieren.
Vorteile automatisierter Tests
Vertrauen. Tests stärken das Vertrauen in die Korrektheit der Implementierung (wenn auch nie vollständig).
Entwicklung. Häufig ist es schwierig als Entwickler alle Randfälle zu beachten. Unscheinbare Änderungen führen häufig Fehler in diesen Randfällen ein. Automatisierte Tests können dabei helfen diese Randfälle bereits während der Entwicklung zu entdecken und korrekt zu behandeln.

Wartung. Tests helfen dabei sicherzustellen, dass ein Refactoring wirklich ein solches ist. D.h. dass es nicht das beobachtbare Verhalten verändert.
Vorteile automatisierter Tests
Robustheit. Entdeckte Fehler können in Form eines (sogenannten Regressions-) Tests festgehalten werden. Dadurch wird sichergestellt, dass dieser Fehler nicht wieder durch Entwicklungsarbeiten eingeführt wird.
Dokumentation. Ohne Tests (und Dokumentation) ist es erforderlich den Sourcecode zu lesen, um zu verstehen wie eine Schnittstelle verwendet werden kann. Tests dokumentieren dies in ausführbarer Form und können dabei helfen fremden Sourcecode zu verstehen.
Vorteile automatisierter Tests
Reviews. Tests beschleunigen das Begutachten von Code, indem sie dokumentieren an welche Fälle gedacht wurde und was das erwartete Ergebnis ist. Die automatisierte Ausführung erspart es Reviewern diese Fälle manuell auszuprobieren.
Modularität. Automatisierte Tests zwingen uns häufig unser Softwaredesign anzupassen, um dies besser testbar zu machen. Zum Beispiel erfordern sie, dass wir Seiteneffekte isolieren (beispielsweise durch Functional Core / Imperative Shell) und Abhängigkeiten zu anderen Modulen konfigurierbar machen (um diese in Isolation zu testen). führen Tests häufig zu einem verbesserten Softwaredesign.
Kategosierung von Testarten nach Eigenschaften
159529433865bbe787a6d116.86861729phpBo0Hwo.jpg
Was ist granulatität
Die Granularität automatisierter Tests beschreibt den Umfang der Softwarekomponenten, die in einzelnen Testszenarien analysiert werden.

Die Auswahl des Granularitätsgrades ist somit ein Abwägen zwischen detailliertem Feedback auf Komponentenebene und dem ganzheitlichen Feedback, das das Zusammenspiel aller Teile der Anwendung berücksichtigt.
Feingrsnular vs grobe granularität
ermöglicht eine feingranulare Teststrategie eine punktuelle und isolierte Überprüfung individueller Softwarekomponenten. Dieser Ansatz liefert direktes Feedback über spezifische Funktionalitäten und trägt zu einer präzisen Fehlereingrenzung bei. Dies hilft uns insbesondere bei der Verbesserung der internen Qualität.
Grobe granularität
Im Gegensatz dazu bieten Tests mit einer gröberen Granularität umfassendes Feedback über die Interaktionen und das gesamte Verhalten der Anwendung. Im Extrem spiegeln sie die Nutzererfahrung in einer Produktionsumgebung wider und sind entscheidend für das Verständnis des realen Einsatzes der Software und damit für die Verbesserung der externen Qualität
Unit Tests
Im Fokus dieses Abschnitts stehen sogenannte Unit Tests. Wie der englische Begriff "Unit" bereits verrät, testet ein Unit Test eine bestimmte Code Einheit in Isolation. Die Granularität der Einheit kann variieren: von einzelnen Funktionen, über Klassen, Modulen, bis hin zu einem ganzen Paket.
Testsuite
Eine Test Suite besteht in der Regel aus mehreren Testklassen. Jede dieser Testklassen gruppiert verschiedene Unit Tests thematisch. Diese Aufteilung erleichtert das Auffinden der Tests, das Teilen und Wiederverwenden von Testinfrastruktur, sowie das selektive Ausführen aller Tests in einer Testklasse. Die
Testklasse 1/2
Eine Testklasse wiederum besteht in der Regel aus mehreren Testmethoden. Jede dieser Methoden folgt inhaltlich einer ähnlichen Struktur.

Setup. In einem ersten Schritt wird die Testumgebung in einem bekannten Zustand hergestellt. Beim Testen von einfachen Funktionen (insbesondere solche ohne Seiteneffekte) kann dieser Schritt häufig entfallen. Manchmal ist es jedoch erforderlich verschiedene Objekte in den richtigen Zustand zu versetzen, bevor ein Test durchgeführt werden kann.
Interact. Im nächsten Schritt interagiert der Test mit dem SUT. Dies kann z.B. durch Methodenaufrufe / Funktionsaufrufe geschehen.
Testklasse 2/2
Assert. Nachdem die Interaktion stattgefunden hat, wird überprüft, ob die Rückgabe dem erwarteten Wert entspricht.
Teardown. Im letzten Schritt wird die Testumgebung abgebaut. Dies ist insbesondere in Sprachen mit manueller Speicherverwaltung notwendig, oder wenn andere Resourcen wie Dateien / Datenbankverbindungen zum Testen verwendet wurden.
Wie heisst das testframework
Um die Funktion zu testen verwenden wir das Testframework Scala munit, welches wir als Abhängigkeit in unserer build.sbt Datei hinzufügen.
Testsmell
Flakytest
Flaky Tests schlagen scheinbar zufällig fehl und sind schwierig zu reproduzieren. Dies ist häufig der Fall, wenn Tests parallel ausgeführt werden oder Seiteneffekte haben (und zum Beispiel Dateien lesen oder schreiben, die auch von anderen Tests gelesen oder geschrieben werden). Wenn Tests immer wieder fehlschlagen, setzt eventuell eine Fehlerblindheit ein und Entwickler reagieren nicht mehr auf fehlschlagende Tests.
Not quite automatef tests
Not Quite Automated Tests erfordern manuelle Intervention bei jeder Ausführung. Zum Beispiel müssen eventuell noch Vorbedingungen manuell hergestellt werden, oder das Ergebnis muss noch manuell abgeglichen werden. Dies beschränkt die Produktivität und kann nicht automatisiert auf einem CI Server durchgeführt werden.
Fragile Tests
Fragile Tests müssen mitgeändert werden, wenn die Implementierung des SUTs verändert wird. Ein Beispiel sind Tests, die internen Zustand eines SUTs überprüfen, oder private Methoden verwenden. Tests die von Implementierungsdetails abhängen erschweren Refactorings und führen eventuell dazu, dass Entwickler Tests kategorisch ablehnen.
Slowtests
Slow Tests benötigen eine lange Zeit, um durchzulaufen. Dies führt eventuell dazu, dass Tests nicht oft ausgeführt werden und verlangsamt die Zeit bis Entwickler Feedback erhalten. Dies ist insbesondere während der Entwicklung entscheidend, da Tests wertvolle Rückmeldung liefern können.
Uselsess testd
testen keine interessanten Eigenschaften. Hierzu zählen doppelte Tests, sowie Tests, die unabhängig von der Implementierung des SUT immer erfolgreich sind. Um den letzten Fall auszuschließen, sollte man Tests einmal laufen lassen, bevor das SUT implementiert wird oder ein Fehler behoben wird, um zu überprüfen, dass der Test auch tatsächlich einen Fehler entdeckt.
Test Fixture
Der Begriff der Test Fixture kommt aus dem Bereich der Hardwaretests. Um Hardware sinnvoll in Isolation testen zu können ist es häufig notwendig spezielle Vorrichtungen zu konstruieren, die es erlauben das System-under-Test, d.h. die zu testende Einheit, einzuspannen
Integration Tests 1/2
Nachdem die Funktionalität einzelner Einheiten mit Hilfe von Unit Tests überprüft wurde, wird deren Zusammenspiel in sogenannten Integration Tests überprüft. Der Fokus von Integration Tests liegt somit nicht auf einem einzelnen Modul, sondern darauf wie verschiedene Module miteinander interagieren, um das gewünschte Verhalten zu zeigen.
Integration Tests 2/2
Der Testablauf des Setup, Interact, Assert, Teardown findet auch Anwendung beim Integration Testing. Jedoch findet jeder dieser Schritte auf der Ebene mehrerer Module statt.

Dadurch, dass Unit Tests vor Integration Tests laufen, sollten die meisten Fehler innerhalb einzelner Komponenten durch diese gefunden werden. Das Ziel von Integration Tests ist somit Fehler zu entdecken, die erst im Zusammenspiel auftreten. Diese Fehler könnten zum Beispiel auftreten, wenn sich Schnittstellen einzelner Komponenten ändern und diese Änderungen nicht überall beachtet wurden.
End to End tests
End-to-End Tests betrachten die Software aus der Perspektive der Nutzer und überprüfen somit die Funktionsweise einer gesamten Anwendung. Aus diesem Grund bieten End-to-End Tests einen guten Einblick in die externe Qualität der Software. Wie bereits öfters besprochen, unterscheidet sich natürlich die Art der Nutzer von Software zu Software.
Batchanwendungen
Batch Anwendungen, d.h. Anwendungen, die nur einmal gestartet werden und dann Berechnungen durchführen. End-to-End Tests simulieren hier häufig genau diese Nutzung programmatisch. Sie führen die Anwendung mit bekannten Eingaben aus und beobachten dann deren Ausgaben.
Interaktive Anwendungen
d.h. Anwendungen, die während der Programmlaufzeit auf Nutzereingaben reagieren. Das Testen von interaktiven Anwendungen gestaltet sich häufig etwas schwieriger. Es erfordert, dass die Testumgebung erkennen kann in welchem Zustand sich die Anwendung befindet und dass sie mit dieser interagieren kann. Eine Form von solchen Tests sind GUI Tests für grafische Anwendungen. Hier wird häufig das Klicken auf Schaltflächen und das Eingeben von Texten automatisiert.
End to endtedt

Api
d.h. programmatische Schnittstellen, die über ein bestimmtes Protokoll angesprochen werden. Ein Beispiel hierfür wäre eine REST API eines Wetterdienstes. Um diese zu testen würden wir Anfragen per HTTP an den Dienst stellen und beispielsweise nach dem Wetter in Tübingen fragen.
Golden Tests
Art von Tests, die häufig bei End-to-End Tests verwendet wird, sind sogenannte Golden Tests. Hierbei werden die Ausgaben einer Anwendung (z.B. Text bei Batch Anwendungen, Screenshots bei GUI Anwendungen) nach einer erfolgreichen Durchführung gespeichert. Der Golden Test führt die Anwendung dann wieder aus und vergleicht, ob es signifikante Abweichungen zwischen erwarteten Ausgabe und der erhaltenen Ausgabe gibt. Diese Tests sind besonders einfach zu erstellen, da häufig nur Eingabe und Ausgabe als Datei angelegt werden muss. Allerdings können Golden Tests (und End-to-End Tests im Allgemeinen) sehr fragil sein und zu "false negatives" (also fehlgeschlagenen Tests, denen aber kein Fehler zugrunde liegt) führen.
Blackbox test
Bei der Formulierung von Black-Box Tests wird in der Regel in den folgenden Schritten vorgegangen:

Spezifikation verstehen
Äquivalenzklassen / Partitionen identifizieren
Randfälle analysieren
Testfälle formulieren
White Box Test
White-Box Tests sollen uns dabei helfen den Zustandsraum einer Softwarekomponenten abzudecken

Konzeptionell können wir uns die Auswertung einer Funktion als Automaten vorstellen. Der Zustand der Funktion setzt sich hierbei z.B. aus der Belegung der lokalen Variablen und der aktuellen Ausführungsposition zusammen. Einen Berechnungsschritt durchzuführen bedeutet einen Übergang in dem Automaten zu machen.
Konzeptionell können wir uns die Auswertung einer Funktion als Automaten vorstellen. Der Zustand der Funktion setzt sich hierbei z.B. aus der Belegung der lokalen Variablen und der aktuellen Ausführungsposition zusammen. Einen Berechnungsschritt durchzuführen bedeutet einen Übergang in dem Automaten zu machen.
G
184487754065bc72f6abfb29.62352133phpXObYvt.jpg76842086765bc7346439d06.22171715php3Ptr8N.jpg
Condition Coverage
199067067865bc738bba67c5.71041051phphFcI49.jpg
Loop Coverage
194758687765bc73d1e927f5.83071738phpAHRvUN.jpg
Welche Spezifikationsarten von Tests gibt es
85253606265bc74c35023c1.78782226phpTp6Yko.jpg
71980114265bc757779f924.63431190php8TnfYx.jpg208839081765bc75b2be61d4.78260002phpcwH9cW.jpg
78934324765bc7685750b02.98048468phpGgWdfM.jpg26492931165bc768903fcb3.21335304phpOng7LR.jpg
Performance test
140155987865bc771eac6da4.15069049phpYlfQig.jpg
Load test
164203389865bc77a8dcd211.99683053phpOQ3VGp.jpg
Anforderungen Nutzer vs Implementierer
Beide Parteien haben unterschiedliche Anforderungen an die Komponente. Die Implementiererin würde zum Beispiel gerne Details in der Implementierung ändern können, um zum Beispiel neue Funktionalitäten umzusetzen oder Fehler zu beheben. Der Nutzer auf der anderen Seite möchte meistens genau das Gegenteil: es sollte sich wenig ändern, so dass der eigene Programmcode auch ohne Änderungen weiterhin gleichbleibend funktioniert.
Vorbedingungen Nachbedingungen
115815115065bc78e56842d1.03064331phprFk3OM.jpg
Invarianten
Eigenschaften, die von der Benutzung des Moduls (vom Funktionsaufruf) nicht betroffen sind

Eigenschaften, die während der Nutzung unverändert weiterhin gelten müssen
194245548865bc7b106edbe2.17951068phpba8TjR.jpg100596536065bc7b3d906a69.21697404phpSJ6xoI.jpg
Tradeoff

Starke postcond und schwache pre con

1/2
13714581265bc7d6b0d7e93.48155060php9leM94.jpg
Tradeoff

Starke postcond und schwache pre con

2/2
12328825265bc7da3e23f49.88162354phptTItr4.jpg
1/2
131116815465bcd357df54c7.60276010phpevou0F.jpg91351431465bcd3675918f2.80353721phpRGzxru.jpg
Komponente
205201181565bcd423d8d583.29546250phpCZ93lX.jpg
Interfaces
195311425965bcd5e2926809.13315444php3AGANO.jpg
Wie kann man Modularität verbessern
147338302365bcd6b7dcf2d1.95068672phpqvyXix.jpg
Modularität
It should be possible to add new features to a module, without affecting other modules.

keeping the dependencies low

avoiding cohesion of modules

Modular Maintainability== ::

Maintenance - fixing bugs, improving performance, (...) should not affect other modules.
Modular Decomposability ::
52718984365bcd9a5dfcd46.85259418phplI1vba.jpg
Modular Composability :
Beispiele: Software libraries
Unix shell commands
Software as a service
7807334165bcdafc665900.19263290phpxHTyJx.jpg
Modulair Understandability
152592983265bcdc1ab5dae0.56550095phpkADVUr.jpg
Modulair Understandability

Gegenbeispiele
60528496265bcdca71eaec2.30675705phpxNtxoU.jpg
Modular Continuity
49668858765bcdd90a94c67.45876912phpdk6mKh.jpg
Modular Protection
within the module anymore
103959288765bcde1574f656.09651079phpMTvRch.jpg
Rule 1 Direct Mapping
19109605265bce30ac8a922.09548853php4svsbm.jpg
Rule 2 Few Dependencies
with (A) we require all the submodules to build the modul in the middle

with (B) we require all modules to be present at the same time, deleting the possibility to have them used in another software system, without the other submodules

with (C) we require all of them as well, because each neighbour depends on its neighbours
169857944465bce3e0573853.71098785php6n6ilW.jpg
Small Interfaces
110990889665bce4bdc36e15.01239573phpgV3jrw.jpg
Rule 4 explicit interfaces
Whenever two modules A and B communicate, this must be obvious from the interface of A or B, or both. ==Signaling the dependency for communication within two modules in each of them.==
79901433465bce55d0b1067.29608586phpMM8Yke.jpg
We only provide a given portion of the whole dataset to the end user. ==Most information we use within the module, are hidden for the public usage area -- everything is hidden behind the interface==
55680242265bce6de7e4c56.82390833phpOOEzPM.jpg92789778465bce6efc88980.18214379phpKDlQ9d.jpg
B
12667967565bcf135811369.24460715phpiGPNJF.jpg
H
9681893865bcf423be3fd0.21419796phpil9q02.jpg
Warum pure Funktionen
174830403265bcf5364d77f3.60608739phpUbjkFU.jpg
H
182484745165bcf5ccf2cbe2.09912738phpT95MRJ.jpg
J
46087807465bcf5f06881d8.20782250phpdfzi4x.jpg
Idempotenz
10522153765bcf6a0159989.63987824phpI5GWXb.jpg
Reasoning in Presence of Mutable State
113730217365bcf95b166fb3.10915964phpsqfUiG.jpg
Global mutable state
166622783865bcf9f38fa935.09459739phpBWPQVR.jpg
Limiting mutable State
110927554765bcfa836f7521.81121813php2geHoQ.jpg
Limiting mutable State
76851224865bcfd96e36ce9.62825050phpGRYblY.jpg
Mutable vs immutable Datastructures
125554225165bcfef4046527.15407153phpwdalaI.jpg
Benefits of Referential Transparency
146236101165bcff3338e240.05342226php2vOf1b.jpg
Exceptions
213651935665bd00872325d1.42797166phpiEfJ1S.jpg
G
69341346565bd019624d478.95418132phpdRX7NQ.jpg
Welche Aspekte charakterisieren den Exception Handler Mechanismus
190765479265bd020a1818f4.59072383phpd5aTbs.jpg
J
185959002265bd0415db4d95.90640263phpV1eJs2.jpg
Checked exceptions
142148047765bd048ebe2695.47066133phpcZZzj7.jpg
How to present an error
163065790865bd051b0b7620.16101998phpDzeEhg.jpg
Exceptions: Best Practices
6385963365bd05d27c00f8.09335345phpTzwAYx.jpg
IO

Examples and problems
94665238065bd0618551114.39488718phpPINc4y.jpg
H
202278512665bd064e860440.64374679phpoElEym.jpg
H
110401602665bd06840f51f3.76773082phplTr3Tl.jpg
H
122664891465bd06b38cd696.16192570phpCtqIv6.jpg
Wie mit IO umgehen
209616917265bd0756c2cd46.81898993phpol8ZtY.jpg
Wie können Smells identifiziert werden
166512454965bd1c679035f9.49811120phpmP1QWv.jpg
Refactoring
9786505165bd1d96e7d0f6.22309954phpw5dmgT.jpg
Reasons for Refactorings
136980826965bd1df44bc625.93321069phpc8X5W2.jpg
Kann refactoring Semi automatisiert performed werden
120003573565bd1e5e1f8ac5.33572667php8Db12v.jpg
Refactoring extract methode
11216382665bd1ebde8f2d1.16159316phpkdfBAl.jpg
Ectract method

Preconditions
166007719865bd1f2a67be58.56112896phpIByzCD.jpg
Duplicated code

Smell
45230828365bd1fc22e5df4.60130838php7gAy4n.jpg
Mutable variables
157385436765bd2061aa7912.45818023phpncE8fp.jpg
Mutable Variables und invarianten
15338258365bd20e7132b34.66716359phpQwoT2e.jpg
Nested conditionals
132195419165bd21831e1b62.52399426phpdeq0zA.jpg
Smell Arguments of Same Type
160530795165bd220b10dce4.08504082phpDA2Bj7.jpg
Sequential coupling
205485065565bd2284b1df50.57870143phpOFdBzc.jpg
H
99795197865bd232b264366.10492237phpOeQ32j.jpg
R
132711956765bd236d095f22.33535367phpWFgfIj.jpg
Null
127303144165bd23c22c9097.69495815phpEFu4S7.jpg
H
104013020065bd2412ddf440.33691899phpZsbh7B.jpg
Large classes
Larges classes
65621601765bd2466644567.47111981phpQIvMkJ.jpg
Bad smell Message chains
73833853765bd2ec01ca340.64619885phpjSn4Hm.jpg
Refused Bequest
67586125965bd307f9950d7.65327938php1BG0AR.jpg
Wie kann man Smells finden?
150371409365bd350be61f22.56591350phpsaYnNa.jpg
V
211286287565bd35fd5c4d67.01152617phpCqJVB3.jpg
Bosyscout Principle
74187286965bd3657d81365.15339060phpLKp9Yj.jpg
Keep it simple stupid
34106923965bd36827e3204.08027965phpKyQjWe.jpg
Premature Optimization
191195431965bd36aa38c363.69413410phpKEu3YX.jpg
You aint gonna need it
169566574565bd37337d7687.98374106php9rAjtW.jpg
G
45521342565bd375d793a10.39163185phpIcMML5.jpg
V
6811538465bdfb1a82b8b4.25130251phpBI4MKD.jpg
J
93996692765bdfb2aa25b01.63469539php1x1jBR.jpg
F
35331556265bdfb34cb5963.31899805phpIvXWnL.jpg
C
38283044065bdfb3e8370c5.60725260phpqovbal.jpg
H
122928292665bdfb4e2e9f16.83112274phpUjsBZL.jpg
H
114440217765bdfb5d2ebe39.58148703phpGICl4h.jpg
H
90728045765bdfb6879e035.94001890phpgfuwCf.jpg
H
702901465bdfb71ed4f94.72266927phpOBYMdz.jpg
B
79763193265bdfb8a86c578.79323506phpCEN9dd.jpg
J
187204143165bdfb9c37ab68.51289175phpGbsKmo.jpg
Hoe to name things
200164979765bdfbb9437452.33180204phpTFFcya.jpg
G
165991290165bdfbd8264924.46132449phpndutOH.jpg
G
37383510865bdff7566adb3.44633790php8y4hZv.jpg
G
167040553665bdff9d41cb84.31336581phpiEG3PU.jpg
G
181641772765bdffbe76a2c4.56099918phpFDOe6i.jpg
C
54440790565bdffc84f1e49.06921062phpyQqGnj.jpg
F
146175144365bdffd8243705.72810719phpAkaG2E.jpg
C
186879391065be0089e0bd68.33522993phptkxbqD.jpg
G
135080048565be00ddf1db16.95056315phpPOAFbO.jpg
C
197029690665be00e934cc28.88123203phpp1XnEb.jpg
C
58053408265be00f35191e1.36824011phpk75HsC.jpg
C
33649515665be0104f3c702.25989653phpIvh1Q7.jpg
G
5723440465be0112416dc7.28381358phpZTenOr.jpg
G
130478904065be017a839461.70809646php7vu3kX.jpg
G
136722808265be0183f2f847.91224746phpVFrr4l.jpg
G
119227640865be0bfa62de76.86859033phpFyQRai.jpg
H
131612270865be0c08e671b0.12457036phpHGYNdl.jpg
G
158996224565be0c12b8d0b3.47052007php8k6Bjd.jpg
G
107336044265be0c1a8fde98.80576964php8Af6eS.jpg
G
162850499665be0c2109c9f9.96541288phpWqazAU.jpg
G
158926311065be0c27e8a518.89956689phplYd7CX.jpg
G
155762436765be0c2defcb76.21929717php8jas2R.jpg
G
135643566965be0c342a6d41.57401982phpIgPrHs.jpg
G
162690170065be0c3c5ae4e9.64472341phpujI28x.jpg
G
37255934965be0c44bfe741.45142884phpPDIjj7.jpg
G
47679442365be0c757cfe51.09550348phpoajYfy.jpg
G
189575320465be0c7bd38d25.42635620phpIis170.jpg
G
137849617665be0c81b7df51.21173941phpZYrSl0.jpg
G
148095129465be0c85f38537.09822338phpACndRg.jpg
G
17791755865be0c8a680469.49344145php3cc3Mr.jpg
G
202770555265be0c900d7350.52704150php9113kX.jpg
G
133901736365be0c960be179.74174677phpk6sLFV.jpg
Es gibt subtyping auch in FP (apso ojne Vererbung)
Subtyping und Vererbung
Definition of done kann auch sein, dass Code Conventionen eingehalten werden
T
Für gleiche bedeutung keine anderen wörterr wählen

Dokumentaion
F
Refactorinh

Code wartbarer machen aber code soll sich nach außen gleich verhalten
F
Wenn ne funktion referentiell transparent ist, weiß man das für gleiche inputs immer die gleichen ouzputs kommen
F
Globale Variablen vermeiden, da man dadurch Funktionen schwer testen kann
F
Mit immutable datastructures kann man besser parallelisieren
D
Es wird über Alle punkte die seiteneffekte haben abstrahiert

Wenn man inhalt einer Datei braucht wird der als argument einer anderen du ktion benutzt. (Erhöht testbarkeit)

Bei FC IS
H
Interfaces sollten klein sein
F
Modulare Protection
Ein Fehler soll nixht aus nem Modul raus geworden werden, der den Nutzer gar nichts angeht

File not found exceptionsoll nicht geworfen werden

Wenn der Nutzer nicht mal weiß das dateien geöffnet wurden
Modularität
Softwarelösung sollte relativ nah ander Domäne sein

Damit Übersetzung gut funktioniert und man einfacher Kundenwünsche umsetzen kann
Modularität
Abhängigkeiten sollten explizit sein
Nicht seiteneffekte verwenden um sachen zusammenzusetzen

Sondern parameter verwenden dafür

Über Sachen abstrahieren
Information Hiding
Man versteckt die Details die sich am wahrscheinlichsten ändern

Hinter interface
Kontravarianz dreht die Subtypbeziehung um
F
Manchmal will man garnichtdie schwächste Vorbedingung um den Freiraum zu haben in der Zukunft was zuverändern.
F
Contracts können statisch geprüft werden zum Beispiel über Typsysteme
T
Wenn in einem modul
Ein teil der Komponenten sehr eng verbunfne sind ein anderer teil auch sehe eng verbunfen ist, dann könnte das single responsibility verletzen
G
Unterschied git status und git diff
82154370265cb2ea782b002.26639002phpZ0yQ42.jpg
git checkout file
126514862465cb398bb86226.71175941phppra1QP.jpg
G
9982826565cb3cb1865f95.92581140phpuG52fp.jpg
git add -p
55674148965cb3fc8aef8b5.60946291phpAsWkHb.jpg
How to tackle technical debt
Explizit die Verschuldung nachvollziehen über tickets

Oder

Kosten die entstehen wenn man schulden anhäuft im Entwicklungsprozess internalisieren

( wenn man keine schulfen anhäuft bzw schulden beseitigt können neues feautures insgesamt billiger sein)
Ist fehler entfernen Refactoring
Nein da man nur interne Struktur verändern darf ohne äußeres verhalten zu ändern
Wie hängen tests und Refactoring zsm?
Durch viele tests kann man direkt sehen ob ein Refactoring das Verhalten geändert hat
Ist das ändern von funktionsnamen ein Refactoring
Wenn das ne öffentlich verfügbare Funktion ist dann ja

Deshalb sollten swap und sesrchsmallest from privat sein
29594800765d34982526156.12946760phpXSMuCL.jpg
Warum hilft das refactoring einer longmethof der Wiederverwendbarkeit
Weil kleine funktionen eher auch in andern Kontexten verwendet werden können
Was kann man machen wenn man viel Kommentare schreiben muss um die funktion zu erklären
Hilfsfunktionen für die Verständlichkeit einbauen
Gefahren bei extract method
Dadurch dass man komplette teilausdrücke oder statements extrahiert, kann es sein dass mehrere variablen geschrieben werden

Also wird es immer unangenehmer je mehr veränderlicher zudtand geschrieben wird

Ausserdem kann man schwer aus lokalen kontrollfluss (dchleifen raus
Wie könnte man den smell verbessern
135514341465d37846d88b23.93363409phpbymnwZ.jpg54855360465d3787b0a09f9.66358296phps35Od5.jpg
Mutuable variablen problem
Zustandsraum kann sehr hoch werden es wird schwer das zu verstehen debuggen und zu warten
Mutable variab refac
Man kann den veränderlichen zustand immer übergeben und zurückgeben und dadurch Zustandmod simulieren

Dadurch ist immerhinklar durch die funktionssignatur das zustand reinkommt und rausgeht
Ist if ein Ausdruck oder ein Statement
Ausdruck
Throw wird geworfen um abzubrechen
Es geht aber auch return
C
156633741865d3886d256461.77648471phpE5X38i.jpg
Refactor
174861112565d38c7f2b9b42.42950904phpwft0T4.jpg97459748165d38ca0d0b154.45720408phpi5nXJ8.jpg
Man sollte Schnittstellen selten ändern
C
Information hiding
Man sollte von aussen wenig zugriff haben um Komponenten zu verändern

Also keien setter Methoden außerhalb vom Modul
Was ist ein Problem an veränderbaren Variablen
Man muss den Zustand der Variable im kopf bewahren und es kann sehr viele mögliche Zustände geben
Mutable variables invariants

Was sollte msn beschten
Zum Beispiel gibt es Invarianten wie die Variable soll nur einmal geändert werden

Wichtig ist diese invarianten zu dokumentieren

Idealerweise über compiler , linter etc
Refactor
160904670265dded0ae3e985.28167303php8dHc6R.jpg101757477965dded151d6ea4.95098298phpXwimGh.jpg
63449582565ddede561c169.88334019php3yVVGg.jpg200530218765ddedef6129b4.91758478php8G2R3h.jpg
11593050465ddefd2328e89.17581660phpE04w73.jpg176939529765ddefdcc5b8c3.59434863phpOF6hVu.jpg
Probleme bei partiellen Funktionen
Man muss das dokumentieren

Type checker kann nicht helfen fehler zu vermeiden

Als aufrufer kann man leicht Fehler machen
48903863465ddf1a4775003.96687182phpXBsToM.jpg189118280265ddf1acaefda4.45632774phpvsD73l.jpg
Problem von sentinel values
Sie können zu spezialfällen führen

Sie können regeln verletzen z.b algebraische regeln bei zahlen
Wie sentinel values refactorn
Mn könnte einen Summentyp verwenden (optional values)

Man könnte eine zusätzliche flag mitgeben (-1, false)

Man könmze auch die Methode aufteilen und bei einer einen sentinel übergeben und bei einer nen normalen wert (dann ist das klar in der signatur)
Problem bei null
Man muss immer überprüfen ob irgendwas null ist
Kann man bei optional einfach auf den Wert zugreifen?
Nein man muds schauen ob es None oder sum ist
205926104165de0e5c8c7645.14792246phpZa4JyO.jpg71570164965de0e6d923e16.89969423php24FI58.jpg
Bad smell primitive obsession

Refactoren
Es sollte genau so viele Typ inhabitants geben wie es Domänenmitgliefer gibt
Probleme bei primitive Obsession
Eenn man gleich primitive typen benutzt für unterschiedliche aspekte kann es schnell zu Verwirrung und Versmischung kommen

Kann zu boolean blindness führen. Wenn es nur booleans (statt eigene typen) gibt, kommt es eher dazu dass man die Booleans verwechselt
Bad smells in oop: message chains

Worauf könnten sie hindeuten


Wann ist das ok
Es könntr sein dass sie die Datenkapselung verletzen

Wenn man zum beispiel nur auf einer Kollektion also liste odrr so was arbeitest und man wendet dann filter an und map z.b

Oder auch wen man ne variable initialisiert

(Dadurch vermeidet man mutable variablen)

Es ist nicht so dass wir in Felder navigieren oder bestimmte bestandteile rausziehen um eine Funktion aufzurufen
128111622665de1a47e52032.26030714phpCFnc39.jpg
Führen statische Analysen ein Programm aus?
Führen das Programm selbst nicht aus

Es ist nicht möglich alle Eigenschaften entscheiden zu können, aber man kann viele Eigenschaften sehr weit entscheiden und auf smells hinweisen

Mn kann nicht hinweisen ob es schlechite qualität ist, aber z.b dass mutable state verwendet wurde
Können Linter helfen security schwachstellen festzustellen
Ja
Was ist der assert schritt
Bei perfomancetest wird da überprüft ob der Test innerhalb der jeweiligen Ressource geblieben ist (weniger speicher als maximal erlaubt oder zb weniger zeit als maximal erlaubt)
Dürfen Invarianten verletzt werden
48699538265eeef8446f815.95259741phpzdTPpv.jpg
Was ist aliasing
119849260065f01eaf377b12.90153938php5cS4JI.jpg
Was sind Umgebungsvariablen
15988787465f025938b1694.31672415phpDkyBqj.jpg
Warum Option benutzen
117265377765f034391eb2c2.32369281phpnSFSJC.jpg
Was sind Tokens
169975286865f04d6b160313.67626716php4IjD4U.jpg
API Dokumentation
Wenn man in Java z.b java doc verwendet kann man aus den im Code verwendeten Kommentaren automatisch generierte externe Dokumentation bekommen.
Wie heisst der Smell wenn man z.b euros und cents als int deklariert
Arguments of same Type
H
29878624266091f3e9eeda0.28631972php9005Dm.jpg
H
2039733477660920c3ca6345.31883108phpE9CbOH.jpg
V
2714766246609238dcd52c8.55928012phpYEY6zs.jpg
B
8798768776609246c275083.52297436phpH30UQR.jpg
V
1425024971660927b73d9a05.52295131php9l2Ytz.jpg
G
647334420660928306f8407.85953688phpmwP8YS.jpg
H
1867746273660929aee8f9c8.27010792phpAiimV1.jpg
G
165781686566092a8a0a9741.63024419phpig3BTb.jpg144083241666092a6a149a72.09163076phppjc1rV.jpg
V
211893737566092cd1c443d5.32200372phpDcC3uX.jpg
H
155868533066093849d64dc1.42429838phpSGITCV.jpg
H
189476482466093889d93675.96179902php8No54o.jpg
G
128919243066093cd6847783.68651579php4tSvBl.jpg
H
137915186566093e7aefcf78.72046705phpUFmiXW.jpg
V
7399653386609419c11c334.50980737phpcx7161.jpg
V
210574934066094292e97db5.65191988phpSkjTAf.jpg
F
619962121660943452a26f2.31135740phpugfjpg.jpg
H
18214336886609444dac1ed0.06292811phpQQi3sz.jpg
H
74194353766094546653c97.69624296phpZkmnNu.jpg
C
39484880766094713361655.32071482phpZAijcf.jpg
Uc
675183942660947d78d2500.99099482phpfFLZ91.jpg
H
2065816954660948eece2bd4.68660566php9ZQjNU.jpg
V
142215175766094a4b4c4685.39305544phpxqbikP.jpg
V
92768354966094d8028c489.94946616phpKn2mqF.jpg
G
7353385736609502ed155a7.90416906phpol2ge2.jpg
C
677183141660950aed2c9d8.41707973phpy9uwAv.jpg
D
2146880626660953b9eafe64.53168161phpS4m6sb.jpg
C
11573624896609548276cc76.85699989phpH32W6H.jpg
V
208820907660955dcb63cc5.50131431phpjeEPgv.jpg
G
17333166376609562b3897b5.99425231phpXsEmkW.jpg
F
1206461701660956922d3ce4.60049655php5TgPsu.jpg
G
1388790935660958c808bd36.37721034phpTPJhPe.jpg
H
30844296566095acaed8f51.47329149phpfQGDYI.jpg
1941584989660b2c83d55b51.49222006phpBlyu4a.jpg819565836660b2c88429f32.35079379php2VLZtP.jpg
Reading environment variables ist IO
G
J
20685288496613d781490ae8.83563234phpaKqq6M.jpg
V
7344416646613daa9434c34.87523711phpeBuaCi.jpg
C
2712594706613dcd5e9dee0.92743019phpgNv1K7.jpg
B
13049404516613df4151fc73.38965925phpxnoB4W.jpg
V
5090798036613e1c35e0e26.52742256phpRoK2IZ.jpg
V
17895776076613e25cef3080.17490854phpYhGo7k.jpg
J
6762319226613e9c2a4a158.36304714phpceKXtM.jpg
J
154213140666142ebb30b140.33779959phpZ5wcC1.jpg
H
193917369366143309c91f32.45807322phpe6Yj81.jpg
B
1309186916661433d6280578.63774765php4etkHv.jpg
J
1663177540661434dbc2e413.40850175phpmyJxKu.jpg
H
181835273466143d28702002.75028486phpxUOwZM.jpg
H
312454896614cbb02d5c81.54651750phpenEQ5V.jpg
V
7749715856614ccdf1fded6.54976738phpu8FeZy.jpg
C
4785645376614cdc3c0c792.00254478phpeGtlPY.jpg
H
10846200946614cdfd6298a8.26057729phpJNRTKd.jpg
H
20575580596614ce785b2e53.85101843phpBaCLc3.jpg
V
20399735816614cea9c89554.59514943phpdYVcNc.jpg
V
8883859066614d33f375bd7.43922866phpfdIF9v.jpg
B
7121725206614d4334390c7.17112801phpkJospV.jpg
V
2979540246614dbe02ee707.57894842phpEKaPYz.jpg
B
13655774246614dc5dae36a6.93283380phpofqlkN.jpg
H
550769796661536b679a107.08262296phpFJTgPw.jpg
Hk
83146905266153b6bd3bb59.05182154phpHpES9Z.jpg