Как правильно реализовать шаблон «Стратегия» в веб-среде MVC? - PullRequest
1 голос
/ 27 апреля 2009

В моем приложении Django у меня есть модель (назовем ее Foo) с полем с именем «type». Я хотел бы использовать Foo.type, чтобы указать, к какому типу относится конкретный экземпляр Foo (возможны следующие варианты: «Число», «Дата», «Одна строка текста», «Несколько строк текста» и несколько других). .

Есть две вещи, которые я бы хотел, чтобы поле «type» оказало влияние; способ, которым значение преобразуется из его обычного типа в текст (например, в «Дата», это может быть str(the_date.isoformat())), и способ, которым значение преобразуется из текста в указанный тип (в «Дата», это может быть datetime.date.fromtimestamp(the_text)).

Для меня это похоже на шаблон Стратегии (я могу быть совершенно неправ, и не стесняйтесь поправлять меня, если я так). У меня вопрос, как правильно кодировать это в веб-MVC Framework?

В клиентском приложении я бы создал класс Type с абстрактными методами "serialize ()" и "unserialize ()", переопределил эти методы в подклассах Type (таких как NumberType и DateType) и динамически установил поле «type» вновь созданного Foo для соответствующего подкласса Type во время выполнения.

В веб-среде это не так просто для меня. Прямо сейчас, способ, который имеет больше всего смысла, состоит в том, чтобы определить Foo.type как поле Small Integer и определить ограниченный набор вариантов (0 = "Число", 1 = "Дата", 2 = "Одна строка текста", и т. д.) в коде. Затем, когда создается экземпляр объекта Foo, используйте метод Factory, чтобы посмотреть значение поля «type» экземпляра и подключите правильный подкласс Type (как описано в параграфе выше). Foo также будет иметь методы serialize () и unserialize (), которые будут делегироваться напрямую подключаемому подклассу Type.

Как звучит этот дизайн? Я никогда не сталкивался с этой проблемой раньше, поэтому мне бы очень хотелось узнать, есть ли другие люди, и как они решили ее.

1 Ответ

0 голосов
/ 27 апреля 2009

Вы можете просматривать информацию о наследовании, которую предоставляет django ORM . Это даст вам возможность на самом деле создавать подклассы независимо от модели с дискриминаторами, различными таблицами и т. Д.

Foo # base
DateFoo(Foo)
OtherFoo(Foo)

и т.д ...

...