Soll ich im Produktionscode spotten?

8

Ich habe eine Situation, in der ich einen Code in der Produktion verspotten muss. Dies dient dazu, einen Teil des Codes zu erstellen und in halber Funktionalität zu arbeiten.

Ich muss wählen, um eine leere Klassen zu schreiben (um die Schnittstelle zu implementieren), oder verwende ein Spott-System wie moq.

Die Frage ist also, ob die Mockingsysteme die Leistung treffen oder die Lesbarkeit des Produktionscodes brechen?

update
Beispiel:

%Vor%

Ich habe festgestellt, dass ich eine SimulationRocketSystem-Klasse in der Produktion habe, die klein ist und nicht viel im Körper hat. Das Scheinsystem hat eine Codezeile ( new Mock & lt; IRocketSystem & gt; (). Object ), um Klassen wie diese zu ersetzen.

die Pros für Spott:
weniger leere Klassen im Projekt.

    
Avram 31.07.2009, 09:56
quelle

8 Antworten

10

Klingt wie ein Null-Objekt . Ich glaube aus zwei Gründen daran nicht spöttische Frameworks zu benutzen.

Erstens schmerzt es Lesbarkeit. Wenn Sie die Schnittstelle mit einer entsprechend benannten leeren Klasse implementieren, dokumentieren Sie die Absicht in dieser Klasse. Wenn Sie andererseits ein Mocking-Framework verwenden, muss Ihre Dokumentation irgendwo in den Code eingebettet werden. Darüber hinaus wird es verwirrend sein, da die Leute erwarten, dass der Testcode verspottet wird und Sie Ihre Absicht, Mocks zu verwenden, nicht verstehen.

Zweitens müssen Sie überlegen, was passiert, wenn jemand die Schnittstelle ändert. Was passiert, wenn eine Methode hinzugefügt wird? Sollte es standardmäßig Null zurückgeben - wie es einige Frameworks tun würden? Was ist, wenn die Methode einen bestimmten Rückgabewert gemäß dem Schnittstellenvertrag zurückgeben muss? Wenn Sie eine konkrete Implementierung haben, wird der Compiler Sie zumindest etwas schützen. Wenn Sie ein spöttisches Framework verwenden, haben Sie möglicherweise kein Glück.

    
waxwing 02.08.2009, 19:32
quelle
8

Ein Mock-Objekt ist etwas, das Sie zum Testen verwenden, da Sie damit feststellen können, dass es korrekt aufgerufen wurde. Es klingt für mich, dass das, wonach Sie suchen, eher ein Stub oder ein Proxy-Objekt ist.

Da Sie die fragliche Klasse irgendwann implementieren werden, würde es wenig Sinn machen, ein Mock Framework für Sie IMO zu haben. Warum nicht einfach die Klasse erstellen und sie nach Bedarf implementieren?

    
Brian Rasmussen 31.07.2009 10:21
quelle
6

Was ist falsch an einer leeren Klasse?

Tatsächlich wird es durch eine echte Klasse ersetzt, also können Sie genauso gut mit einer echten Klasse beginnen.

Ich denke, das Setzen von Scheincode außerhalb -Tests ist eine schlechte Richtlinie.

    
S.Lott 31.07.2009 10:07
quelle
2

Sie nennen es Spott, aber es scheint, als ob das, was Sie tun, nur die richtige Trennung der Sorgen ist.

Es ist eine gute Sache, Polymorphismus über if-Anweisungen zu verwenden, um zu kontrollieren, was passieren soll.

Beispiel, sagen Sie, wenn die Protokollierung optional sein soll. Der imperative Ansatz besteht darin, ein boolean isLogging zu liefern. Dann überprüfe jedes Mal den Booleschen Wert wie if (isLogging) { ...logging code... } .

Aber wenn Sie stattdessen den tatsächlichen Protokollcode als ein Anliegen für ein anderes Objekt trennen, können Sie dieses Objekt auf eins setzen, das das tut, was Sie wollen. Neben einem Logger mit Null-Routing, der die Protokollierung deaktiviert, und einem, der tatsächlich in eine Datei schreibt, können Sie auch ein Logging-Objekt angeben, das in eine Datenbank statt in eine Datei schreibt. Damit können Sie Funktionen zum Logger hinzufügen, z als Protokolldatei-Rotation.

Es ist einfach eine gute objektorientierte Programmierung.

    
Christian 02.08.2009 14:33
quelle
2

Es ist vielleicht ein wenig ungewöhnlich, also würde ich in meinen Kommentaren usw. klar machen, dass dies die erforderliche Funktionalität ist. Sonst wird jemand sehr verwirrt sein, wie Testcode es zur Produktion gemacht hat!

Was die Leistung betrifft, müssen Sie dies wie immer messen, da es so spezifisch ist. Allerdings würde ich eine Vermutung riskieren, dass, während Sie sich über Funktionen lustig machen, die Sie nicht geschrieben haben, es möglicherweise viel schneller als Ihre verspottete Implementierung ist. Das ist etwas, worüber Sie Ihre Benutzer möglicherweise aufklären müssen, denn wenn Sie eine endgültige funktionierende Implementierung bereitstellen, sehen sie möglicherweise einen Leistungseinbruch: -)

Die echte Lösung soll eine Dummy-Implementierung für eine vorhandene Schnittstelle bereitstellen und später die eigentliche Implementierung bereitstellen.

    
Brian Agnew 31.07.2009 10:03
quelle
1

Ich weiß nichts über Leistungsprobleme. Aber IMHO, müssen Sie wirklich vorsichtig mit Lesbarkeit sein. Ist es nicht besser, eine oder mehrere Schnittstellen zu deklarieren und auf zwei verschiedene Arten zu implementieren?

- BEARBEITEN

Mocking ist möglicherweise einfacher und verwendet weniger Codezeilen, aber es erhöht die Lernkurve Ihres Codes. Wenn ein neuer Typ kommt und Ihren Code sieht, benötigt er mehr Zeit zum Verstehen. Persönlich würde ich denken, dass es eine noch nicht implementierte Funktion des Codes ist. Aber wenn es eine andere Schnittstellenimplementierung oder eine andere gute Designentscheidung gäbe, würde ich es viel schneller "bekommen" und würde sich sicherer fühlen, wenn ich den Code ändere.

Nun, das ist eine persönliche Meinung. Ihr Code verwendet ein anderes Muster als erwartet. Es ist ähnlich wie "Konvention über Konfiguration". Wenn Sie die Konvention nicht verwenden, sollten Sie es schwerer haben, sie zu konfigurieren (in Ihrem Fall dokumentieren und klarstellen, was Sie tun).

    
Samuel Carrijo 31.07.2009 10:05
quelle
1

Mein Rat - setzen Sie es nicht in Produktion. Setze niemals etwas in Produktion, das es verlangsamen, brechen oder auf andere Weise dazu bringen kannst, deinen Job zu verlieren:)

Aber wichtiger als das, was ich denke, ist, was ist Ihre Firmenpolitik und was denkt Ihr Manager? Sie sollten niemals darüber nachdenken, eine solche Entscheidung zu treffen - sie heißt CYA.

    
Larry Watanabe 31.07.2009 12:25
quelle
-1
  

Ich muss wählen, eine leere Klassen zu schreiben, oder ein Spott-System wie moq verwenden.

Das Einpacken in eine spezielle Fassaden- / Adapterkomponente und die Verwendung innerer Klassen sollte ausreichen. Wenn Ihre leeren Klassen um das System weitergegeben werden müssen, haben Sie ein Problem.

    
pmf 31.07.2009 10:20
quelle

Tags und Links