Gibt es eine Faustregel, wann eine statische Methode im Vergleich zu einer Instanzmethode codiert werden soll?

7

Ich lerne Java (und OOP) und obwohl es irrelevant sein könnte, wo ich gerade bin, habe ich mich gefragt, ob SO einige häufige Fallstricke oder gute Designpraktiken teilen könnte.

    
asdfqwer 23.01.2009, 23:46
quelle

13 Antworten

14

Eine wichtige Sache zu erinnern ist, dass statische Methoden nicht von einer Unterklasse überschrieben werden können. Verweise auf eine statische Methode in Ihrem Code binden diese im Wesentlichen an diese Implementierung. Bei Verwendung von Instanzmethoden kann das Verhalten basierend auf dem Typ der Instanz variiert werden. Sie können den Polymorphismus nutzen. Statische Methoden sind eher für utilitaristische Operationen geeignet, bei denen das Verhalten in Stein gemeißelt ist. Dinge wie Base-64-Codierung oder Berechnung einer Prüfsumme zum Beispiel.

    
laz 24.01.2009, 00:13
quelle
9

Ich glaube nicht, dass irgendeine der Antworten auf das Herz des OO-Grundes kommt, wann man das eine oder das andere wählen sollte. Sicher, verwenden Sie eine Instanzmethode, wenn Sie mit Instanzmembern arbeiten müssen, aber Sie können alle Ihre Member öffentlich machen und dann eine statische Methode codieren, die eine Instanz der Klasse als Argument akzeptiert. Hallo C.

Sie müssen über die Nachrichten nachdenken, auf die das Objekt, das Sie entwerfen, reagiert. Diese werden immer Ihre Instanzmethoden sein. Wenn du auf diese Weise an deine Objekte denkst, wirst du fast nie etwas davon haben statische Methoden . Statische Mitglieder sind unter bestimmten Umständen in Ordnung.

Bemerkenswerte Ausnahmen, die mir in den Sinn kommen, sind die Factory-Methode und Singleton-Muster (sparsam verwenden). Seien Sie vorsichtig, wenn Sie versucht sind, eine "Helfer" -Klasse zu schreiben, denn von dort aus ist es ein rutschiger Abhang in die prozedurale Programmierung.

    
moffdub 24.01.2009 00:46
quelle
2

Wenn die Implementierung einer Methode vollständig in Bezug auf die öffentliche Schnittstelle (ohne Downcasting) Ihrer Klasse ausgedrückt werden kann, dann kann es ein guter Kandidat für eine statische "Dienstprogramm" -Methode sein. Auf diese Weise können Sie eine minimale Schnittstelle beibehalten und gleichzeitig die Komfortmethoden bereitstellen, die von den Clients des Codes häufig verwendet werden. Wie Scott Meyers erklärt , fördert dieser Ansatz die Kapselung, indem er die Menge an Code minimiert, die von einer Änderung der internen Implementierung einer Klasse betroffen ist . Hier ist ein weiterer interessanter Artikel von Herb Sutter, der std :: basic_string auswählt und entscheidet, welche Methoden Mitglieder sein sollten und welche nicht .

In einer Sprache wie Java oder C ++ gebe ich zu, dass die statischen Methoden den Code weniger elegant machen, so dass es immer noch einen Kompromiss gibt. In C # können Erweiterungsmethoden Ihnen das Beste aus beiden Welten bieten.

Wenn die Operation aus irgendeinem Grund von einer Unterklasse überschrieben werden muss, dann muss es natürlich eine Instanzmethode sein. In diesem Fall müssen Sie über alle Faktoren nachdenken, die beim Entwerfen einer Klasse für die Vererbung berücksichtigt werden .

    
Dave Ray 24.01.2009 00:43
quelle
1

Meine Faustregel lautet: Wenn die Methode irgendetwas mit einer bestimmten Instanz einer Klasse verknüpft ausführt, unabhängig davon, ob Klasseninstanzvariablen verwendet werden müssen. Wenn Sie eine Situation in Betracht ziehen, in der Sie möglicherweise eine bestimmte Methode verwenden müssen, ohne sich unbedingt auf eine Instanz der Klasse zu beziehen, sollte die Methode definitiv statisch (Klasse) sein. Wenn diese Methode in bestimmten Fällen auch Instanzvariablen verwenden muss, ist es wahrscheinlich am besten, eine separate Instanzmethode zu erstellen, die die statische Methode aufruft und die Instanzvariablen übergibt. Leistungsmäßig glaube ich, dass es einen vernachlässigbaren Unterschied gibt (zumindest in .NET, obwohl ich mir vorstellen würde, dass es für Java sehr ähnlich wäre).

    
Noldorin 23.01.2009 23:54
quelle
1

Wenn Sie den Status (einen Wert) eines Objekts beibehalten und die Methode für den Zugriff oder die Änderung des Status verwendet, sollten Sie eine Instanzmethode verwenden.

Auch wenn die Methode den Status (eine Dienstprogrammfunktion) nicht ändert, würde ich Ihnen empfehlen, eine Instanzmethode zu verwenden. Meistens weil Sie auf diese Weise eine Unterklasse haben, die eine andere Aktion ausführen kann.

Für den Rest könnten Sie eine statische Methode verwenden.

:)

    
OscarRyz 24.01.2009 00:21
quelle
1

Ihre Standardauswahl sollte eine Instanzmethode sein.

    
Craig P. Motlin 24.01.2009 00:32
quelle
0

Dieser Thread sieht relevant aus: Methode kann statisch gemacht werden, aber sollte es? Der Unterschied zwischen C # und Java wird seine Relevanz nicht beeinflussen (denke ich).

    
jcollum 23.01.2009 23:53
quelle
0

Wenn es eine Instanzvariable verwendet, muss es eine Instanzmethode sein.

Wenn nicht, liegt es bei Ihnen. Wenn Sie jedoch viele statische Methoden und / oder statische nicht finale Variablen vorfinden, möchten Sie wahrscheinlich alle statischen Komponenten in eine neue Klasseninstanz extrahieren. (Ein Haufen statischer Methoden und Member ist ein Singleton, aber ein wirklich nerviger, ein echtes Singleton-Objekt wäre besser - ein reguläres Objekt, das eines der besten ist!).

    
Bill K 24.01.2009 00:34
quelle
0

Grundsätzlich gilt als Faustregel, wenn für das Objekt spezifische Daten verwendet werden. Math.max ist also statisch, aber BigInteger.bitCount () ist eine Instanz. Es wird offensichtlich komplizierter, wie es bei Ihrem Domänenmodell der Fall ist, und es gibt Grenzfälle, aber die allgemeine Idee ist einfach.

    
Matthew Flaschen 24.01.2009 00:49
quelle
0

Ich würde standardmäßig eine Instanzmethode verwenden. Der Vorteil besteht darin, dass das Verhalten in einer Unterklasse außer Kraft gesetzt werden kann, oder wenn Sie für Schnittstellen codieren, kann eine alternative Implementierung des Kollaborators verwendet werden. Dies ist sehr nützlich für die Flexibilität beim Testen von Code.

Statische Referenzen werden in Ihre Implementierung eingebunden und können nicht geändert werden. Ich finde statische nützlich für kurze Hilfsmethoden. Wenn der Inhalt Ihrer statischen Methode sehr groß ist, sollten Sie darüber nachdenken, die Verantwortlichkeit in ein oder mehrere separate Objekte aufzuteilen und diese mit dem Client-Code als Objektinstanzen zusammenarbeiten zu lassen.

    
cliff.meyers 24.01.2009 01:00
quelle
0

IMHO, wenn Sie es zu einer statischen Methode machen können (ohne die Struktur ändern zu müssen), dann machen Sie es zu einer statischen Methode. Es ist schneller und einfacher.

Wenn Sie wissen, dass Sie die Methode überschreiben wollen, schlage ich vor, dass Sie einen Komponententest schreiben, in dem Sie dies tun und es daher nicht länger angebracht ist, ihn statisch zu machen. Wenn das zu viel harte Arbeit klingt, dann mach es nicht zu einer Instanzmethode.

Im Allgemeinen sollten Sie keine Funktionalität hinzufügen, sobald Sie sich eine Anwendung eines Tages vorstellen (so liegt der Wahnsinn), Sie sollten nur Funktionen hinzufügen, die Sie wirklich brauchen.

Für eine längere Erklärung ...

Ссылка

Ссылка

    
Peter Lawrey 24.01.2009 07:07
quelle
0

Das Problem bei statischen Methoden besteht darin, dass Sie eines der objektorientierten Kernprinzipien durchbrechen, wenn Sie an eine Implementierung gekoppelt sind. Sie möchten das Open-Close-Prinzip unterstützen und Ihre Klasse eine Schnittstelle implementieren lassen, die die Abhängigkeit beschreibt (in einem abstrakten Verhaltenssinn) und dann Ihre Klassen von dieser Schnittstelle abhängig machen. Viel einfacher zu erweitern nach diesem Punkt vorwärts. ..

    
leora 24.01.2009 12:14
quelle
0

Meine statischen Methoden sind immer eine der folgenden:

  1. Private "Helfer" -Methoden, die eine nur für diese Klasse nützliche Formel auswerten.
  2. Factory-Methoden ( Foo.getInstance() etc.)
  3. In einer "Dienstprogramm" -Klasse, die endgültig ist, einen privaten Konstruktor hat und nichts anderes als öffentliche statische Methoden enthält (z. B. com.google.common.collect.Maps )

Ich werde eine Methode nicht statisch machen, nur weil sie sich nicht auf Instanzvariablen bezieht.

    
finnw 11.09.2009 23:41
quelle

Tags und Links