Монополия - это дьявол, а синглтоны с нечитаемым / изменяемым состоянием - это «настоящая» проблема ...
После прочтения синглетоны являются патологическими лжецами , как предложено в ответе Джейсона . Я наткнулся на этот небольшой кусочек, который дает лучший из представленных примеров , как синглтоны часто неправильно используются. .
Глобально это плохо, потому что:
- а. Это вызывает конфликт пространства имен
- b. Это разоблачает состояние необоснованным образом
Когда дело доходит до синглетонов
- a. Явный ОО способ их вызова предотвращает конфликты, поэтому укажите а. не является проблемой
- b. Синглтоны без состояния (как фабрики) не являются проблемой. Синглтоны с состоянием могут снова попасть в две категории, которые являются неизменяемыми или пишутся один раз и читают много (файлы конфигурации / свойств). Это не плохо. Вы можете говорить об изменчивых синглетонах, которые являются своего рода держателями ссылок.
В последнем утверждении он ссылается на концепцию блога «одиночки - лжецы».
Как это относится к монополии?
Чтобы начать игру в монополию, сначала:
Теперь для тех, кто не действительно играл в монополию, эти стандарты в лучшем случае идеальны. Трудно проглотить поражение в монополии, потому что монополия - это деньги, если вы проигрываете, вы должны тщательно следить за тем, как остальные игроки заканчивают игру, а потери обычно бывают быстрыми и сокрушительными. Таким образом, правила обычно изменяются в какой-то момент, чтобы служить личным интересам некоторых игроков за счет других.
1120 Итак, вы играете в монополию с друзьями Бобом, Джо и Эдом. Вы быстро строите свою империю и занимаете долю рынка по экспоненте. Ваши противники слабеют, и вы начинаете чувствовать запах крови (в переносном смысле). Ваш приятель Боб вложил все свои деньги в блокировку как можно большего количества недорогих объектов, но он не получает высокую отдачу от инвестиций, как он ожидал. Боб, как удар неудачи, приземляется на тротуаре и исключается из игры.
Теперь игра переходит от дружелюбной игры в кости к серьезному бизнесу. Боб стал примером неудачи, а Джо и Эд не хотят в конечном итоге стать «тем парнем». Итак, будучи ведущим игроком, вы внезапно становитесь врагом. Джо и Эд начинают практиковать сделки «за столом», денежные вливания за спиной, недооцененный обмен домами и вообще все, что может ослабить вас как игрока, пока один из них не поднимется на вершину.
Затем, вместо того, чтобы выиграть один из них, процесс начинается заново. Внезапно, конечный набор правил становится движущейся целью, и игра вырождается в тип социальных взаимодействий, которые составляли бы основу каждого высококлассного реалити-шоу со времен Survivor. Почему, потому что правила меняются, и нет единого мнения о том, как / почему / что они должны представлять, и что более важно, нет ни одного человека, принимающего решения. Каждый игрок в игре, в этот момент, устанавливает свои собственные правила, и за этим следует хаос, пока два игрока не слишком устают, чтобы поддерживать шараду и медленно сдаваться.
Таким образом, если бы книга правил для игры точно представляла одиночку, монопольная книга правил была бы примером злоупотребления.
Как это относится к программированию?
Помимо всех очевидных проблем с безопасностью потоков и синхронизацией, которые возникают с изменяемыми синглетонами ... Если у вас есть один набор данные, которые могут быть прочитаны / обработаны несколькими различными источниками одновременно и существуют в течение всего времени выполнения приложения, Вероятно, сейчас самое время сделать шаг назад и спросить: «Использую ли я здесь правильный тип структуры данных».
Лично я видел, как программист злоупотребляет синглтоном, используя его в качестве своего рода скрученного хранилища базы данных в приложении. Работая непосредственно с кодом, я могу засвидетельствовать, что он был медленным (из-за всех блокировок потоков, необходимых для обеспечения его потоковой безопасности) и кошмаром для работы (из-за непредсказуемой / прерывистой природы ошибок синхронизации), и почти невозможно проверить в условиях «производства». Конечно, система могла бы быть разработана с использованием опроса / сигнализации, чтобы преодолеть некоторые проблемы с производительностью, но это не решило бы проблемы с тестированием и зачем беспокоиться, когда «настоящая» база данных уже может выполнять те же функции в гораздо более надежной среде. / масштабируемым образом.
Опция Singleton - это только , опция, если вам нужно то, что обеспечивает синглтон. Доступный только для чтения экземпляр объекта. Это же правило должно касаться и свойств / элементов объекта.
Я бы выбрал б), потому что он более точно отражает смысл данных. Наличие структуры данных, в которой некоторые части предполагается «игнорировать», проблематично. Что, если люди просто проводят простое сравнение дат, предполагая, что год всегда один и тот же, но кто-то использовал другой год-заполнитель, предполагая, что год в любом случае не имеет значения?
Всегда используйте структуры данных, которые отражают ваши намерения.
То, что в) плохо, я считаю, вне разумного обсуждения :-). И я не думаю о причинах производительности ...
Я бы выбрал число дня года (например, одно число от 0 до 365, а затем добавило бы его к 1 января конкретного года, который вас интересует.
Если вы не хотите выполнять дополнительные математические вычисления, описанные выше, используйте два поля: одно для месяца и одно для дня (но обязательно обновляйте оба, когда вам нужно!).
Помните, вы приходится иметь дело с високосными годами, поэтому использование поля даты - плохая идея, поскольку вам придется хранить даты с двумя годами - один високосный год, а другой нет - очень сложно!
Я бы использовал поле даты и, хотя он и не нужен, все равно сохранил бы год. Просто удалите его, когда вам нужно его распечатать / использовать. На это есть несколько причин:
Причины выбора b) также могут быть легко решены с помощью этих функций даты SQL . Вы можете легко выбрать события определенного месяца, например, в одном запросе.
Я бы выбрал b), потому что это значительно упростит запросы: вы сможете очень легко восстановить все события в диапазоне (декабрь, определенный день, диапазон дней). Если вы выберете а) - не забудьте установить конкретный год для сравнения и извлечения данных.
Я бы сохранил дату первого события, а затем интервал для каждого последующего события, как в большинстве приложений-календарей. В этом случае вы бы структурировали его так:
first_event | interval | interval_unit
-------------+--------------------------
2009-01-01 | 6 | 'month'
2009-02-01 | 1 | 'year'
К сожалению, MySQL не имеет типа данных INTERVAL
, поэтому потребуются два столбца и небольшая пост-обработка, но я думаю, что это наиболее гибкий подход к проблеме.
Выберите ОДНО поле типа int, например 1601, для 1 января.
Я бы тоже поддержал вариант b), но использовал TINYINT для месяца (от 0 до 255) и SMALLINT (от -32,768 до 32,767) для года, чтобы сэкономить немного места.