Ich gehe diese Serie durch . Der Autor erwähnt, dass es schwieriger ist, Komponententests zu schreiben, da der Status in der objektorientierten Programmierung beibehalten wird. Er sagt auch, dass es einfacher ist, Komponententests zu schreiben, da die funktionale Programmierung den Status nicht beibehält (nicht immer). Ich habe keine Beispiele gesehen, die dieses Problem demonstrieren. Wenn dies zutrifft, können Sie mir ein Beispiel zum Vergleich von Unit-Tests in der objektorientierten und funktionalen Programmierung geben?
9
State
Monade zu ersetzen (die den Status emuliert). Sie haben teilweise einen Punkt - Code, der in diesem Stil geschrieben wurde, hat nicht lokale Interaktionen -, aber für Unit-Tests können Sie den Status immer noch explizit übergeben, Sie müssen nichts verspotten. Auf der anderen Seite führen Sie mit Monaden wieST
undIO
(die einen wahren, impliziten veränderlichen Zustand haben) einfach eine zustandsbehaftete Programmierung durch, und Unit-Tests sind nicht einfacher als in jeder anderen Sprache.Antworten:
Ich möchte zwischen zwei verschiedenen Arten der objektorientierten Programmierung unterscheiden
Als Faustregel gilt, dass ein auf die erste Weise programmiertes Objekt mehr Methoden und
void
Methoden haben wird als auf die zweite Weise. Angenommen, wir wollten einen Flugsimulator schreiben und eine Flugzeugklasse entwerfen. Wir hätten so etwas wie:Dies ist vielleicht etwas extremer, als man es sich vorstellen könnte, aber es bringt den Punkt auf den Punkt. Wenn Sie diese Art von Schnittstelle implementieren möchten, müssen Sie sich im Objekt befinden:
Das Schreiben eines Komponententests für ein im Modus geschriebenes Objekt ist absolut schwierig, weil:
Grundsätzlich beginnen Sie mit einer Schnittstelle, die vernünftig aussieht und gut zur Domäne passt, aber die Schönheit der Simulation hat Sie dazu verleitet, ein Objekt zu erstellen, das wirklich schwer zu testen ist.
Sie können jedoch Objekte erstellen, die denselben Zweck erfüllen. Sie möchten Ihre
Plane
in kleinere Teile bremsen . Haben Sie einPlaneParticle
, das die physikalischen Teile des Flugzeugs, die Position, Geschwindigkeit, Beschleunigung, Roll, Gieren usw. usw. verfolgt und diese freilegt und manipulieren kann. Dann könnte einPlaneParts
Objekt den Status von verfolgen. Sie würden Schifftick()
zu einem ganz anderen Ort, sagen einen habenPlanePhysics
Objekt, zB durch parametriert, die Schwerkraft, die ein bestimmtes kenntPlaneParticle
und einPlaneParts
neues , wie auszuspuckenPlaneParticle
. All dies könnte völlig unveränderlich sein, obwohl es nicht unbedingt ein Beispiel sein muss.Sie haben jetzt folgende Vorteile beim Testen:
Hier ist der Trick: Der zweite objektorientierte Ansatz, den ich beschrieben habe, kommt der funktionalen Programmierung sehr nahe. Vielleicht sind in reinen Funktionsprogrammen Ihre Datensätze und Ihre Funktionen getrennt und nicht in Objekten miteinander verbunden. Auf jeden Fall würde ein Funktionsprogramm sicherstellen, dass all diese Dinge. Was ich denke, macht Unit-Tests wirklich einfach
Funktionale Programmierung fördert diese Dinge (aber man kann in jedem Paradigma schlechte Programme schreiben), aber sie sind in objektorientierten Programmen erreichbar. Und ich möchte weiter betonen, dass funktionale Programmierung und objektorientierte Programmierung nicht inkompatibel sind.
quelle