2017-03-03 4 views
-1

Ich bin Student und bereite mich gerade auf meine OOP Basics Exam vor.Wie Methoden von Controller aufgerufen werden, wenn einige von ihnen ungültig sind und einige nicht?

Wenn Sie in der Steuerung Methoden haben, die einen Wert zurückgeben, und solche, die leer sind - wie rufen Sie sie auf, ohne eine if-else-Anweisung zu verwenden?

In meinem Code "Status" ist die einzige, die eine Zeichenfolge auf der Konsole gedruckt werden soll - die anderen sind ungültig. Also habe ich eine if-esle und 2 Methoden in den CommandHandler eingefügt.

Da ich weiß, "wenn-sonst" ist ein Code-Geruch, gibt es eine höhere Qualität Ansatz, um mit der Situation umzugehen?

if (commandName == "status") 
    { 
     this.Writer.WriteLine(this.CommandHandler.ExecuteStatusCommand(commandName)); 
    } 
    else 
    { 
     this.CommandHandler.ExecuteCommand(commandName, commandParameters); 
    } 

Dies ist die project.

Vielen Dank.

+8

Ich verstehe nicht, was das Problem ist oder was hier gefragt wird. – Amy

+6

Wenn "if-else" ein schlechter Code-Geruch wäre, würde so ziemlich der ganze Code aus der realen Welt stinken – Tim

+0

Wenn alles, was du zu tun versuchst, weg von der if-else-Logik ist, würde eine switch> case-Anweisung genügen? https://msdn.microsoft.com/en-us/library/06tc147t.aspx verwenden Standard für die void. – beeker

Antwort

1

Zuerst, mach dir keine Sorgen über If/Else. Wenn jemand dir sagt, ob/sonst ist ein Code-Geruch, übersetze es durch den Übersetzer: Was herauskommt ist, dass er dir sagt, dass er zu verrückt, ahnungslos und/oder fanatisch ist, um ernst genommen zu werden.

Wenn du durch einen schlechten Zufall einen Lehrer bekommst, der sagt, dass die Erde flach ist, um ein A zu bekommen, dann sag ihm, dass die Erde flach ist. Aber wenn Sie eine Karriere oder sogar ein Hobby als Navigator planen, vergessen Sie nie, dass es tatsächlich rund ist.

So. Es klingt für mich wie CommandHandler.ExecuteStatusCommand() führt den genannten Befehl, der als eine Methode irgendwo implementiert ist. Wenn die Befehlsmethode void lautet, gibt ExecuteStatusCommand()null zurück. Andernfalls gibt die Befehlsmethode möglicherweise eine Zeichenfolge zurück. In diesem Fall möchten Sie sie in einen Stream schreiben, der wie ein Stream aussieht.

OK, so ein Ansatz hier ist zu sagen "Ein Befehl wird über eine Methode implementiert, die einen Parameter und gibt entweder Null oder eine Zeichenfolge einen Status darstellt. Wenn es nichts als null zurückgibt, schreiben Sie das in den Stream".

Dies ist Standard: Sie definieren einen "Vertrag". Es ist überhaupt nicht unpassend für Befehlsmethoden, die tatsächlich nichts zurückgeben, um einen String Rückgabetyp zu haben, weil sie die Vertragsbedingungen erfüllen. "Eine Zeichenfolge zurückgeben" ist eine Option, die allen Befehlen offen steht. manche nutzen, manche nicht.

Dadurch kann die Kenntnis der internen Funktionen des Befehls auf die Befehlsmethode beschränkt werden, was ein großer Vorteil ist. An dem Punkt, an dem Sie die Methoden aufrufen, müssen Sie sich nicht um spezielle Fälle kümmern. Der folgende Code muss nicht wissen, welche Befehle einen Status zurückgeben und welche nicht. Die Befehle selbst erhalten die Möglichkeit, diese Informationen an den Anrufer zu übermitteln, so dass sie nur wissen müssen. Es ist unglaublich vorteilhaft, ein Design zu haben, das es verschiedenen Teilen Ihres Codes erlaubt, sich nicht um die Details anderer Teile zu kümmern. Saubere "Interfaces" machen das möglich. Der aufrufende Code wird einfacher und bleibt einfacher. Weniger Code mit weniger Änderungen im Laufe der Zeit bedeutet weniger Aufwand und weniger Fehler.

Wie Sie festgestellt haben, wenn Sie einen "status" -Befehl haben, der ein Ergebnis ausgibt, und später einen "print" -Befehl hinzufügen, der auch ein Ergebnis ausgibt, müssen Sie nicht nur den Druck implementieren Befehl selbst, aber Sie müssen auch daran denken, zu diesem Teil Ihres Codes zurückzukehren und einen speziellen Fallzweig zum if/else hinzuzufügen.

Diese Art von langwierigen fehleranfälligen PITA ist genau die Art von Unsinn OOP soll zu beseitigen.Wenn ein neues Feature hinzugefügt werden kann, ohne den vorhandenen Code zu bearbeiten, ist das eine Art platonisches Ideal von OOP.

Wenn also ExecuteCommand() void zurückgibt, möchten wir stattdessen ExecuteStatusCommand() aufrufen. Ich vermute einige Dinge hier. Es wäre hilfreich gewesen, wenn Sie die Semantik dieser beiden Methoden skizziert hätten.

var result = this.CommandHandler.ExecuteCommand(commandName, commandParameters); 

if (result != null) 
{ 
    this.Writer.WriteLine(result); 
} 

Wenn meine Annahmen über Ihr Design korrekt sind, ist das die ganze Sache. commandParameters, wie das Statusergebnis, sind ein optionaler Bestandteil des Vertrags. Mit if/else ist nichts in sich falsch, aber manchmal braucht man keins.

Verwandte Themen