2016-08-01 20 views
3

Ich bin in der Entwurfsphase eines Projekts, das bestimmte Validierungen für ein bestimmtes Objekt durchführen muss. Die Validierungen können in 5 verschiedene Gruppen eingeteilt werden. Jede einzelne Validierungskategorie kann mehrere Versionen aufweisen, die sich in ihren Implementierungen geringfügig unterscheiden.Verschiedene Validatoren basierend auf Eingabe

public interface Validator { 
boolean validate(Object o); 
} 

public abstract CostValidator implements Validator { 
//common logic related to cost validator 
} 

public class CostValidator1 extends CostValidator { 
boolean validate(Object o) { 
    //implementation 1 
} 

public class CostValidator2 extends CostValidator { 
boolean validator(Object o) { 
    //implementation 2 
} 

Basierend auf der Geschäftsgruppe des Objekts muss entweder CostValidator1 oder CostValidator2 ausgeführt werden.

Für jede Unternehmensgruppe, plane ich in einem Konfigurationssystem, dh eine Liste solcher Validierer auf die Aufrechterhaltung:

BusinessGroupA { 
validators = [CostValidator1, SomeOtherValidator2...] 
} 

BusinessGroupB { 
validators = [CostValidator2, AnotherValidator99...] 
} 

enter image description here

Der Verarbeitungsablauf der Liste der Validierer holen wird von der Konfiguration basiert auf die Geschäftsgruppe und führt die Validierungen in jedem der so enthaltenen Validatoren aus.

Gibt es Fehler bei diesem Ansatz? Oder gibt es einen besseren Weg, den beschriebenen Anwendungsfall zu behandeln?

+0

Ich würde gerne wissen, ob es eine bessere Möglichkeit gibt, dies angesichts der Anforderungen zu gestalten. Da sich mein Projekt in der Entwurfsphase befindet, möchte ich so viele Alternativen wie möglich erkunden. – Rahul

+0

Gibt es einen besonderen Grund, warum die Validierungslogik in separate Klassen unterteilt wird? Warum können Objekte sich nicht selbst validieren? 'if (! object1.isValid()) {...}' –

+0

Basierend auf der Geschäftsgruppe, zu der ein Objekt gehört, CostValidator1 oder CostValidator2 oder keine Kostenvalidierung wird angewendet. In ähnlicher Weise können Objekte, die der Gruppe A angehören, drei Validatoren in der Pipeline haben, die zu B gehören. Außerdem kann ein Objekt von einer Unternehmensgruppe in eine andere verschoben werden, wie in der Zukunft benötigt wird. Dieses Objekt wird von verschiedenen Komponenten bearbeitet, die ihren eigenen Aspekt der Geschäftslogik implementieren. Die hier aufgeführten Validierer gehören zu einer solchen logischen Gruppierung. Auch die Codebasis für die Objektklasse folgt einem funktionelleren Ansatz gegenüber OO – Rahul

Antwort

1

ich zwei Verbesserungen zu der obigen Lösung hinzufügen würde vorschlagen:

Regeln

1. Garantie das Vorhandensein der erforderlichen Validierung

diese Gruppe Validierungen ausgeführt werden sollte relevant für jedes Unternehmen Unter der Annahme, sollte es ein Mechanismus, der garantiert, dass die Konfiguration genügend Validierungsregeln, dh Validierungsklassen, spezifiziert. Wenn Sie Dutzende von Eigenschaften und vielleicht Hunderte von Geschäftsgruppen haben, wäre es zu einfach, einen Fehler in der Konfiguration zu machen, d. H. Keinen Validator für Kosten anzugeben. Mein Vorschlag wäre, auf der Ebene des Business-Objekts anzugeben, welche Eigenschaften einen Validator haben müssen. Erstellen Sie dann eine Art Objektfactory, die Validatoren basierend auf der Geschäftsgruppen- und Validierungsanforderung an das Objekt bindet.

ich diesen Ansatz folgen würde: für jede Art von Validierungs

  1. Eine Schnittstelle, zum Beispiel ICostValidator und IWeightValidator.
  2. In Ihrer Konfiguration hält eine Liste der Validator-Schnittstellen, die für das Business-Objekt benötigt werden, z.B .:

    requiredValidators = [ICostValidator, IWeightValidator];

  3. Überprüfen Sie bei der Überprüfung der BusinessGroupA oder BusinessGroupB immer, ob die konfigurierten Validatoren alle erforderlichenInterfaces implementieren.

2. entkoppeln die Validierer aus der spezifischen Business-Objekt

Wenn Sie an Kosten und Gewicht Validierung suchen jetzt werden sie an das Business-Objekt gebunden ist. Ich kenne den Rest Ihres Klassendiagramms nicht, aber ich könnte mir vorstellen, dass die Eigenschaften für Kosten und Gewicht in mehreren Geschäftsobjekten erscheinen würden, wie beispielsweise Artikel, AngebotsLinie, VerkaufsauftragLinie, VersandLinie usw. Dann wäre es gut, Prüfer zu haben hängen nicht direkt vom Geschäftsobjekt ab und können einfach auf mehrere Geschäftsobjekte angewendet werden.In der Objekt-Factory könnten Sie auch auf die korrekte Bindung zwischen Validatoren und darunter liegenden Objekten achten.

Lassen Sie mich wissen, wenn Sie einige Codebeispiele möchten.

+0

Danke für die Antwort! 1. Das ist ein sehr stichhaltiger Punkt und ich habe auch darüber nachgedacht, einen Mechanismus einzurichten, der sicherstellt, dass einige Validatoren nicht versehentlich übersehen werden. Ich werde das in mein Design einbeziehen. 2. Sie haben Recht. Ich sehe zwar keinen Anwendungsfall für diese Validatoren, die heute auf mehrere Geschäftsobjekte einwirken, aber man kann nie sicher sein, welche Änderungen in der Zukunft erforderlich sein werden. Wäre es möglich, einige weitere Details zur Erreichung des ersten Punktes zu liefern, den Sie in der Antwort erwähnt haben? – Rahul

+0

@Rahul Ich habe gerade meine Antwort aktualisiert ... –