- 1
if Mode = True then
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+86.6
if Mode = True then
из исходников FastReport
if Mode then
If Mode = True then
<=>
If (Mode = True) = True Then
<=>
If ((Mode = True) = True) = True Then
И вопршает: когда останавливаться? не проще ли:
If Mode Then
<=>
If ((Mode = True) = True) = True Then
Вот это явный бред.
Никто же не пишет так:
a = 1 = 1 = 1 = 1;
Кому как больше нравится. Лично мне иногда удобнее писать if mode = true. Хотя да, if mode then короче. Ну от вкуса зависит. В любом случае не говнокод, а стиль программирования.
Вот вам на закуску еще кусок:
if a = b then
SomeBoolean := true
else
SomeBoolean := false;
Такой код вас тоже наверное не смущает?
if variable ...tralala....
Как в примере гораздо нагляднее и читабельнее.
А по поводу примеров типа
(if a= True) = True и так далее- чушь, таким образом тогда можно еще много каких конструкций в говнокодом назвать.
вот так например: "Мол, чего вы, ребята, пишете
if (() && ())
ведь можно и так:
if(() && () && 1 && 1...)
"
это не минус проверки в данном случае, это минус именования объекта
здесь Mode ничего не говорит о том, что по сути он является флажком
вообще-то, куда лучше было бы назвать эту переменную IsMode - тогда было бы всё пучком без лишнего явного указания о том, что именно здесь происходит, и что с чем сравнивается
p.s. кстати, IsMode - также не совсем удачно подобранное имя. лучше что-то типа IsSpecialMode, где "Special" меняется в зависимости от контекста
http://govnokod.ru/2304#comment11850
http://govnokod.ru/2304#comment11891
procedure TfrxEngineOptions.SetSilentMode(Mode: Boolean);
begin
if Mode = True then
FSilentMode := simSilent
else
FSilentMode := simMessageBoxes;
end;
Где здесь плохо читаемый код? Чем плохо название параметра?
имеется в виду только не совсем подходящее имя
Надо в стиле IsSilentMode
Тогда удобно будет if IsSilentMode then ...
Красота. :)
p.s. хотя впринципе можно
эхх, а ведь раньше было время(http://govnokod.ru/best?time=ever) ;)
Вобщем минусую. Хотя дельфе сам по себе гуан и напихает мусора кучу.
Булеву арифметику я не знал. И мне было по началу очень непривычно видеть короткую запись. Так что такая запись имеет право быть если это ваш стиль, но если программа другие разработчики будут работать с вашими исходниками (а с FastReport именно так) то тут уже свои стили другим навязывать нельзя а использовать стандартный Борландовский.
Так что уже говнокод.
Например в строчке
Mode может быть функцией возвращающей булево значение. Тогда желательно писать Mode() чтобы было видно что это вызов функции.
Что будет результатом выражения if Mode = True then если:
Может вообще исключение получим? Потому что в этом месте вроде как значение должно быть приведено к типу, что не всегда можно. Или как?
Если мне не изменяет память то когда то при работе с базой я именно специально так и писал сравнивая сами значения. Хотя это давненько было могу брехать.
По тексту метода аргумент Mode обычного булевого типа, так что говнокод.
Смотрим на код всего метода:
Как видно этот метод просто изменяет внутреннее поле и ничего не возвращает, значит этот метод сеттер свойства объекта (property) которое выглядеть должно примерно так:
property SilentMode: Boolean read GetSilentMode write SetSilentMode;
Смотрим в другом контексте - контексте вызовов из других мест.
SetSilentMode(true)
SetSilentMode(false)
Если обернуто, то
SilentMode := true
По-моему все понятно... А в таком маленьком кусочке кода неприятных ощущений не вызывает.
То есть намерено разработчиком было выбрано такое имя аргумента свойства и без приставки Is, так что говнокод дважды.
Теперь хочу попросить взглянуть ещё раз на код метода. Если я правильно понял то это просто сеттер для внутреннего поля FSilentMode.
Но тип свойства и внутреннего поля отличаются! Хотя по идее это одно и тоже!
Не ну конечно возможно что внутреннее поле FSilentMode перечисляемого типа. Ну например типа такого:
Но тогда бы понту не было бы от этого отдельного сеттера потому что проще использовать Exclude и Include. В этом методе значения присваиваются стирая любые другие комбинации, значит FSilentMode не перечисляемого типа.
Значит поле имеет целый тип а свойство булевый.
Из за этого прийдётся ещё и писать гетер GetSilentMode, вместо того чтобы прямо написать read FSilentMode.
Короче как ни крути сетер и гетер не нужны, так что опять говнокод.
a = b ? 1 : 0;
если b будет истинно то переменной a будет присвоена единица, иначе ноль.
IfThen перегружена для строк (в модуле StrUtils) и для целых и вещественных (в модуле Math)
Используется это чудо примерно так:
Одна строчка к тому же более осмысленная!
Обычный тип Char не поддерживается, поэтому каждый раз одиночные символы преобразоваться в строку которая занимает памяти больше: спереди записывается длина строки а в конце добавляется Null символ. К тому же строка уже не значение а указатель на значение. Выделение памяти очень дорогая операция. В критических по производительности местах (в циклах) такая хрень станет тормозом, если не будет исправлена оптимизатором.
Перечисления использовать нельзя, хотя и можно изъебнутся и привести перечисление к целому но это низкоуровневая операция и вроде как не есть гуд для Дельфи. Вот на Си такое пожалуйста, сколько угодно.
Кроме перечислений есть ещё set'ы которые даже к целому не приравняешь потому что внутри дельфи их оптимизирует и хранит одним байтом (опять таки могу ошибаться!).
Видало 32 байта (256 бит по биту на каждый элемент множества)
влазит в 1 байт.
Вполне нетривиальный пример:
Допустим NumberAsString пустая, тогда вычисляется это так:
Вывод. Однозначно говнокод. Возможно я в чём то ошибаюсь потому что на дельфи писал уже давненько, да к тому же на 7мом, да к тому же не писал и разбирался как работает полностью говнокодовая программа. Там такой говнокодище что все примеры на этот ресурсе сосут. Хотя может это и преувеличении но не сильное.
Если что поправьте меня пожалуйста.
a > b = true
рожают только ступиденты "для большей ясности"