В этом коммите я видел следующий код для драйвера Java-подключения MongoDB , и на первый взгляд он кажется какой-то шуткой. Что делает следующий код?
if (!((_ok) ? true : (Math.random() > 0.1))) {
return res;
}
(РЕДАКТИРОВАТЬ: код был обновлен с момента публикации этого вопроса)
java
mongodb
obfuscation
Monstieur
источник
источник
if (!ok || Math.random() < 0.1)
(или что-то подобное).Ответы:
Изучив историю этой линии, я пришел к выводу, что на работе было какое-то некомпетентное программирование.
Эта линия совершенно запутана. Общая форма
для
boolean a, b
эквивалентно простомуОкружающее отрицание и чрезмерные скобки еще больше усложняют ситуацию. Принимая во внимание законы Де Моргана, это тривиальное наблюдение, что этот кусок кода составляет
Коммит, который изначально ввел эту логику, имел
- еще один пример некомпетентного кодирования, но обратите внимание на обратную логику : здесь событие регистрируется, если либо
_ok
в одном, либо в 10% других случаев, тогда как код в 2. возвращает 10% случаев и регистрирует 90% случаев. Так что последующий коммит разрушил не только ясность, но и саму корректность.Я думаю, что в коде, который вы опубликовали, мы действительно можем увидеть, как автор намеревался
if-then
каким-то образом буквально преобразовать оригинал в отрицание, необходимое для раннегоreturn
состояния. Но затем он испортил и вставил эффективный «двойной негатив», поменяв знак неравенства.Помимо проблем со стилем кодирования, стохастическое ведение журнала само по себе является довольно сомнительной практикой, тем более что запись в журнале не документирует свое собственное специфическое поведение. Очевидно, что намерение состоит в том, чтобы уменьшить количество повторений того же факта: сервер в данный момент не работает. Подходящим решением является регистрация только изменений состояния сервера, а не каждого его наблюдения, не говоря уже о случайном отборе 10% таких наблюдений. Да, это займет немного больше усилий, поэтому давайте посмотрим на некоторые.
Я могу только надеяться, что все это свидетельство некомпетентности, накопленное в результате проверки всего лишь трех строк кода , не говорит справедливо о проекте в целом, и что эта часть работы будет убрана как можно скорее.
источник
https://github.com/mongodb/mongo-java-driver/commit/d51b3648a8e1bf1a7b7886b7ceb343064c9e2225#commitcomment-3315694
11 часов назад от gareth-rees:
Предположительно, идея состоит в том, чтобы регистрировать только около 1/10 сбоев сервера (и, таким образом, избегать массового рассылки спама в журнале) без затрат на обслуживание счетчика или таймера. (Но, конечно, поддержание таймера будет доступным?)
источник
Добавьте члена класса, инициализированный к отрицательному 1:
В блоке try выполните тест:
Это всегда регистрирует первую ошибку, затем каждую десятую последующую ошибку. Логические операторы "замыкают накоротко", поэтому логит увеличивается только на фактическую ошибку.
Если вы хотите, чтобы первая и десятая из всех ошибок, независимо от соединения, делали класс logit статическим, а не членом.
Как было отмечено, это должно быть поточно-ориентированным:
В блоке try выполните тест:
Примечание: я не думаю, что выбрасывать 90% ошибок - это хорошая идея.
источник
Я видел подобные вещи раньше.
Был фрагмент кода, который мог ответить на определенные «вопросы», которые пришли из другого фрагмента кода «черного ящика». В случае, если он не сможет ответить на них, он перенаправит их на другой фрагмент кода «черного ящика», который будет действительно медленным.
Так что иногда появлялись ранее невидимые новые «вопросы», и они появлялись в пакете, как 100 из них подряд.
Программист был доволен работой программы, но он хотел каким-то образом улучшить программное обеспечение в будущем, если будут обнаружены новые вопросы.
Таким образом, решение состояло в том, чтобы регистрировать неизвестные вопросы, но, как оказалось, было тысячи разных. Журналы стали слишком большими, и их ускорение не принесло пользы, поскольку у них не было очевидных ответов. Но время от времени появлялась куча вопросов, на которые можно было бы ответить.
Поскольку журналы становились слишком большими, а журналирование мешало регистрировать реальные важные вещи, которые он получил в этом решении:
Регистрируйте только случайные 5%, это очистит журналы, в то время как в долгосрочной перспективе все еще показывается, какие вопросы / ответы могут быть добавлены.
Таким образом, если произойдет неизвестное событие, в случайном количестве этих случаев оно будет зарегистрировано.
Я думаю, что это похоже на то, что вы видите здесь.
Мне не понравился этот способ работы, поэтому я удалил этот кусок кода и просто записал эти сообщения в другой файл , чтобы они все присутствовали, но не загромождал общий файл журнала.
источник