2010-11-25 31 views
0

Ich habe ein paar OO-Konzepte, wie Design-Muster, sauberen Code und einige andere Sachen studiert, und ich habe immer noch einige Zweifel darüber, wie Sie vorgehen. Schauen wir uns beispielsweise mein Beispiel an.Brauchen Sie Hilfe mit Klassen Modellierung

Ich habe eine Person-Klasse, die ein Modell ist. Ich möchte einer Person einige Validierungen hinzufügen, z. B. prüfen, ob das Alter mit dem Geburtsdatum übereinstimmt, und prüfen, ob der Name gültige Zeichen enthält.

Ich habe zwei Ansätze, aber ich weiß nicht, welchen ich verwenden sollte.

Ansatz ein: ich eine neue Klasse namens:

class ValidatePerson {} 

und die Klasse die Methoden haben: „validateAge()“ und „validateName()“ und jedes vallidation, die ich brauche ich haben eine neue Methode implementieren.

Ansatz zwei: ich eine abstrakte Klasse genannt: ValidatePerson {}, dass einige commum Methoden für alle Validierung haben und die ich hätte:

class ValidatePersonAge extends ValidatePerson { validate();} 
class ValidatePersonName extends ValidatePerson {validate();} 

ich Ansatz zwei wählen möchten, Ursache Jede neue Validierungsregel, die ich hinzufügen muss, ist eine neue Klasse und beeinflusst die anderen nicht. Wenn ich zum Beispiel etwas in der Kommunikationsmethode ändern muss, die die neue Regel benötigt, könnte ich sie einfach überschreiben. Beim ersten Ansatz müsste ich eine andere Methode hinzufügen und dann eine andere Methode erstellen oder die ändern, die bereits für die anderen funktioniert, die dann zum Absturz bringen könnte.

Die Sache ist, dass ich irgendwie verwirrt bin, da ich neu im Programmieren bin und ich möchte etwas Hilfe und Erklärung darüber sehen. Ich habe auch gelesen, dass Klassen für Änderungen geschlossen werden sollten, aber offen für die Erweiterung (oder so ähnlich).

+0

Es ist nicht klar, was Sie hier fragen. Was _exactly_ suchen Sie mit Hilfe? – Oded

Antwort

1

Es gibt keine spezifische richtige Antwort. Das Design sollte immer im Zusammenhang mit Ihrer Problemdomäne und Ihrem Geschäftskontext stehen. So sind hier verschiedene Optionen

Option 1 Person-Klasse hat eine vailidate() -Methode, die Sie anrufen können alle ausführen er auf seinem aktuellen Zustand Validierungen.

Pros

  • bessere Kapselung
  • Änderungen 1 Einzel Klasse lokalisiert sind
  • Validierung nach der Einstellung alle Eigenschaften
durchgeführt wird

Cons

  • Person sein könnte im ungültigen Zustand b efore die validate() -Methode aufgerufen wird daher nicht scheitert schnell
  • nicht unterschiedliche Validierungsregeln für verschiedenen Kontext

Option 2 Jede Eigenschaft seinen eigenen validateXXX() -Methode in der Klasse Person haben kann, hat. Jede setXXX() - Methode ruft die entsprechende validateXXX() -Methode auf.

Pros

  • bessere Kapselung
  • Änderungen 1 Einzel Klasse lokalisiert sind
  • ausfallen schnell Verhalten dh Person Objekt wird niemals einen ungültigen Zustand

Cons

sein
  • könnte Overkill-Basis sein d auf den Kontext
  • Kann nicht anders Validierungsregeln haben für verschiedene Kontext

Option 3 Sie könnten eine PersonBuilder haben, das diese Validierungsprüfungen enthält. Der Builder führt diese Validierungen durch, bevor das Person-Objekt erstellt wird. Sobald das Objekt Person erstellt ist, erfüllt es alle Validierungen und Invarianten.

Pros

  • Sie die Validierungen Builder Klasse externalisiert haben daher können Sie verschiedene Validierungsregeln haben für unterschiedliche Kontexte
  • Construnction Logik aus dem Domain-Objekt
  • Klasse Person gemacht werden kann unveränderlich getrennt einmal konstruiert

Cons

  • Könnte eine Overkill in einigen Szenarien

Ihre Option 2 ist nicht korrekt, weil ValidatePersonAge nicht dasselbe wie ValidatePerson IS. Sie validieren die Person nicht vollständig, sondern validieren nur ihr Alter. Sie sind also semantisch verschieden.