Давайте предположим, что вы создаете класс, который фактически выполняет тяжелую работу по выяснению того, что должен делать VoteType (чтобы он мог проверять такие вещи, как is_another_vote_available) и т. Д. Таким образом, вы могли бы иметь:
- VoteTypeIpSingleVote: это позволяет один голос за IP-адрес
- VoteTypeAnonymous: для этого голосования нет ограничений.
В БД у вас будут записи в таблице VoteType:
- 1 однопользовательское голосование
- 2 Аноним
Затем вы могли бы создать интерфейс, который реализуют все VoterTypes (VoteTypeAnonymous и т. Д.), Который имеет свойство "VoteType", которое возвращает либо
а) первичный ключ строки, с которой они связаны
б) перечислимый тип, хэш которого является первичным ключом
c) первичный ключ, который можно найти, выполнив поиск в таблице настроек (это имеет то преимущество, что соединение между базой данных и кодом доступно каждому)
Преимущество этого подхода состоит в том, что у вас может быть класс менеджера, с которым каждый из типов VoterTypes регистрируется (или может даже автоматически регистрироваться с использованием отражения).
Чтобы вы могли позвонить:
id = fetchVoteTypeToBeUsedFromDb
manager.getVoteType (id) .is_available (datetime.now ())
И таким образом можно легко добавить новые типы голосования, просто зарегистрировавшись и не требуя постоянного обновления оператора switch.