Angenommen, innerhalb des privaten Teils einer Klasse gibt es einen Wert, der von mehreren privaten Methoden verwendet wird. Ziehen es die Leute vor, diese Variable als Member-Variable für die Klasse zu definieren oder als Argument an jede der Methoden zu übergeben - und warum?
Einerseits konnte ich ein Argument dafür sehen, dass das Reduzieren des Zustands (dh der Elementvariablen) in einer Klasse im Allgemeinen eine gute Sache ist, obwohl es ideal erscheint, wenn derselbe Wert in den Methoden einer Klasse wiederholt verwendet wird Kandidat für die Repräsentation als Status für die Klasse, um den Code sichtbar sauberer zu machen, wenn sonst nichts.
Bearbeiten:
Um einige der Kommentare / Fragen zu klären, die aufgeworfen wurden, spreche ich nicht über Konstanten, und dies bezieht sich nicht auf einen bestimmten Fall, sondern nur auf eine Hypothese, über die ich mit anderen gesprochen habe.
Wenn ich den OOP-Winkel für einen Moment ignoriere, war der bestimmte Anwendungsfall, den ich im Sinn hatte, der folgende (es sei angenommen, dass der Pseudocode durch Referenzierung sauberer gemacht wird)
int x
doSomething(x)
doAnotherThing(x)
doYetAnotherThing(x)
doSomethingElse(x)
Was ich damit meine, ist, dass es eine Variable gibt, die mehreren Funktionen gemeinsam ist - in dem Fall, in dem ich es mir vorgestellt habe, lag es an der Verkettung kleinerer Funktionen. Wenn dies in einem OOP-System alle Methoden einer Klasse wären (z. B. aufgrund von Refactoring durch Extrahieren von Methoden aus einer großen Methode), könnte diese Variable um alle herum übergeben werden oder es könnte sich um ein Klassenmitglied handeln.
quelle
Antworten:
Wenn der Wert eine Eigenschaft der Klasse ist, belassen Sie ihn in der Klasse. Andernfalls belassen Sie ihn außerhalb der Klasse. Sie entwerfen Ihre Klassenmethoden nicht zuerst, sondern zuerst ihre Eigenschaften. Wenn Sie nicht daran gedacht haben, diese Eigenschaft überhaupt in die Klasse aufzunehmen, gibt es wahrscheinlich einen Grund dafür.
Das Schlimmste, was Sie in Bezug auf die Skalierbarkeit tun können, ist, Ihren Code aus Gründen der Benutzerfreundlichkeit zu ändern. Früher als später werden Sie feststellen, dass Ihr Code aufgebläht und dupliziert ist. Allerdings muss ich zugeben, dass ich manchmal gegen diese Regel verstoße ... Convenience ist einfach so verdammt ansprechend.
quelle
Wenn Sie den Status zwischen zwei Aufrufen nicht wirklich halten müssen (und dies anscheinend nicht tun oder die Frage nicht stellen würden), würde ich den Wert eher als Argument als als als Elementvariable bevorzugen, da dies einen kurzen Blick auf die Daten ermöglicht An der Signatur der Methode sehen Sie, dass das Argument verwendet wird, während es etwas schwieriger ist, sofort zu erkennen, welche Membervariablen von der Methode verwendet werden. Es ist auch nicht immer schnell zu bestimmen, wofür private Mitgliedsvariablen gedacht sind.
Normalerweise würde ich nicht zustimmen, dass der Code, der Member-Variablen verwendet, sichtbar sauberer ist, aber wenn die Methodensignaturen außer Kontrolle geraten, kann ich eine Ausnahme machen. Eine Frage, die sich lohnt, von der das Projekt aber auf keinen Fall abhängt.
quelle
Vielen Dank für die Frage, ich wollte dies auch fragen.
Als ich darüber nachdachte, gab es einige Vorteile, wenn ich es als Argument anführte
Ich verstehe zum Beispiel klar, dass Sie das Excel-Dokument analysieren (z. B. mithilfe der POI-Bibliothek). Statt die Zeileninstanz an alle Methoden zu übergeben, die mit dieser Zeile arbeiten müssen, verfügt der Autor über eine Mitgliedsvariable
currentRow
und arbeitet damit.Ich würde sagen, es sollte einen Namen für dieses Anti-Pattern geben, oder? (nicht aufgeführt hier )
quelle
Vielleicht sollten Sie eine neue Klasse extrahieren, die alle Methoden enthält, die diesen Wert gemeinsam haben. Natürlich wird die Methode der höchsten Ebene in der neuen Klasse öffentlich sein. Es kann hilfreich sein, diese Methode zum Testen freizulegen.
Wenn Sie zwei oder mehr Temporäre haben, die immer zusammen übergeben werden, sollten Sie mit ziemlicher Sicherheit eine neue Klasse extrahieren.
quelle
Wenn ich verstehe, was Sie fragen: Die Methoden in einer Klasse sind per Definition mit den Implementierungsdetails vertraut, sodass ich keine Bedenken habe, ein Mitglied direkt von einer Methode aus zu verwenden.
Es ist nichts Falsches daran, a
private static final
zu deklarieren , um Konstanten zu definieren. Der Compiler kann den Wert verwenden, um einige Optimierungen zu berücksichtigen. Da es sich um Konstanten handelt, fügen sie der Klasse keinen Status hinzu.Wenn Sie symbolisch darauf verweisen können (z. B.
BLRFL_DURATION
) und keine zusätzlichen Argumente zu Ihren Methoden hinzufügen müssen, wird Ihr Code besser lesbar und daher besser wartbar.quelle
Wenn sich der Wert nicht ändert, handelt es sich definitionsgemäß um eine Konstante, die in der Klasse gekapselt werden sollte. In diesem Fall wird davon ausgegangen, dass dies keinen Einfluss auf den Zustand eines Objekts hat. Ich kenne Ihren Fall nicht, aber ich denke an etwas wie PI in Trigonometrie. Wenn Sie versuchen, ein Argument einer solchen Konstante zu übergeben, können Sie das Ergebnis einem Fehler aussetzen, wenn der Client den falschen Wert oder einen Wert übergibt, der nicht mit der von den Methoden erwarteten Genauigkeit vorliegt.
quelle