Ich habe kürzlich einem meiner Kollegen empfohlen, dass bei unserem aktuellen Projekt (C #) "Dienste staatenlos und daher statisch sein sollten".
Mein Kollege stimmte zu und wies darauf hin, dass die Dienste in unserem Projekt tatsächlich staatenlos sind (und sein sollten). Mein Kollege widersprach jedoch, dass "statisch" keinen Zustand und "staatenlos" "statisch" bedeutet.
Meine Fragen lauten: "Bedeutet eine Methode, die als statisch markiert ist, dass sie keinen Zustand erfordert und dass staatenlose Methoden in der Mehrzahl der Fälle statisch gemacht werden sollten?"
bedeutet eine als statisch markierte Methode dass es keinen Zustand erfordert
1) Nein. Sie können nicht sagen, dass statische Methoden bedeuten, dass kein Zustand erforderlich ist, da statische Methoden auf statische / Singleton-Ressourcen zugreifen können.
Die Mehrheit der Fälle sollte staatenlos sein Methoden werden statisch gemacht
2) Ja. Methoden, die keinen Zustand erfordern und daher keine Instanz benötigen, sollten generell statisch gemacht werden.
Eine statische Methode in C # kann auf die statischen Variablen ihrer enthaltenden Klasse zugreifen. Ist dies der Fall, ist sie nicht zustandslos. Ich habe einige schmerzhafte Fälle von nicht-reentranten "staatenlosen" statischen Methoden gesehen, die lustige Wettlaufbedingungen auslösen.
Eine wirklich zustandslose Methode kann tatsächlich statisch gemacht werden und sollte dies generell tun.
Ich finde es ziemlich beängstigend zu sagen, dass zustandslos dasselbe ist wie statisch , da es sich um zwei verschiedene Welten handelt. Zustandslos bedeutet, dass kein Zustand beibehalten wird, dh, ein perfektes Beispiel ist eine HTTP-Verbindung (sobald Daten gesendet werden, die Verbindung geschlossen ist und kein Speicher mehr vorhanden ist), wo wir tatsächlich versuchen, unser Bestes zu geben, um den Status zu erhalten (Login Staat für einen).
Statisch andererseits ist ein Ausdruck, der verwendet wird, um eine Art zu beschreiben, auf die eine Methode aufgerufen wird. In C # bedeutet dies, dass eine Methode ohne eine Klasseninstanz aufgerufen werden kann, eine Instanz einer Klasse jedoch nicht mit einem Zustand übereinstimmt. Es gibt immer noch die statische Instanz und das ist perfekt in der Lage, den Zustand zu erhalten: Jede statische Membervariable, Feld oder Eigenschaft kann den Zustand beibehalten. Eine statische Methode oder Klasse ist auch perfekt in der Lage, den Zustand durch Verwendung von Speicherabbilddateien, einer Datenbank oder was auch immer zu erhalten. Statisch ist eine Aufrufkonvention, nichts mehr und ist nicht damit verbunden, staatenlos zu sein oder nicht.
Ich denke, seine Aussage macht ungefähr so viel Sinn wie "Demokratien sollten gelbe Papierzettel verwenden".
Er mischt ein High-Level-Design-Konzept "Stateless Services" mit einem Low-Level-technischen Implementierungsdetail "mit statischen Klassen".
Statuslose Dienste können (und wurden) in Sprachen implementiert werden, die nur statische Variablen unterstützen (z. B. COBOL, RPG) und Sprachen, die nicht einmal statische Variablen erlauben (Erlang usw.).
Ich könnte mir leicht einen Fall vorstellen, in dem statusloser Dienst weitgehend mit statischen Klassen implementiert wurde, da sie dort waren und bereits die korrekte Geschäftslogik implementiert haben, obwohl es allgemein als gute Java-Programmierpraxis angesehen wird, keine statischen Klassen zu verwenden, es sei denn, Sie müssen dies wirklich tun.
Er versteht auch ernsthaft, worum es bei "statisch" geht - eine statische Variable ist eine Möglichkeit, den Zustand zwischen den Aufrufen zu speichern - und würde daher besser mit einem "stateful" -Dienst übereinstimmen.
static ist ein Sprachschlüsselwort und state ist ein Entwurfskonzept. Es gibt eine offensichtliche Beziehung zwischen diesen beiden Dingen, aber es ist eine Beziehung des Konkreten zum Metaphysischen, nicht eine Beziehung von Ursache und Wirkung. Es ist möglich, dass statische Methoden auf bestimmte Arten von Zustandsinformationen verweisen.
In Bezug auf zustandslose Methoden sprechen wir hier von einer Methode, die nicht auf eine Klasseninstanz verweist, d. h. einen this-Zeiger. Die Markierung dieser Methoden als statisch verbessert die Übersichtlichkeit des Codes und entspricht den Best Practices. Beachten Sie, dass es sich in diesem Fall um eine spezifische Art von "Staatenlosigkeit" handelt und dass wir keine generellen Kommentare über die Verwendung von Stateful Contexts geben.
statisch kann zustandsbehaftet sein. Sie müssen nur statische Container für diesen Zustand definieren. und die Container werden unter allen Aufrufen Ihrer statischen Methoden geteilt.
Die kurze Antwort auf Ihre Frage lautet "nein", static
bedeutet nicht "kein Zustand".
In Bezug auf Ihre anderen Kommentare kann static
verwendet werden, um Ihnen bei der Implementierung eines zustandslosen Dienstes zu helfen, aber static
allein reicht nicht aus. Ein weiteres Werkzeug / Technik, um etwas zustandslos zu machen, ist die Verwendung unveränderlicher Datenstrukturen. Dies ist (derzeit) nicht eine der Stärken von C #, besonders im Vergleich zu F #.
Abgesehen davon, dass alle Definitionen von "statisch", die man durchlaufen kann, erneut durchlaufen werden, ist die Antwort "ja". Statische Methoden können den Zustand der Klasse selbst modifizieren (dargestellt durch statische Variablen). und even ändern den Status von Instanzen der Klasse (insbesondere wenn sie eine Instanz oder einen Satz von Instanzen übergeben werden). Allerdings verwenden Sie in den meisten Fällen statische Methoden, wenn kein Status geändert wird. Das wichtigste Beispiel ist das Finden oder Erstellen einer Instanz (Factory-Methoden).
Das heißt, die wirkliche Antwort ist "nein". Im realen Leben (zum Beispiel Web-Services über HTTP oder Interaktion mit einer beliebigen Art von Orb) stellen Dienste ihre Dienstmethoden niemals mit tatsächlichen statischen Methoden zur Verfügung. Normalerweise rufen Sie statische Methoden auf, um eine Instanz des Service (oder eine Instanz der Service Factory, von der Sie eine Instanz erhalten!) Abzurufen und dann damit zu arbeiten. Dies liegt daran, dass Ihr Dienst-Proxy intern darauf achten muss, wo er sich befindet. Während Ihre Methoden Ihnen gegenüber staatenlos erscheinen, sind sie es wirklich nicht.
Ich hoffe, das war nicht zu verwirrend:)
Eine statische Klasse ist nicht zustandslos. Es kann immer noch Variablen haben, die, obwohl sie statisch sind, einen Zustand haben.
Eine statische Klasse ohne Variablen auf Klassenebene ist zustandslos. Es enthält keine Daten.
Jede Klasse hat eine Klassendefinitionsstruktur, in der statische Felder dargestellt und gespeichert werden. Jede "Instanz" der Klasse hat Zugriff auf die in der Klassendefinition gespeicherten statischen Felder (eine Datenstruktur calld CORINFO_CLASS_STRUCT
). Auch wenn NO-Instanzen erstellt wurden, kann Code überall in Ihrer Assembly auf diese statischen Felder auf Klassenebene zugreifen, indem die Syntax classname.StaticFieldName
ohne jegliche Instanz verwendet wird.
Da die in diesen statischen Feldern auf Klassenebene gespeicherten Werte beibehalten werden, sind sie definitiv State. In der Tat sind sie ein Zustand, der nicht nur von irgendwelchen Instanzen der Klasse geteilt wird, die möglicherweise existieren, sondern sie werden während der gesamten Assembly geteilt, unabhängig davon, ob Instanzen erstellt wurden oder nicht.
Noch bedeutender ist es, dass, sobald eine CORINFO_CLASS_STRUCT
-Klassendefinition geladen wurde, im Gegensatz zu einer echten Instanz der Klasse nie entladen ist, bis die Assembly (oder die AppDomain) wird entladen, daher ist es wohl mehr statusbehaftet als jedes Instanzfeld, das in einer Klasse definiert ist, da ein Instanzfeld verschwindet, wenn die Instanz unbemerkt gesammelt wird.
Weitere Informationen finden Sie in CORINFO_CLASS_STRUCT
link zum großartigen Buch von Don Boxes, Grundlegendes .Net
Das ist im Allgemeinen richtig. Sie können jedoch statische Variablen haben, die Ihren statischen Methoden erlauben, einen Zustand zu haben. Nehmen wir zum Beispiel diese FooBarFactory-Klasse:
%Vor%In diesem Fall hat Ihre statische Methode ein Minimum an Status, aber es ist (wahrscheinlich) notwendig.
Wenn Sie eine einzelne Instanz mit Status verwenden möchten, verwenden Sie ein Singleton-Muster. Dadurch wird deutlich, dass Sie mit einem Objekt mit einem einzigen Vorkommen arbeiten.
Davon ausgehend würde ich dann alle statischen Klassen und Methoden als zustandslos behandeln. Es hilft nur gesund zu bleiben.