Warum sollten wir vorzugsweise erstklassige Sammlungen verwenden?

15

Gemäß Regel 4 von Object Calisthenics von Jeff Bay (RTF) in The ThoughtWorks Anthology wird empfohlen, " erstklassige Sammlungen zu verwenden ".

Regel 4: Erstklassige Sammlungen

Die Anwendung dieser Regel ist einfach: Jede Klasse, die eine Sammlung enthält, sollte keine anderen Mitgliedsvariablen enthalten. Jede Sammlung wird in einer eigenen Klasse verpackt, sodass Verhaltensweisen, die sich auf die Sammlung beziehen, nun ein Zuhause haben. Möglicherweise stellen Sie fest, dass Filter Teil dieser neuen Klasse werden. Außerdem kann Ihre neue Klasse Aktivitäten wie das Zusammenfügen von zwei Gruppen oder das Anwenden einer Regel auf jedes Element der Gruppe ausführen.

Was ich daraus verstehen konnte, war, dass wir eine separate Klasse verwenden sollten, die die Auflistung einschließt und mit Methoden zum Hinzufügen, Löschen und Ändern von Daten dieser Auflistung arbeitet.

und wir brauchen dies, damit wir sicher sind, welcher Datentyp in die Sammlung aufgenommen wird und was herauskommt.

Wenn wir die generische Sammlung verwenden (in den Sprachen, in denen sie anwendbar ist), müssen wir diese Regel befolgen?

Wenn mir eine wichtige Bedeutung fehlt, bitte klären.

Amogh Talpallikar
quelle
1
Amogh Talpallikar Ich habe Regel 8 in Regel 4 geändert, da Regel 8 eigentlich "Keine Klassen mit mehr als zwei Instanzvariablen" lautet.
Yannis
Im Inhaltsverzeichnis scheint Regel 8 zu stehen , und im Hauptteil heißt es dann Regel 4 .
Nutzlos
6
Bin es nur ich oder ist diese Regel in der geschriebenen Form nicht umsetzbar? Ich meine, du hast eine Klasse mit einer Sammlung, also nimmst du alles andere raus. Jetzt ist deine Klasse eine Sammlung. Wenn Sie also eine andere Klasse haben, in der diese Klasse enthalten ist, enthält sie eine Sammlung und ... schäumen, ausspülen, wiederholen.
mjfgates
@mjfgates: hmm ... Großartiger Punkt! etwas zum Nachdenken!
Amogh Talpallikar

Antworten:

12

Typensicherheit ist ein sehr geringer Grund, erstklassige Sammlungen zu verwenden. Von Ihrem Link:

Regel 4: Erstklassige Auflistungen Die Anwendung dieser Regel ist einfach: Jede Klasse, die eine Auflistung enthält, sollte keine anderen Mitgliedsvariablen enthalten. Jede Sammlung wird in eine eigene Klasse eingeschlossen, sodass Verhaltensweisen, die sich auf die Sammlung beziehen, nun ein Zuhause haben. Möglicherweise stellen Sie fest, dass Filter Teil dieser neuen Klasse werden. Außerdem kann Ihre neue Klasse Aktivitäten wie das Zusammenfügen von zwei Gruppen oder das Anwenden einer Regel auf jedes Element der Gruppe ausführen.

Die Idee dabei ist, dass Sie vom Code aufgefordert werden, eine eigene Klasse zu erstellen, wenn Sie nach Semantiken suchen, filtern, validieren oder etwas anderes als diese hinzufügen / entfernen / iterieren. Wenn Sie nur einen Wert (nach einer Suche) aktualisieren müssen, gehört dies wahrscheinlich zur Auflistungsklasse.

Der Grund dafür ist ziemlich einfach, Sammlungen neigen dazu, herumgereicht zu werden. Bald haben 4 verschiedene Klassen ihre eigene SearchByID()Methode. Oder Sie erhalten Rückgabewerte wie Map<Integer, String>im Kontext dessen, was in dieser Karte gespeichert ist, entfernt. Eine erstklassige Sammlung ist eine einfache Lösung, die eine einzelne Quelldatei kostet. In der Praxis ist jede Änderung, die sich auf die Auflistung bezieht, einfach zu handhaben, sobald diese vorhanden sind (und auch sehr einfach, Komponententests zu schreiben), z. B. wenn SearchByIDeine GUID anstelle einer int verwendet werden muss.

Steve Jackson
quelle
8

... verwenden Sie eine separate Klasse, die die Sammlung einschließt, und löschen Sie mit Methoden zum Hinzufügen die Änderungsdaten dieser Sammlung

Dies ist weit mehr als nur eine Garantie für die Art der in den Sammlungen gespeicherten Objekte, sondern auch für alle Sammlungsinvarianten.

Bäume (rot-schwarz, AVL usw.) reagieren empfindlich auf die Reihenfolge und ihr Verhalten hängt von einem Neuausgleich ab, wenn dies angemessen ist. Die Leistung von Hash-Tabellen hängt auch von einem geeigneten erneuten Hashing ab. Möchten Sie daran denken, den Auslastungsfaktor jedes Mal zu überprüfen, wenn Sie eine Hash-Map einfügen?

FWIW, der Text ist ziemlich klar darüber (und ich werde das Ganze in Ihre Frage bearbeiten, so dass niemand anderes diese RTF herunterladen muss):

Jede Sammlung wird in einer eigenen Klasse verpackt, sodass Verhaltensweisen, die sich auf die Sammlung beziehen, nun ein Zuhause haben

Es hat nichts mit Typen (oder daher auch mit Generika) zu tun, sondern alles damit, das Verhalten der Sammlung mit ihren Daten zu verknüpfen.

Nutzlos
quelle
1

Die einfache Antwort lautet "Nein", wenn Sie eine Sprache verwenden, die Generics unterstützt. Da es nicht erforderlich ist, den Typ zu überprüfen, leistet das Sprachfeature selbst ziemlich gute Arbeit (aus meiner Erfahrung mit Java-Generika).

Wenn Sie jedoch eine Situation haben, in der Sie die in der Sprache angegebene Datenstruktur anpassen möchten, können Sie eine Wrapper-Klasse um die ursprüngliche Datenstruktur erstellen, Ihre eigenen APIs verfügbar machen und dennoch die zugrunde liegende Implementierung der ursprünglichen Datenstruktur verwenden.

java_mouse
quelle
Ich denke auch in den ähnlichen Zeilen. aber es sollte etwas geben, die Beispiele, die ich dafür sah, waren in Java und C # und beide unterstützen generische Sammlungen.
Amogh Talpallikar
@AmoghTalpallikar: Mein Punkt war, es einfach zu halten. Sofern ich kein bestimmtes Verhalten der Datenstruktur überschreiben muss, werde ich keine Anpassungen vornehmen.
Java_Mouse