mehrere Klassen mit gleichen Methoden - bestes Muster

8

Ich habe einige Klassen in meinem aktuellen Projekt, wo die Validierung von E-Mail / Website-Adressen notwendig ist. Die Methoden dafür sind alle gleich.

Ich habe mich gefragt, was der beste Weg ist, dies zu implementieren, also müssen diese Methoden nicht überall kopiert werden?

Die Klassen selbst sind nicht unbedingt verwandt, sie haben nur diese Validierungsmethoden gemeinsam.

    
Tony The Lion 05.04.2010, 13:23
quelle

9 Antworten

15

Wie wäre es, eine Schnittstelle hinzuzufügen und eine Erweiterungsmethode zu verwenden?

%Vor%

So:

  • keine unnötige Vererbung
  • keine Vervielfältigung
Marc Gravell 05.04.2010, 13:25
quelle
7

Sie können den gesamten Validierungscode in eine Validator-Klasse einfügen und diese Klasse dann überall dort verwenden, wo eine Validierung erforderlich ist. Der Zugriff auf die Validierung sollte über eine einzige Methode erfolgen, Validate(object Something) vielleicht. Ich denke, das wird "Composition" genannt (was Designmuster angeht).

Später können Sie Unterklassen von Validatoren haben, die vielleicht spezifischer sind oder verschiedene Arten der Validierung durchführen.

Sie können auch alle Klassen, die eine Validierung benötigen, um eine Basisklasse oder abstrakte Klasse erweitern, die 90% der Validierung enthält.

    
quelle
5

Klingt so, als ob Sie nur eine statische Klasse mit einer statischen Methode brauchen

%Vor%     
juharr 05.04.2010 13:30
quelle
2

Ja, das Duplizieren dieses Codes wäre ein schlechter Geruch, Sie können diese Methoden in statischen Methoden in einzelne Helper-Klassen extrahieren oder Sie können eine "Validator" -Schnittstellenklasse definieren und über diese Schnittstelle können Sie verschiedene Validierungsmethoden mit einer Kette von verknüpfen Verantwortungsmuster.

    
baris.aydinoz 05.04.2010 13:28
quelle
1

Sie müssen sich wirklich die aspektorientierte Programmiermethodik (AoP) ansehen. Die Enterprise Library 4.1 verfügt über eine AoP-Implementierung namens Unity Interception.

Ссылка

Mit diesem Framework können Sie eine einzelne Handler-Klasse für die E-Mail-Validierung codieren. Was damit verbunden ist, ist, dass der Validierungscode in eine Handler-Klasse und nicht mehr Teil der Klasse (n) gelangt. Als nächstes markieren Sie die Klassen für das Abfangen.

Sie können die Klassen auf verschiedene Arten abfangen, einschließlich der Festlegung eines Attributs für die gewünschte Methode, die entsprechend Ihren Anforderungen abgefangen und behandelt werden soll. Das Festlegen eines Attributs ist wahrscheinlich der einfachste Weg, eine Überwachung durchzuführen.

    
code4life 05.04.2010 17:23
quelle
1

Erstellen Sie eine Dienstprogrammklasse und definieren Sie diese Methoden als Erweiterungsmethoden für geeignete Klassen / Schnittstellen.

    
Vivek 05.04.2010 13:26
quelle
0

Erstellen Sie Validierungslogikklassen und -schnittstellen, und lassen Sie sie in Ihren Code einfügen ... also trennen Sie die Logik von der Validierung, damit sie wiederverwendet werden kann ...

    
Tim Mahy 05.04.2010 13:26
quelle
0

Erstellen Sie Email als separate Klasse.
Verwenden Sie Email als Eigenschaften / Parameter / Rückgabewerte in Ihren Klassen anstelle von String .
Erstellen Sie EmailValidator , um Zeichenfolgen als E-Mail-Adressen zu validieren.
Erstellen Sie EmailFactory , das eine E-Mail zurückgibt, wenn eine gültige E-Mail-Adresse übergeben wurde, und null, wenn dies nicht der Fall ist.

(Machen Sie dasselbe für die Website).

    
Even Mien 05.04.2010 13:44
quelle
0

Ich würde Ihnen empfehlen, eine IValidator-Schnittstelle zu erstellen und dann mehrere verschiedene Validatoren zu erstellen, die verschiedene Szenarien behandeln. Hier ist ein Beispiel:

%Vor%

Die CanValidateType () -Methode könnte etwas komplexer sein, aber ich hoffe, Sie haben die Idee. Es gibt im Wesentlichen an, ob der Validierer die gelieferte Eingabe verarbeiten kann. Hier sind ein paar Implementierungen:

%Vor%

Sie werden jetzt die Konstruktorinjektion verwenden, um die Abhängigkeit in Ihre Klasse zu injizieren:

%Vor%

Der CanValidateType ist praktisch, wenn Sie eine Klasse haben, die mehrere Validatoren verwenden kann. In diesem Szenario übergeben Sie eine Liste oder ein Array von Validatoren an den Konstruktor.

%Vor%

Sie müssten dann die erforderliche Instanz des oder der Validatoren irgendwie in Ihre Klassen einbringen. Dies geschieht oft mit einem IoC Container (wie Castle Windsor) oder mach es selbst.

%Vor%

Der obige Code wird auf eigene Faust mühsam, deshalb sind IoC-Container so praktisch. Mit einem IoC-Container können Sie Folgendes tun:

%Vor%

Die gesamte Zuordnung der Schnittstellen erfolgt in Ihrer app.config oder web.config.

Hier ist ein tolles Tutorial zu Dependency Injection und dem Castle Windsor IoC-Container.

    
mikesigs 05.04.2010 17:56
quelle