Warum sehe ich so viele instanziierbare Klassen ohne Zustand?

18

Ich sehe viele instanziierbare Klassen in der C ++ - und Java-Welt, die keinen Status haben.

Ich kann wirklich nicht herausfinden, warum die Leute das tun, sie könnten einfach einen Namespace mit freien Funktionen in C ++ oder eine Klasse mit einem privaten Konstruktor und nur statischen Methoden in Java verwenden.

Der einzige Vorteil, den ich mir vorstellen kann, ist, dass Sie den größten Teil Ihres Codes nicht ändern müssen, wenn Sie später entscheiden, dass Sie in bestimmten Situationen eine andere Implementierung wünschen. Aber ist das nicht ein Fall von verfrühtem Design? Es könnte später in eine Klasse umgewandelt werden, wenn / wenn es angemessen wird.

Verstehe ich das falsch? Ist es nicht OOP, wenn ich nicht alles in Objekte stecke (dh instanziierte Klassen)? Warum gibt es dann so viele Utility-Namespaces und -Klassen in den Standardbibliotheken von C ++ und Java?

Update: Ich habe in meinen vorherigen Jobs sicherlich viele Beispiele dafür gesehen, aber ich habe Mühe, Open-Source-Beispiele zu finden. Vielleicht ist das ja doch nicht so üblich. Trotzdem frage ich mich, warum die Leute das tun und wie häufig es ist.

futlib
quelle
2
Schwer zu beantworten, ohne "so häufig" zu quantifizieren. Ich kann nicht sagen, dass ich das sehr oft sehe. Ändern Sie das Q in "Wie sind Klassen ohne Ivars nützlich?"
Caleb
@Caleb Ich werde nach Beispielen in Open Source-Projekten suchen. Ich habe es definitiv viel in den Java-Shops gesehen, für die ich gearbeitet habe.
Futlib
@futlib: ja, das ist üblich. stackoverflow.com/questions/4692845/…
Hoàng Long
Betrachten Sie eine Klasse, die nur z. EntityManager enthält keinen Status?
user470365

Antworten:

22

Ich sehe viele instanziierbare Klassen in der C ++ - und Java-Welt, die keinen Status haben.

Einige mögliche Gründe, um Klassen ohne eigene Ivars zu erstellen:

  • Staat ist oder könnte in einer Oberklasse enthalten sein.

  • Class implementiert eine Schnittstelle und muss instanziierbar sein, damit Instanzen an andere Objekte übergeben werden können.

  • Klasse soll untergeordnet werden.

  • Praktischer Weg, um verwandte Funktionen zu gruppieren. (Ja, es kann bessere oder andere Möglichkeiten geben, dasselbe zu tun.)

Verstehe ich das falsch? Ist es nicht OOP, wenn ich nicht alles in Objekte stecke (dh instanziierte Klassen)?

OOP ist ein Paradigma, kein Naturgesetz. Es gibt einige Sprachen, in denen alles ein Objekt ist, so dass Sie wirklich keine Wahl haben. Andere Sprachen (z. B. C) unterstützen OOP überhaupt nicht, Sie können jedoch weiterhin objektorientiert programmieren. Ich würde sagen, Sie können OOP haben, wenn Sie nicht alles in Klassen tun ... Sie könnten sagen, dass Sie in diesem Fall nur weniger OOP haben .

Caleb
quelle
4

Caleb und Robert Harvey haben bereits darauf hingewiesen, was Utility-Klassen sind und einige legitime Gründe für "datenlose" Klassen. Diese Beschreibungen sind zutreffend, befassen sich aber mit den positiven Aspekten.

Ich möchte nur erwähnen, dass der Missbrauch von Utility-Klassen definitiv ein OO- Anti-Pattern sein kann (siehe Beschreibung von c2wiki ). Dieses Zitat fasst es gut zusammen:

Eine große Anzahl solcher Klassen (insbesondere solche mit nur einer einzigen Methode) deutet darauf hin, dass die Designer verkehrt herum denken, d. H. Denken an das, was an einem Objekt getan werden kann, anstatt an das, was das Objekt tun kann.

Wenn Sie behaupten, objektorientiertes Design zu praktizieren, Ihre Codebasis jedoch fast ausschließlich aus Utility-Klassen besteht, würde ich sagen, dass Sie definitiv etwas falsch machen. Trotzdem hat ein funktionaler Ansatz ebenso viele Vorteile und kann auch eine hervorragende Arbeitsweise sein. Behaupte nur nicht, dem einen zu folgen, während du den anderen halbherzig umsetzt.

Daniel B
quelle
2

Utility-Klassen in Java und C ++ werden verwendet, um eine Bibliothek von Methoden zu verwalten, die einen oder mehrere Eingabeparameter verwenden und ein Ergebnis zurückgeben. Sie müssen den Zustand nicht halten, wenn sie einfach einen Wert zurückgeben. Insofern können diese Methoden als grobe Form der funktionalen Programmierung mit all ihren Vorteilen angesehen werden (zum einen ohne Probleme mit der Parallelität).

In jedem Fall dienen diese Klassen nur dazu, verwandte Methoden in einem einzigen Container zusammenzufassen. Diese Methoden erfordern keine Instanziierung eines Objekts, um ordnungsgemäß zu funktionieren. Ein Beispiel für eine solche Klasse ist eine Math-Klasse, die SINE- und COSINE-Funktionen (und andere mathematische Funktionen) enthält.

Robert Harvey
quelle
2

Viele dieser Klassen interagieren mit Daten, auch wenn sie diese nicht explizit enthalten, und müssen dies so tun, dass mehrere Instanzen gleichzeitig aktiv sein müssen. ZB ein zustandsloses Session Bean, das mit einer gespeicherten Datenbankprozedur interagiert, eingehende Daten an ein PL / SQL-Paket weitergibt und die Ergebnisse an die aufrufende Anwendung zurückgibt. Das Ding muss in mehreren Instanzen existieren, enthält aber selbst keine Datenfelder.

jwenting
quelle
0

In objektorientierten Sprachen, in denen Klassen keine Objekte sind, können Sie mit einem Objekt viel mehr tun als mit einer Klasse.

Sie können ein Objekt als Parameter übergeben, Sie können ein typkompatibles Objekt ersetzen, Sie können eine Schnittstelle implementieren (ich stelle mir vor, dass es Sprachen gibt, in denen Klassen Objekte sind, aber Sie können einige dieser Dinge tun, aber auf jeden Fall ...) . All diese Dinge sind ziemlich wichtig, daher besteht die Standardentscheidung normalerweise darin, eine Klasse instanziierbar zu machen.

Für einige Klassen scheinen die durch die Instanziierung gewährten Fähigkeiten unwahrscheinlich zu sein. Sie müssen wahrscheinlich nicht eine Implementierung von Cosine gegen eine andere austauschen. Es stellt sich heraus, dass es hauptsächlich Dienstprogrammfunktionen sind, die diese Funktionen nicht benötigen. Daher sind es hauptsächlich Dienstprogrammfunktionen, deren Klassen nicht instanziierbar sind.

bA
quelle