it-swarm.dev

Wann kommen 'statische Funktionen' zum Einsatz?

OK, ich habe gelernt, was eine statische Funktion ist, aber ich verstehe immer noch nicht, warum sie nützlicher sind als Funktionen für private Mitglieder. Dies mag hier eine Art neue Frage sein, aber warum nicht stattdessen einfach alle Funktionen privater Mitglieder durch statische Funktionen ersetzen?

25
Dark Templar

Angenommen, Sie verwenden OOP , verwenden Sie statische Funktionen, wenn sie nicht von Klassenmitgliedern abhängig sind. Sie können weiterhin privat sein, werden jedoch auf diese Weise optimiert, da sie nicht von einer Instanz des zugehörigen Objekts abhängen.

Abgesehen von den oben genannten Funktionen finde ich statische Funktionen nützlich, wenn Sie keine Instanz eines Objekts erstellen möchten, nur um eine öffentliche Funktion darauf auszuführen. Dies ist hauptsächlich bei Hilfsklassen der Fall, die öffentliche Funktionen enthalten, um sich wiederholende und allgemeine Arbeiten auszuführen, zwischen den Aufrufen jedoch keinen Status beibehalten müssen.

27
Bernard

Ich versuche eine einfachere Erklärung als die oben genannten (ziemlich gute).

Ein Objekt ist normalerweise Code + Daten. Eine statische Methode wird verwendet, wenn Sie nur den Teil "Code" bearbeiten müssen (es werden keine Daten/Status verwaltet (außer statischen Datenelementen)).

8
Brian Knoblauch

Weil sie keine Instanz benötigen und öffentlich sein können. Angenommen, Sie benötigen eine Funktion, um den größten gemeinsamen Nenner zu erhalten (GCD; sehr nützlich für Bruchklassen; und ja, dies ist nur ein einfaches Beispiel). Es macht keinen Sinn, eine Klasse von Objekten zu erstellen, deren einziger Zweck darin besteht, dass Sie einen this Zeiger haben können, den Sie in gcd weder benötigen noch verwenden. Sie verwenden dafür eine statische Methode, idealerweise für die Klasse, die tatsächlich die GCD verwendet (z. B. in der Bruchklasse).

Natürlich, wenn es nur statische Methoden gibt, machen Sie OOP falsch und sollten entweder zu tatsächlich tun OOP) wechseln oder eine Sprache verwenden, die Ihrem Paradigma besser entspricht .

5
user7043

Ich benutze sie als Hilfsfunktionen für allgemeine Aufgaben. Beispiele sind:

  • Umrechnung von Graden in Bogenmaß (und umgekehrt);
  • Eine Schnur hacken;
  • Konvertieren von einer Aufzählung in etwas anderes (in diesem Projekt, an dem ich arbeite, fungieren sie als Hash-Tabelle);

Die meisten meiner Dateien, in denen statische Funktionen gruppiert sind, haben das Suffix Helper. Das bedeutet, dass sie mir dabei helfen, schneller irgendwohin zu gelangen.

2
George Silva

Was eine statische Methode ist:

Statische Methoden erfordern weder eine Instanz der Klasse, noch können sie implizit auf die Daten (oder dies, sich selbst, mich usw.) einer solchen Instanz zugreifen. [ 1 ]

Beispiele dafür, wann statische Methoden nützlich sind:

  • Globale/Hilfsmethoden
  • Abfrageergebnisse von einer Datenmodellklasse abrufen (SP aufrufen)

Verwenden Sie sie nur, wo dies angebracht ist.

  1. Wenn Sie feststellen, dass Sie dieselben Methoden in mehrere Objekte kopieren, sollten Sie die Methode statisch machen, damit Sie DRY folgen können.
  2. Verwenden Sie statische Methoden, wenn Sie keine Instanz eines Objekts benötigen (Sie arbeiten nicht an den Instanzvariablen des Objekts).

Wenn sich viele Ihrer Daten außerhalb von Objekten befinden und mit statischen Methoden bearbeitet werden, ist Ihr Code nicht objektorientiert und kann schwierig zu pflegen sein.

2
coder

Statisch und privat sind tatsächlich orthogonal: Eine Methode kann statisch oder privat oder keine oder beides sein.

Statisch oder nicht statisch (a.k.a. 'Instanzmethoden') gibt an, ob die Methode für die Klasse selbst (statisch) oder für eine bestimmte Instanz (nicht statisch) ausgeführt wird. Abhängig von der Sprache können Sie eine statische Methode über eine Instanz aufrufen, aber Sie können niemals über eine statische Methode auf die Instanz zugreifen (was auch bedeutet, dass Sie keine nicht statischen Methoden innerhalb einer statischen Methode aufrufen können, nur weil Sie keine haben this Objekt). Verwenden Sie statische Methoden, um ein Verhalten zu implementieren, das konzeptionell mit der Klasse verknüpft ist, jedoch nicht an eine bestimmte Instanz gebunden ist. Ein anderes Szenario, in dem Sie möglicherweise statische Methoden verwenden möchten, besteht darin, dass Sie eine Funktion haben, die auf zwei Instanzen einer Klasse ausgeführt wird, und keiner der Operanden einen privilegierten Status verdient - vorausgesetzt, Sie haben eine Klasse Vector und Sie Addition implementieren wollen; Ihre Additionsmethode könnte als a.Add(b) bezeichnet werden, aber Vector.Add(a, b) ist wahrscheinlich sinnvoller.

Privat vs. öffentlich sind ungefähr Sichtbarkeit der Methode. Auf private Methoden kann nur aus dem eigenen Bereich der Klasse zugegriffen werden, während auf öffentliche Methoden von überall aus zugegriffen werden kann. Die wichtigste Verwendung hierfür ist die Kapselung: Indem Sie nur die Methoden und Eigenschaften veröffentlichen, die der Rest des Codes für die Kommunikation mit Ihrer Klasse unbedingt benötigt, begrenzen Sie die Punkte, an denen externer Code Probleme verursachen kann, und verhindern Probleme innerhalb des Codes Ihre Klasse blutet nicht in den Rest des Projekts.

Faustregel:

  • machen Sie alle Mitgliedsfunktionen privat, mit Ausnahme derjenigen, die von außerhalb der Klasse aufgerufen werden müssen
  • alle Methoden instanzieren Methoden, es sei denn, sie sind auch dann sinnvoll, wenn keine Instanz der Klasse vorhanden ist
1
tdammers

Ich möchte auf eine andere Verwendung von statischem f () hinweisen.

http://www.parashift.com/c++-faq/named-ctor-idiom.html

Auf Folgendes hinaus: Mit den Funktionen static können Sie "Named Constructors" erstellen, dh Sie benennen Ihre statische Funktion mit einem geeigneten und selbstdokumentierenden Namen, und diese statische Funktion ruft einen der Konstruktoren auf (da Konstruktoren identische Namen haben und Sie können viele von ihnen haben, es wird schwierig, zwischen ihnen zu unterscheiden).

0
newprint

Etwas spät hier, aber ich möchte versuchen, eine genaue Definition zu erstellen: Statische Funktionen sind Funktionen, die nicht oder nicht auf Instanzeigenschaften/-methoden der enthaltenen Klasse verweisen können.

In einigen Sprachen, wie z. B. C #, gibt es möglicherweise statische Felder oder Eigenschaften in statischen Klassen. Daher ist es nicht genau richtig zu sagen, dass sie nicht für den Status verwendet werden. Eine statische Funktion kann den statischen (globalen) Status verwenden.

Grundsätzlich läuft es darauf hinaus: Statische Funktionen sind wie alles Statische nützlich, wenn es sinnvoll ist, dass sie immer verfügbar sind, ohne von nicht statischen Instanzen abhängig zu sein.

Hilfsfunktionen sind wie mathematische Funktionen ein häufig genanntes Beispiel, aber es gibt auch andere.

Wenn für die von Ihnen erstellte Klasse die Daten unveränderlich sein müssen, ist es möglicherweise sinnvoll, statische Funktionen zu erstellen, die eine Instanz aufnehmen und eine neue Instanz übergeben, da die Instanz nicht geändert werden kann (oder sollte). Zeichenfolgenklassen können beispielsweise statische Funktionen haben, die eine Zeichenfolge (oder 2 oder mehr) aufnehmen und eine neue Zeichenfolge zurückgeben.

Ein weiterer Grund könnte sein, dass es eine Klasse gibt, die einen globalen Status oder Daten irgendeiner Art beibehält. Möglicherweise gibt es statische Funktionen, die mit den statischen Eigenschaften oder Feldern in dieser statischen Klasse arbeiten.

0
Bob

Ich verwende statische Methoden sowohl in C++ als auch in C # für Utility-Klassen, Klassen ohne Instanzdaten, nur eine Möglichkeit, eine Sammlung nützlicher, verwandter Methoden zu bündeln.

int count1 = DBUtil::GetCountOfSlackerEmployees();
int count2 = DBUtil::GetCountOfEmployedSlackers();
0
Chris O

Angenommen, Sie sprechen von C++ (Sie haben es nicht gesagt) und Sie haben die richtigen Begriffe (d. H. Sie bedeuten nicht Mitgliedsfunktionen/-methoden):

Sogar eine private Mitgliedsfunktion muss noch im Header deklariert werden, was bedeutet, dass sie tatsächlich Teil der API und des ABI der Klasse wird, obwohl der Benutzer sie nicht aufrufen kann. Wenn Sie eine private Member-Funktion hinzufügen, ändern oder löschen, erzwingen Sie die Neukompilierung aller abhängigen Klassen (der Header hat sich geändert, make kann es nicht besser wissen). Wenn Sie dies in einer Bibliothek tun, müssen Sie die Kompatibilität für die Anwendung berücksichtigen es.

Auf der anderen Seite erhalten statische Funktionen mit Dateibereich kein öffentliches Symbol, sodass Sie sie nach Belieben hinzufügen, ändern oder löschen können, ohne dass etwas über die eine Kompilierungseinheit hinaus betroffen ist.

0
Jan Hudec

Normalerweise benötigen Sie eine statische Hauptleitung, um als Einstiegspunkt für Ihr Programm zu fungieren. Das könnte irgendwie wichtig sein.

0
Wyatt Barnett

Eine statische Funktion (und es gibt unterschiedliche Bedeutungen für diesen Begriff in verschiedenen Sprachen) erfordert keinen Status, der zwischen den Aufrufen beibehalten wird. Wenn es konzeptionell eng mit dem verbunden ist, was eine Klasse tut, machen Sie es zu einer Klassenfunktion (wie bei einer Klasse, die kein Objekt ist) oder, wenn nicht, zu einer globalen Funktion (oder einer Funktion auf Modulebene, was auch immer). Es gehört nicht zu einem Objekt, wenn es den Status des Objekts nicht benötigt.

Wenn Sie den Status ständig an ihn übergeben, ist dies keine zustandslose Funktion. Sie erstellen lediglich eine zustandsbehaftete Funktion mit zustandsloser Syntax. In diesem Fall gehört es wahrscheinlich zum aufrufenden Objekt, oder es wird ein Refactoring angezeigt, um den Status und das Verhalten besser auszurichten.

0
kylben

"Warum nicht stattdessen alle Funktionen privater Mitglieder durch statische Funktionen ersetzen?"

... weil ein privates Mitglied auf Instanzdaten zugreifen kann, während dies nur durch Aufrufe innerhalb anderer Mitgliedsfunktionen möglich ist. Die statische Funktion kann privat sein, kann jedoch eine Instanz der Klasse nur ändern oder auf sie verweisen, wenn die Instanz als Parameter übergeben wird.

0
jheriko

Es ist lustig, wie noch niemand eine gute Antwort geben konnte. Ich bin mir auch nicht sicher, ob dies der Fall ist. Sie sollten es wahrscheinlich als Hinweis nehmen, dass sie so wenig wie möglich verwendet werden sollten. Sie sind immerhin eher prozedural als OOP.

Hier sind einige weitere Beispiele:

In Obj-C, wo sie als Klassenmethoden bezeichnet werden, werden sie häufig als Zuordnungs-Wrapper verwendet, bei denen das Objekt vor der Rückgabe in den Referenzzählpool gestellt wird.

Ein weiteres Beispiel von Obj-C ist das Registrieren einer neuen Klasse in einer Klassensammlung. Angenommen, Sie haben eine Reihe von Klassen, die jeweils einen Dateityp verarbeiten. Wenn Sie eine neue Klasse für einen neuen Dateityp erstellen, können Sie diese mithilfe einer statischen Methode in der Klasse, die den Dateityp bestimmt, in der Auflistung (einer globalen Variablen) registrieren.

In C++ kann ich mir auch vorstellen, Fehler leise abzufangen. Ihre Konstruktorfunktion kann nur durch Auslösen einer Ausnahme fehlschlagen. Sie könnten eine Fehlerinstanzvariable festlegen, dies ist jedoch nicht immer angemessen. Stattdessen können Sie die Teile ausführen, die in einem statischen Wrapper möglicherweise fehlschlagen, und dann das neue Objekt zuweisen und zurückgeben oder bei einem Fehler NULL.

0
Per Johansson

Angenommen, Sie möchten den Sinus von etwas berechnen.

Ohne statische Aufladung:

Math math = new Math()
double y = math.sin(x)

Mit statischen:

double y = Math.sin(x)

Es macht keinen Sinn, sin nicht statisch zu machen. Es ist zustandslos und verarbeitet nur die Eingabe.

Statische Funktionen sind nicht an bestimmte Objekte gebunden. Sie sind "allgemeine" Funktionen, die vom internen Zustand des Objekts unabhängig sind.

0
dagnelies