Frage

Ich betrachte das Problem der Validierung von reellen Zahlen von verschiedenen Formaten, da dies zu einem Problem sehr ähnlich ist, ich in Design bin vor.

Reelle Zahlen können in verschiedenen Kombinationen von Formaten kommen, zum Beispiel: 1. mit / ohne Vorzeichen an der Front 2. mit / ohne Dezimalpunkt (wenn kein Komma, dann vielleicht die Anzahl der Dezimalstellen vereinbart werden kann, im Voraus) 3. Basis 10 oder Basis 16

Wir müssen für jede Kombination ermöglichen, so gibt es 2x2x2 = 8 Kombinationen. Sie können sehen, dass die Komplexität auferlegt exponentiell mit jedem neuen Zustand erhöht.

In OO-Design, würden Sie normalerweise eine Klasse für jedes Zahlenformat zuweisen (zum Beispiel in diesem Fall haben wir 8 Klassen), und jede Klasse würde eine separate Validierungsfunktion hat. Doch mit jedem neuen Zustand haben Sie die Anzahl der Klassen erforderlich verdoppeln, und es wird bald ein Alptraum.

In der prozeduralen Programmierung verwenden Sie 3-Flags (das heißt has_sign, has_decimal_point und number_base) die Eigenschaft der reellen Zahl zu identifizieren, die Sie validieren. Sie haben eine einzige Funktion für die Validierung. Dort würden Sie die Flags verwenden, um sein Verhalten zu steuern.


// This is part of the validation function

if (has_sign) check_sign();

for (int i = 0; i < len; i++) { if (has_decimal_point) // Check if number[i] is '.' and do something if it is. If not, continue

if (number_base = BASE10)
    // number[i] must be between 0-9
else if (number_base = BASE16)
    // number[i] must be between 0-9, A-F

}

Auch hier wird die Komplexität bald aus der Hand wie die Funktion mit if-Anweisungen und Flaggen unübersichtlich wird.

Ich bin sicher, dass Sie über Design Probleme dieser Art gekommen sind vor - eine Reihe von unabhängigen Unterschieden, die in unterschiedlichen Verhalten führen. Ich wäre sehr daran interessiert zu erfahren, wie Sie in der Lage gewesen, ohne dass der Code vollständig wartbaren eine Lösung zu implementieren.

wäre so etwas wie die Brücke Muster geholfen haben?

War es hilfreich?

Lösung

  

In OO-Design, würden Sie normalerweise   eine Klasse für jede Nummer zuzuteilen   Format (zum Beispiel in diesem Fall haben wir 8   Klassen), und jede Klasse würde ein   separate Validierungsfunktion.

Nein nein nein nein nein. Allenfalls würden Sie einen Typ haben für die Darstellung von Zahlen eingeben (falls String nicht machen); eine weitere für Reelle Zahl (in den meisten Sprachen würden Sie einen eingebauten Typ wählen, aber trotzdem); und ein Parser Klasse, die das Wissen verfügt über eine numerische Eingabe zu nehmen und es in eine reelle Zahl zu verwandeln.

Um allgemeinere, ein Unterschied von Verhalten an und für sich nicht automatisch zu einer Klasse zuordnen. Es kann nur eine Eigenschaft, die in einer Klasse sein. Am wichtigsten ist, sollten Verhaltensweisen orthogonal behandelt werden.

Wenn (die Vorstellung, dass Sie Ihren eigenen Parser schreiben) Sie ein Zeichen haben können oder nicht, ein Komma oder nicht, und Hex oder nicht, Sie haben drei unabhängige Quellen der Komplexität , und es wäre ok drei Teile des Codes zu finden, irgendwo, dass man diese Probleme behandeln jeweils; aber es wäre nicht in Ordnung zu finden, überall, 2 ^ 3 = 8 verschiedene Teile des Codes, die die verschiedenen Kombinationen in einer expliziten Weise zu behandeln.

Stellen Sie sich vor, dass eine neue Wahl hinzufügen: plötzlich, Sie erinnern sich, dass die Zahlen könnten ein „e“ (wie 2.34e10) haben und wollen, dass unterstützen können. Mit der orthogonalen Strategie, müssen Sie eine weitere unabhängige Quelle der Komplexität , der vierte. Mit Ihrer Strategie würden die 8 Fälle plötzlich 16 geworden! Ganz klar ein no-no.

Andere Tipps

Ich weiß nicht, warum denken Sie, dass die OO-Lösung eine Klasse für jede Zahl Muster beinhalten würde. Meine OO Lösung wäre, einen regulären Ausdruck Klasse zu verwenden. Und wenn ich prozeduralen zu sein, ich würde wahrscheinlich die Standard-Bibliothek strtod () Funktion verwenden.

Sie sind für einen Parser zu fragen, verwenden Sie eine:

Auch: http://en.wikipedia.org/wiki/Parser_generator

Nun, wie gehe ich mit Komplexität für diese Art von Problemen? Nun, wenn ich kann, ich umformulieren.

In Ihrem Fall einen Parser-Generator (oder regulären Ausdruck) ist eine DSL (Domain Specific Language) verwendet wird, das ist eine Sprache besser geeignet, um das Problem mit Ihnen zu tun hat.

Designmuster und OOP sind nützlich, aber auf jeden Fall nicht die beste Lösung für jeden und jedes Problem.

Sorry, aber da ich vb verwenden, was ich tun, ist eine Basisfunktion i kombinieren dann eine Auswertungsfunktion so schlecht gefälschter Code es aus der Art, wie ich es getan habe

function getrealnumber(number as int){ return  getrealnumber(number.tostring) }
function getrealnumber(number as float){ return  getrealnumber(number.tostring) }
function getrealnumber(number as double){ return  getrealnumber(number.tostring) }
function getrealnumber(number as string){
if ishex(){ return evaluation()}
   if issigned(){ return evaluation()}
   if isdecimal(){ return evaluation()}
 }

und so weiter bis zu Ihnen, um herauszufinden, wie binären und Oktal tun

Sie töten nicht eine Fliege mit einem Hammer.

Ich fühle mich wirklich wie mit einer objektorientierten Lösung für Ihr Problem ein extremes Overkill ist. Nur weil Sie objektorientierte Lösung entwerfen können, bedeutet nicht, dass Sie so ein für jedes Problem Sie haben zu zwingen, haben.

Aus meiner Erfahrung fast jedes Mal gibt es eine Schwierigkeit bei der Suche nach einer OOD Lösung für ein Problem, bedeutet es wahrscheinlich, dass OOD nicht sachgemäßer ist. OOD ist nur ein Werkzeug, es ist nicht Gott selbst. Es sollte in großem Maßstab Probleme zu lösen, und nicht die Probleme, wie man Ihnen präsentiert werden.

So geben Sie eine tatsächliche Antwort (wie jemand oben erwähnt). Verwenden regulären Ausdruck, darüber hinaus Jede Lösung ist einfach zuviel des Guten

Wenn Sie eine OOD Lösung beharren mit .... Nun, da alle Formate, die Sie orthogonal vorgestellt zueinander sind, nicht, daß ich keine Notwendigkeit sehen, eine Klasse für jede mögliche Kombination zu schaffen. Ich würde eine Klasse für jedes Format erstellen und übergebe meine Eingabe durch jeden, in diesem Fall die Komplexität linear wachsen wird.

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