1

In meiner Django App habe ich ein Modell (nennen wir es Foo) mit einem Feld namens "type". Ich möchte Foo.type verwenden, um anzugeben, welcher Typ die spezifische Instanz von Foo ist (mögliche Auswahlmöglichkeiten sind "Nummer", "Datum", "Einzelne Textzeile", "Mehrere Textzeilen" und einige andere). .Wie wird das Strategie-Muster in einem MVC-Web-Framework ordnungsgemäß implementiert?

Es gibt zwei Dinge, die ich möchte, dass das Feld "Typ" am Ende wirkt; Wie ein Wert von seinem normalen Typ in Text konvertiert wird (z. B. in "Datum" str(the_date.isoformat())) und wie ein Wert vom Text in den angegebenen Typ konvertiert wird (unter "Datum" kann es datetime.date.fromtimestamp(the_text) sein).

Für mich scheint dies das Strategie-Muster (ich kann völlig falsch sein, und fühlen Sie sich frei, mich zu korrigieren, wenn ich bin). Meine Frage ist, was ist der richtige Weg, dies in einem MVC-Framework zu programmieren?

In einer clientseitigen App würde ich eine Type-Klasse mit den abstrakten Methoden "serialize()" und "unserialize()" erstellen, diese Methoden in Unterklassen von Type (wie NumberType und DateType) und dynamisch überschreiben Setzen Sie das Feld "type" eines neu instanziierten Foo zur Laufzeit auf die entsprechende Type-Unterklasse.

In einem Web-Framework ist es nicht ganz so einfach für mich. Im Augenblick ist es am sinnvollsten, Foo.type als Small Integer-Feld zu definieren und eine begrenzte Anzahl von Auswahlmöglichkeiten zu definieren (0 = "Number", 1 = "Date", 2 = "Single Line of Text", usw.) im Code. Wenn dann ein Foo-Objekt instanziiert wird, verwenden Sie eine Factory-Methode, um den Wert des Felds "type" der Instanz zu prüfen und die korrekte Type-Subklasse (wie im obigen Absatz beschrieben) zu verwenden. Foo würde auch serialize() - und unserialize() -Methoden haben, die direkt an die typisierte Subclass-Klasse delegieren würden.

Wie klingt dieses Design? Ich bin noch nie auf dieses Problem gestoßen, also würde ich gerne wissen, ob andere Leute es haben und wie sie es gelöst haben.

Antwort

0

Sie könnten durch Erbschaft Sachen, die der Django ORM bietet. Dies wird Ihnen Möglichkeiten geben, um tatsächlich eine Unterklasse, was auch immer das Modell w/Diskriminatoren ist, verschiedene Tabellen usw.

Foo # base 
DateFoo(Foo) 
OtherFoo(Foo) 

etc ...

+0

Ich bin nicht 100% gegen diese Lösung, aber ich bin vorsichtig Subclassing Foo für jeden neuen Typ ich will. Ich habe keinen starken Grund, warum es sich in dieser Situation einfach nicht richtig anfühlt. Ich werde es mir aber merken. Vielen Dank für die Antwort. – jakeboxer

Verwandte Themen