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


39

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.


1
Wie wird dieser Wert verwendet? Es ist konstant? Ändert es sich? Unterliegt es Änderungen zwischen den Zusammenstellungen?
Oded

Wenn sich automatisch herausstellt, dass die Dinge alle gleich sind, ist es einfacher zu glauben, dass dies keine Rolle spielt. Was wäre, wenn Sie eine Funktion hätten, die einen angepassten (x) Wert wie x-1 benötigt?
JeffO

Antworten:


15

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.


1
Ich stimme zu - das ursprüngliche Design / der ursprüngliche Zweck der Klasse sollte Ihnen sagen, ob es sich um eine Mitgliedsvariable oder ein Argument handeln soll. Denken Sie auch über die Abhängigkeit des Einspritzwinkels nach.
Martijn Verburg

14

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.


10

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

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

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 currentRowund arbeitet damit.

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


Welches Anti-Pattern meinst du?
Vahid Ghadiri

Kurz gesagt, eine Mitgliedsvariable, um Parameter zwischen zwei (oder mehr) Funktionsaufrufen zu teilen ...
Betlista

1

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.


1

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?

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.

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 ...

Es ist nichts Falsches daran, a private static finalzu 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.

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

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.


0

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.