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.
quelle
Antworten:
Typensicherheit ist ein sehr geringer Grund, erstklassige Sammlungen zu verwenden. Von Ihrem Link:
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 wieMap<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. wennSearchByID
eine GUID anstelle einer int verwendet werden muss.quelle
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):
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.
quelle
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.
quelle