Soll ich ArrayList erweitern, um Attribute hinzuzufügen, die nicht null sind?

7

Ich möchte nur dann eine Auflistung von Objekten zu einer ArrayList hinzufügen, wenn das bestimmte Attribut nicht null ist.

Ich denke darüber nach, die ArrayList zu erweitern und die Prüfung in der Kindklasse zu implementieren.

Ein alternativer Weg besteht darin, nach dem Attribut zu suchen, bevor man es in eine Arraylist legt, aber das würde bedeuten, dass ich die if-Checks überall verstreuen muss, wenn ich die Objekte basierend auf der Logik zur Arraylist hinzufügen muss.

Ich würde gerne Ihre Gedanken dazu wissen ... bei einem zweiten Gedanken ist es ein Overkill?

    
Sudhakar 20.02.2012, 09:30
quelle

4 Antworten

20

Dekorationsmuster

Ich würde sogar empfehlen, ArrayList mit einem gut dokumentierten Muster Decorator zu verpacken. Sie wickeln einfach Ihre ArrayList mit einer anderen List -Implementierung um, die die meisten Methoden delegiert, aber Validierungslogik hinzufügt:

%Vor%

Vorteile:

  • Sie können immer noch auf die rohe Liste ohne Validierung zugreifen, wenn Sie möchten (aber Sie können dies einschränken)
  • Es ist einfacher, verschiedene Validierungen zu stapeln, sie selektiv ein- und auszuschalten.
  • Fördert die Komposition über die Vererbung , wie von @helios angegeben
  • Verbessert die Testbarkeit
  • Verbindet Sie nicht mit einer bestimmten List -Implementierung. Sie können die Validierung zu LinkedList oder Hibernate -backed persistente Listen. Sie können sogar an generische Collection Decorator denken, um eine Sammlung zu validieren.

Implementierungshinweise

Denken Sie trotz der Implementierung an einige Methoden, an die Sie beim Überschreiben denken müssen: add() , addAll() , set() , subList() (?) usw.

Auch Ihr Objekt muss unveränderlich sein, andernfalls kann der Benutzer ein gültiges Objekt hinzufügen / setzen und anschließend ändern, um den Vertrag zu verletzen.

Gutes OO-Design

Schließlich schrieb ich:

%Vor%

aber beachte:

%Vor%

was ein besseres Design ist.

Stapelvalidierungen

Wie bereits erwähnt, wenn Sie Validierungen stapeln wollen, indem Sie jede Eigenschaft / Apsekt in einer einzelnen, separaten Klasse validieren, betrachten Sie das folgende Idiom:

%Vor%

... und einige Implementierungen:

%Vor%

Möchten Sie nur foo validieren?

%Vor%

Möchten Sie sowohl foo als auch Balken validieren?

%Vor%     
Tomasz Nurkiewicz 20.02.2012, 09:39
quelle
1

Wenn Sie dies erzwingen möchten, sehe ich nicht, warum nicht (obwohl Sie den Rückgabewert der add-Methode überprüfen sollten, wenn Sie hinzufügen, um sicherzustellen, dass es erfolgreich war).

Dies ist ein guter Weg, um diese redundante Logik loszuwerden, die in späteren Software-Iterationen steckenbleiben kann oder nicht.

    
Jesus Ramos 20.02.2012 09:33
quelle
1

Ich halte das nicht für eine gute Praxis. Berücksichtigen Sie stattdessen das Schreiben einer Util-Methode in eine Util-Klasse mit zwei Parametern: Die Array-Liste und das Objekt, das Sie hinzufügen möchten. Dort können Sie überprüfen, was Sie wollen und die Logik über Ihren Code hinweg wiederverwenden.

    
Simon 20.02.2012 09:38
quelle
0

Das einzige Problem wäre, wenn Sie diesen Code wiederverwenden und Sie sich nicht daran erinnern, dass Sie die ArrayList-Klasse überschrieben haben, stellen Sie sicher, dass Sie einen Kommentar schreiben.

    
Vince Pergolizzi 20.02.2012 09:36
quelle