Wie würden Sie diese einfache Klasse verbessern mehr lose gekoppelt werden?

StackOverflow https://stackoverflow.com/questions/348606

  •  20-08-2019
  •  | 
  •  

Frage

Wie Sie unten sehen können, im Konstruktor ich instanziieren ein Validierungs Objekt so dass ich ein Benutzer E-Mail in einer Set-Methode validieren. Ist diese Architektur beste Praxis oder fehlerhaft? Kann ich meine User-Klasse direkt abhängig von meiner Validation Klasse vermeiden machen?

Class User {
  Private Email

//constructor
User() {
  Validation = new Validation
}

SetEmail(NewValue) {
  if (Validation.isEmail(NewValue)) {
    Email = NewValue
  }
}

Und eine weitere Frage: Wenn eine Set-Methode einen ungültigen Wert erhält, was ist die richtige Antwort? Ich sehe zwei Optionen

  1. Sie den Wert nicht gesetzt und return false
  2. Stellen Sie den Wert auf jeden Fall, aber einen Fehler Eigenschaft für das Objekt festgelegt. (Also wenn User.Error gesetzt ich weiß etwas schief gegangen ist)

Ich vermute, # 1 Best Practice ist, weil Sie dann der Wert einer Objekteigenschaft versichern kann, immer gültig ist. Richtig?

War es hilfreich?

Lösung

Die bisherigen Vorschläge scheinen alle Art und Weise übertrieben zu sein, besonders mit all den IOC und AOP Sachen.

  1. Die User Klasse muss eine E-Mail-Adresse, so dass eine EmailAddress Klasse erstellen und hat die User Klasse einen über eine Eigenschaft und / oder dessen Konstruktor übernehmen. Dass die Validierung kann so einfach sein, wie, ob die Eingabe EmailAddress Referenz null oder nicht.

  2. Die EmailAddress Klasse kann eine einfache, aber im Allgemeinen wiederverwendbare Implementierung sein (man denkt es auf dem RFC Dokument gestützt). Es sollte unveränderlich sein und soll eine Ausnahme von seinem Konstruktor auf ungültige Eingabe.

  3. werfen
  4. Idealerweise sollte die EmailAddress Klasse eines EmailUserId Klasse zusammengesetzt sein (basierend auf dem RFC?) Und eine InternetDomain Klasse (basierend auf dem RFC?), Da eine E-Mail-Adresse eine Verbunddatenstruktur ist. jede dieser Klassen Auch hier soll unveränderlich Instanzen verwalten und soll eine Ausnahme auf dem Bau mit ungültiger Eingabe.

  5. werfen

„Validation“ scheint mich nicht ein „Ding“, sondern eine generische „action“. Daher bietet es sich an ein Verfahren eher als eine Klasse zu sein. In diesem Fall neige ich dazu, die Validierung in jedem dieser Klassen als private statische Methode (valid(input)) zu implementieren, die vom Konstruktor aufgerufen wird, in Sprachen wie Java oder C #. Oft wird es sinnvoll, dass die Funktionalität öffentlich in Form einer Frage (isValid(input)) verfügbar zu machen.

EDIT:

  

Sind Sie vorschlag, dass jeder unterschiedliche Datentyp brauche ich sollte zu überprüfen haben eine eigene Klasse ist?

Das ist eine solide Art und Weise, die Frage der Adressierung, die gemeinhin als Werttyp (Danke für die Erinnerung, Frank) bekannt. Das Ergebnis wird ein paar (Dutzend oder zwei) wohldefinierte, wiederverwendbare Klassen wie vielleicht EmailAddress, PhoneNumber, PersonName sein usw. Die dargestellte Alternative ist wahrscheinlich in einer „god-Klasse“ führen mit einer Mischung aus Funktionalität, die nicht wiederverwendbar ist, nicht leicht zu pflegen, und schwierig zu testen.

Es gibt auch andere Möglichkeiten, um die Lösung zu partitionieren, aber mein Vorschlag hat den Vorteil, dass reift, gut verstanden, und im Einklang mit einem großen Satz von festen Gestaltungsprinzipien. Ich würde es auf jeden Fall empfehlen versuchen, bevor Sie Ihre eigenen erfinden.

Andere Tipps

Ich würde:

  1. , um die Kopplung an die Beton Validation Objekt Brechen über Abhängigkeits Injektion: definieren eine abstrakte (rein virtuelle) -Klasse Validation, stellen eine konkrete Validierung Klasse daraus ziehen, und übergeben ( „injizieren“) einen Verweis auf die abstrakte Validation-Klasse in dem Konstruktor der Klasse User.

    Für eine ausgezeichnete Diskussion darüber, wie und warum diese in C ++ zu tun, siehe Robert Martin 1996 Artikel zum Thema von der C ++ Bericht .

  2. Anstatt falsche Rückkehr oder leise einige Eigenschaft festlegen, eine Ausnahme ausgelöst. Das ist, was sie sind da.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top