Магический номер - это жестко закодированное значение, которое может измениться на более позднем этапе, но поэтому его трудно обновить.
Например, предположим, что у вас есть страница, отображающая последние 50 Заказы на странице «Ваши заказы». 50 - это Волшебный номер здесь, потому что он не установлен стандартным или условным, это число, которое вы определили по причинам, изложенным в спецификации.
Теперь, что вы делаете, у вас есть 50 в разных местах - ваш SQL-скрипт (SELECT TOP 50 * FROM orders
), ваш сайт (ваши последние 50 заказов), ваш логин вашего заказа (for (i = 0; i < 50; i++)
) и, возможно, много других мест.
Теперь, что происходит, когда кто-то решает изменить 50 до 25? или 75? или 153? Теперь вам нужно заменить 50 во всех местах, и вы, скорее всего, пропустите это. Найти / заменить может не работать, потому что 50 можно использовать для других вещей, и слепо заменить 50 на 25 может иметь некоторые другие плохие побочные эффекты (т. Е. Ваш Session.Timeout = 50
вызов, который также установлен на 25, и пользователи начинают сообщать слишком частые таймауты ).
Кроме того, код может быть трудно понять, то есть «if a < 50 then bla
» - если вы столкнулись с этим в середине сложной функции, другие разработчики, которые не знакомы с кодом, могут спросить себя «WTF - 50 ???»
Вот почему лучше всего иметь такие двусмысленные и произвольные числа в одном месте - «const int NumOrdersToDisplay = 50
», потому что это делает код более читаемым («if a < NumOrdersToDisplay
» , это также означает, что вам нужно только изменить его в 1 четко определенном месте.
Места, где подходят магические числа, - это все, что определено стандартом, то есть SmtpClient.DefaultPort = 25
или TCPPacketSize = whatever
(не уверен, что это стандартизировано). Кроме того, все, что определено только в 1 функции, может быть приемлемым, но это зависит от контекста.
Не создавайте случайные строки с гласными, и тогда вам не нужно беспокоиться о ругательствах.
Я использую случайно сгенерированные фонетически звучащие пароли для одного веб-приложения, которое я написал. В итоге я жестко запрограммировал список «грязных» слов, которые неприемлемы, но список, соответствующий моему шаблону, оказался довольно коротким.
Очень забавный рассказ о горе для чтения с похожей ситуацией с вами.
Microsoft исключает из своих ключей продуктов следующее:
0 1 2 5 A E I O U L N S Z
Я опускаю их в [0-9A-Z], и как только ключ сгенерирован, я сопоставляю с список, который я нашел из двухбуквенных комбинаций, наиболее распространенных на английском языке, и регенерируйте ключ, если есть совпадение. Для скорости я редактирую список буквенных пар, сначала выбрав из этого списка пары, которые уже запрещены из-за их включения символа в удаленный список («HE» не может существовать, если ключ генерируется из набора символов). который не включает «E»), затем преобразует некоторые из «E» в «3», как в «H3» вместо «HE» и т. д. Я также добавил несколько своих собственных, таких как «KK» и « CK 'для крайних случаев. При необходимости можно также опустить '3' для скорости, хотя чем больше символов вы пропустите, тем меньше уникальных ключей может быть сгенерировано.
Возможно, это не идеальное решение, но оно достаточно быстрое для моих нужд и предотвращает создание почти всех английских слов, оскорбительных или нет.
Нет. У вас нет возможности собрать все ругательства на всех языках мира. Эти слова обычно не встречаются в словарях.
Конечно, это возможно, но я бы не стал уделять этому много времени, особенно если у вас есть буквы и цифры.
Ограничьте свои случайно сгенерированные "слова" шестнадцатеричными символами, и я не верю, что у вас будут какие-либо англоязычные проклятия. Это также подталкивает вас к тому, чтобы не тратить слишком много времени на генератор случайных слов.
Конечно, может быть какой-то язык, где вы можете ругать шестнадцатеричными цифрами, но тогда вы вряд ли узнаете / отфильтруете их все равно проклинает.
Для меня это имеет смысл. Я имею в виду, что это будет довольно плохая пиар-катастрофа, если кто-то разместит фотографию вашего продукта с печатью на обратной стороне коробки компакт-диска:
12345-67890-F ** KU-ABCDE-FGHIJ
It звучит забавно, но никогда не знаешь, какое чувство юмора будет у человека, который случайно заберет этот пакет.
Самое простое решение - создать из «очищенного» алфавита; используйте набор символов, которые не могут образовывать слова. Одно из предложений в одном из ответов - шестнадцатеричный, который является отличным выбором, или как-то иначе отбросьте несколько важных букв из алфавита.
Обратите внимание, что простое удаление гласных не поможет ... это слишком легко сделать вывод их из остальных согласных.
Да, на том основании, что любой, кто будет оскорблен чем-то, они увиденное в случайно сгенерированной строке может придумать больше вещей, которые они сочтут оскорбительными, чем вы можете очистить.
Не оптимизируйте для безумцев.
Думаю, лучше вообще избегать гласных. Ключ продукта, такой как JKL-YOUAREMYFRIEND-0001-KK, не может быть оскорбительным, но это также не похоже на серьезный бизнес.
Если вас беспокоят ключи продукта, я бы предпочел использовать шестнадцатеричные цифры, возможно, вам подойдет даже руководство. Вероятно, нет шансов, что с этими ограничениями будет создано «непослушное» слово. Вы также можете просто придерживаться цифр. Если у вас должны быть случайные строки со всеми буквами алфавита, это, вероятно, лучше безопаснее, чем сожалеть, поэтому я бы выполнил фильтрацию.