2011-01-14 11 views
3

Ist es besser, Methoden zu schreiben, die keine Argumente annehmen und Nebenwirkungen haben, den Objektstatus ändern, oder Ein-Argument-Methoden, die ein Argument nehmen und es verarbeiten? Wenn die zweite Alternative vorzuziehen ist, ist es besser, das Eingabeargument explizit zurückzugeben oder es nur zu verarbeiten, da der Aufrufer einen Verweis darauf haben soll.Eingabe-Ausgabe-Argumente vs. keine Argumente mit Nebenwirkungen

Um genauer zu sein: Ich verarbeite XML und habe die ersten Kapitel der Clean Code book gelesen Ich versuche, die Big Processing-Methode in viele kleine zu teilen, so dass diese Methode wie eine Geschichte in den Zeilen gelesen werden kann :

cleanHeader(); 

extractMetaInfo(); 

appendStuff(); 

und so weiter, wo diese Methoden auf dem XML-Dokument alle als Mitglied gespeichert arbeiten.

IMHO scheinen sich hier die Best Practices zur Reduzierung der Parameteranzahl vs. keine Nebenwirkungen zu widersprechen. Wäre es besser, wie folgt zu schreiben?

doc = cleanHeader(doc); 

doc = extractMetaInfo(doc); 

doc = appendStuff(doc); 

Gibt es ein bestimmtes "Recht" zu diesem Thema? Wie viel mehr Kontexte würde eine bestimmte Antwort abhängen? Oder gibt es eine dritte Alternative, an die ich nicht gedacht habe?

EDIT: gefunden related question mit widersprüchlichen Antworten. Pflege um zu erarbeiten?

+1

Nebenwirkungen ist die Mutter allen Übels. Nicht mal näher kommt. – leppie

+0

danke, leppie. das war ziemlich eindeutig :) und scheint sehr plausibel. Könnten Sie bitte einen Link/andere Informationen zur Verfügung stellen, um Ihr Urteil zu unterstützen? wäre es besser, das ursprüngliche Argument zurückzugeben oder es "Funktionsstil" zu ändern, d. implizit? – kostja

+0

Ich empfehle dringend, das Buch zu lesen: "Effektive Java" von Joshua Bloch - Er stimmt in dieser spezifischen Frage für das Gegenteil (Parameter verwenden). Im Allgemeinen bevorzugt Bloch Staatenlose aus verschiedenen Gründen (Performance und Usability). @ Kostja - Sie könnten es als Referenz für die Aussage von leppie verwenden – Ralph

Antwort

1

Wenn Ihr Algothimen von mehreren Threads parallel verwendet werden könnte, dann würde der im sauberen Codebuch (statfull, aber ohne Argumente) empfohlene Weg nicht funktionieren. In diesem Fall müssen Sie den Parameter way verwenden!

+0

das ist ein guter Grund. Danke, Ralph. Und nochmals vielen Dank für das Buch ref. – kostja

0

Ich würde dies aus einer OO-Design-Perspektive argumentieren. Wenn Sie eine Reihe von Methoden haben, die für dasselbe Objekt wie doc arbeiten, benötigen Sie wahrscheinlich eine Klasse, die das Objekt umschließt und das Verhalten in eine bigProcessingMethod() kapselt, die die kleineren Verarbeitungsmethoden aufruft, um die Aufgabe weiter zu unterbrechen .

öffentliche Klasse DocUtil { private String doc;

public DocUtil(String doc) 
{ 
    this.doc = doc; 
} 

public bigProcessingMethod() 
{ 
    cleanHeader(doc); 

extractMetaInfo(doc); 

appendStuff(doc); 

} 

// etc. }

Ich missverstanden Ihre Frage. Ich wusste nicht, dass Sie bereits in einer Wrapper-Klasse wie DocUtil waren.

Ob Sie die doc-Variable explizit an jede Verarbeitungsmethode übergeben oder nicht, Sie arbeiten an demselben Objekt am selben Speicherort. Der einzige Grund, warum ich es jedes Mal übergebe, ist, explizit zu sein, dass dies Methoden sind, die für die Variable doc funktionieren.

Es liegt an Ihnen.

+0

Danke, user381091. Ich bin mir nicht ganz sicher, worauf Sie hinweisen möchten.Meine Frage ist über implizite vs explizite Zustandsänderung dieses Wrappers, den Sie vorgeschlagen haben. Ich würde gerne einige Gründe für beide Möglichkeiten in Anbetracht der Anwendung der besten Praktiken sehen. – kostja

Verwandte Themen