2013-08-07 8 views
5

Jedes Mal, wenn ich eine Methode sehen war einer der Parameter ein output parameter wieWerden Ausgabeparameter als schlechte Praxis angesehen?

void addTokenErrorsToReport(List<String> tokens, Map<String, Integer> report) 

ist ich das Gefühl, dass dies schlicht und einfach falsch ist. Aus meiner Sicht sollten Parameter im Allgemeinen unveränderlich sein und nicht innerhalb einer Methode geändert werden. Z. B. könnte das obige Verfahren zu

Map<String, Integer> createTokenErrorsReport(List<String tokens) 

Die Map dann mit der ursprünglichen Bericht Karte zusammengefasst werden könnte zurück neu geschrieben werden.

Ist diese Annahme richtig? Oder sind beide Versionen gleichermaßen akzeptabel?

+4

Fragen, die hauptsächlich auf Meinungen basieren, passen nicht gut zu SO. –

Antwort

5

Wie bei den meisten Dingen ist es nur "schlechte Praxis", wenn es zu schlecht funktionierenden/unlesbaren/schwer zu wartenden Code führt oder wenn Sie nicht wissen, warum Sie es tun.

In den meisten Fällen hat die Verwendung eines Ausgabeparameters diese Auswirkungen nicht.

In Ihrem addTokenErrorsToReport ist es sicherlich ein geeigneter Ansatz. Sie fügen Token-Fehlern zu einem Bericht hinzu - die Funktion muss wissen, welche Token sie hinzufügen und welcher Bericht hinzugefügt wird. Die Funktion führt eindeutig genau die Operation durch, die ohne Nachteile ausgeführt werden sollte.

Wenn Sie den createTokenErrorsReport-Ansatz verwenden würden, müssten Sie jedem Aufruf folgen, indem Sie die neuen Token in den vorhandenen Bericht einfügen. Wenn das Hinzufügen von Token zu einem vorhandenen Bericht eine gängige Operation ist, ist es auf jeden Fall sinnvoll, eine Methode hinzuzufügen. Das heißt nicht, dass createTokenErrorsReport nicht ebenfalls vorhanden sein sollte - wenn das Erstellen neuer Berichte aus einer Tokenliste eine übliche Operation ist, dann möchten Sie eine Funktion, die das tut.

Ein gutes Beispiel für eine gute Verwendung eines Ausgabeparameters ist Collections.sort, die eine Liste an Ort und Stelle sortiert. Der Leistungseinbruch beim Erstellen einer neuen Kopie der Liste und beim Zurücksenden der sortierten Kopie wird vermieden, während Sie gleichzeitig nicht daran gehindert wird, eine Kopie zu erstellen und die Kopie zu sortieren, wenn Sie dies wünschen.

Verwenden Sie einfach das beste Tool für den Job und halten Sie Ihren Code prägnant.

0

Ich denke es hängt davon ab, woher du kommst (Sprache). Wenn Sie c oder C++ geschrieben haben, wo Sie Zeiger als Parameter verwenden könnten, was schön und praktisch ist, könnten Sie ganz einfach Code schreiben wie Ihr erstes Beispiel. Ich denke nicht wirklich, dass es eine Art von gut oder schlecht gibt, sondern nur, wie dein Stil der Codierung ist.

0

Ich habe diese Codierungspraxis ziemlich oft gesehen und fand es ziemlich elegant. Sie können mehrere Objekte "zurückgeben".

Zum Beispiel könnten Sie in Ihrem obigen Beispiel einen Ganzzahlwert zurückgeben, der einem Fehlercode entspricht.

2

Wie würden Sie etwas zur Karte im zweiten Beispiel hinzufügen? Ich denke, es wäre eine schlechte Übung, wenn Sie eine leere Karte übergeben müssen, die ausgefüllt wird addTokenErrorsToReport. Aber in diesem Fall: Nein, ich denke nicht, dass es eine schlechte Übung ist. Wie würdest du das sonst implementieren, wenn du mehrere List<String> tokens hast, die du verarbeiten willst? Ich denke, das erste Beispiel ist einfach.