Auf Seite 45 von Robert C. Martins Clean Code: A Handbook of Agile Software Craftsmanship schreibt Martin, dass Ausgabeargumente vermieden werden sollten. Ich habe Probleme, die Bedeutung von "Ausgabeargument" zu verstehen und warum sie vermieden werden sollten.
Martins Beispiel für ein Ausgabeargument appendFooter(s);
ruft die Funktion auf public void appendFooter(StringBuffer report)
. Seine Verbesserung des Codes istreport.appendFooter();
Vielleicht liegt es am fehlenden Codekontext, aber ich sehe nicht, wie die Verwendung von Ausgabeargumenten als schlechte Codierung angesehen wird. Könnte jemand das Konzept erklären oder ein zusätzliches Codebeispiel angeben, um dies zu verstehen?
Würde die folgende Funktion nach dem obigen Prinzip auch als Beispiel für unreinen Code angesehen werden?
int[] numberArray = {3, 5, 7, 1};
sortArray(numberArray);
Wenn das oben Gesagte gegen Martins Prinzip verstößt, keine Ausgabeargumente zu verwenden, ist es besser, ein Objekt mit einem Array als Feld und einer Funktion zu haben, die zum Sortieren des Arrays aufgerufen werden kann.
ObjectWithArrayField numberArray = new ObjectWithArrayField(3, 5, 7, 1);
numberArray.sort();
quelle
sortArray(numberArray)
Natürlich ist allesnumberArray
in Ordnung. Oder wird eine Kopie erstelltnumberArray
, die Kopie sortiert und die sortierte Kopie zurückgegeben, ohne Änderungen vorzunehmennumberArray
?sort()
Methode eines Containers kann auch an Ort und Stelle funktionieren, ohne ein "Ausgabeargument" zu verwenden. Nur weilsortArray(numberArray)
es sich um eine In-Place-Methode handelt, ist dies absolut kein Grund, der die "Ausgabe-Argument-Form" rechtfertigt.sortArray(numberArray)
tun ist. Es kann offensichtlich sein, dass es vorhanden sein muss, wenn es nicht denselben Typ zurückgibt, den es akzeptiert. Aber ohne den Rückgabetyp zu sehen oder wenn der Rückgabetyp mit dem Eingabetyp übereinstimmt, ist dies unklar, ohne die Definition zu betrachten.Es geht darum, einen unerwarteten Mechanismus für die Rückgabe eines Werts aus der Funktion zu verwenden, der normalerweise darauf zurückzuführen ist, dass in der Funktion zu viel getan oder Verantwortlichkeiten falsch ausgerichtet wurden. Die beste Methode, das Ergebnis einer Funktion zu kommunizieren, ist die Verwendung des Rückgabewerts. Ich hoffe das ist selbstverständlich. In objektorientierten Sprachen besteht die zweitbeste Methode darin, das Objekt zu mutieren.
Zwischen diesen beiden Optionen gibt es so viele klare, offensichtliche Möglichkeiten, das Ergebnis einer Funktion zu kommunizieren, dass, wenn Sie jemals die Argumente als einziges Mittel ändern möchten, etwas in Ihrer Architektur schief gelaufen ist. Sie müssen Ihre Klassenverantwortung neu ordnen, damit derjenige, der die Mutation vornimmt, die Daten besitzt.
Die einzige Ausnahme sind sehr generische Algorithmen. Beispielsweise kann ein Sortieralgorithmus zu Recht von den sortierten Containern getrennt sein, wenn er über seine öffentliche Schnittstelle generisch auf einen beliebigen Containertyp angewendet werden kann. Eine One-Shot-
appendFooter
Funktion hat diese Entschuldigung nicht.quelle