it-swarm.com.de

Bevorzugen Sie Klassenmitglieder oder übergeben Sie Argumente zwischen internen Methoden?

Angenommen, im privaten Teil einer Klasse gibt es einen Wert, der von mehreren privaten Methoden verwendet wird. Ziehen es die Leute vor, dies als Mitgliedsvariable 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 Mitgliedsvariablen) in einer Klasse im Allgemeinen eine gute Sache ist, obwohl es ideal erscheint, wenn derselbe Wert in allen Methoden einer Klasse wiederholt verwendet wird Kandidat für die Darstellung als Zustand für die Klasse, um den Code sichtbar sauberer zu machen, wenn nichts anderes.

Bearbeiten:

Um einige der aufgeworfenen Kommentare/Fragen zu klären, spreche ich nicht über Konstanten, und dies bezieht sich nicht auf einen bestimmten Fall, sondern nur auf eine Hypothese, über die ich mit einigen anderen Personen gesprochen habe.

Wenn ich den Winkel OOP für einen Moment ignoriere, war der spezielle Anwendungsfall, an den ich gedacht habe, der folgende (nehmen Sie an, dass Sie nur als Referenz übergeben werden, um den Pseudocode sauberer zu machen).

int x
doSomething(x)
doAnotherThing(x)
doYetAnotherThing(x)
doSomethingElse(x)

Ich meine also, dass es eine Variable gibt, die mehreren Funktionen gemeinsam ist - in dem Fall, an den ich gedacht habe, war dies auf die Verkettung kleinerer Funktionen zurückzuführen. In einem OOP - System, wenn dies 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 sie alle herum übergeben werden oder es könnte eine Klasse sein Mitglied.

45
geoffjentry

Wenn der Wert eine Eigenschaft der Klasse ist, behalten Sie ihn in der Klasse bei. Andernfalls bewahren Sie es draußen auf. Sie entwerfen Ihre Klassenmethoden nicht zuerst. Sie entwerfen zuerst seine 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, den Code der Einfachheit halber zu ändern. Früher als später werden Sie feststellen, dass Ihr Code aufgebläht und dupliziert ist. Ich muss jedoch zugeben. Manchmal verstoße ich gegen diese Regel. Bequemlichkeit ist einfach so verdammt ansprechend.

17
AJC

Wenn Sie den Status zwischen Aufrufen nicht wirklich beibehalten müssen (und anscheinend nicht, oder Sie würden die Frage nicht stellen), würde ich es vorziehen, wenn der Wert ein Argument und keine Mitgliedsvariable ist, weil ein kurzer Blick darauf gerichtet ist An der Signatur der Methode erfahren Sie, dass das Argument verwendet wird, während es etwas schwieriger ist, sofort zu erkennen, welche Mitgliedsvariablen von der Methode verwendet werden. Es ist auch nicht immer schnell festzustellen, wofür private Mitgliedsvariablen bestimmt sind.

Normalerweise würde ich nicht zustimmen, dass Code mit Mitgliedsvariablen sichtbar sauberer ist, aber wenn die Methodensignaturen außer Kontrolle geraten, kann ich eine Ausnahme machen. Es ist eine lohnende Frage, aber nicht etwas, von dem das Projekt auf jeden Fall abhängen wird.

14
psr

Vielen Dank für die Frage, ich wollte dies auch stellen.

Als ich darüber nachdachte, gab es einige Vorteile, warum ich es als Argument weitergeben sollte

  • es ist einfacher zu testen -> einfacher zu warten (bezogen auf den letzten Punkt)
  • hat keine Nebenwirkungen
  • es ist leichter zu verstehen

Ich verstehe Ihren Standpunkt zum Beispiel deutlich: Zum einen wird das Excel-Dokument analysiert (z. B. mithilfe der POI-Bibliothek), und anstatt die Zeileninstanz an jede Methode zu übergeben, die mit dieser Zeile arbeiten muss, hat der Autor die Mitgliedsvariable currentRow und arbeitet mit es.

Ich würde sagen, es sollte einen Namen für dieses Anti-Muster geben, oder? (nicht aufgeführt hier )

10
Betlista

Vielleicht sollten Sie eine neue Klasse extrahieren, die alle Methoden enthält, die diesen Wert teilen. Natürlich wird die Methode der höchsten Ebene in der neuen Klasse öffentlich sein. Es kann hilfreich sein, diese Methode zum Testen verfügbar zu machen.

Wenn Sie zwei oder mehr Provisorien haben, die immer zusammen übergeben werden, sollten Sie mit ziemlicher Sicherheit eine neue Klasse extrahieren.

1
kevin cline

Ziehen es die Leute vor, dies als Mitgliedsvariable für die Klasse zu definieren oder als Argument an jede der Methoden zu übergeben - und warum?

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 aus einer Methode zu verwenden.

Einerseits konnte ich ein Argument dafür sehen, dass das Reduzieren des Zustands (dh der Mitgliedsvariablen) in einer Klasse im Allgemeinen eine gute Sache ist ...

Es ist nichts Falsches daran, einen 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, wird der Klasse kein Status hinzugefügt.

obwohl, wenn der gleiche Wert wiederholt in den Methoden einer Klasse verwendet wird ...

Wenn Sie symbolisch darauf verweisen können (z. B. BLRFL_DURATION) Und Ihren Methoden keine zusätzlichen Argumente hinzufügen müssen, wird Ihr Code besser lesbar und daher besser wartbar.

1
Blrfl

wenn sich der Wert nicht ändert, ist er per Definition eine Konstante und sollte innerhalb der Klasse gekapselt werden. In diesem Fall wird nicht davon ausgegangen, dass dies den Status eines Objekts beeinflusst. Ich kenne Ihren Fall nicht, aber ich denke an etwas wie PI in der 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 der Genauigkeit entspricht, die die Methode (n) erwarten.

0
NoChance