1. Pascal / Говнокод #2304

    +86.6

    1. 1
    if Mode = True then

    из исходников FastReport

    Запостил: StriderMan, 21 Декабря 2009

    Комментарии (66) RSS

    • и в чём здесь проблема?
      Ответить
      • какбэ нормальные люди пишут так:

        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 Then
              <=>
              If ((Mode = True) = True) = True Then

              Вот это явный бред.
              Никто же не пишет так:
              a = 1 = 1 = 1 = 1;

              Кому как больше нравится. Лично мне иногда удобнее писать if mode = true. Хотя да, if mode then короче. Ну от вкуса зависит. В любом случае не говнокод, а стиль программирования.
              Ответить
              • Так я и говорю, что это вопрос философский. И уж точно не говнокод. Поэтому минусанул.
                Ответить
              • ниразу это не стиль. Это низкая культура и некачественный код
                Ответить
              • a = 1 = 1 = 1 = 1 Это что? В паскале такое не скомпилится. Вы понимаете разницу между присваиванием и бинарной операцией сравнения?

                Вот вам на закуску еще кусок:
                if a = b then
                SomeBoolean := true
                else
                SomeBoolean := false;

                Такой код вас тоже наверное не смущает?
                Ответить
          • Я б такого говнокодера гнал поганой метлой из отдела. Это нельзя назвать стилем, это качество кода.
            Ответить
          • тогда вопрос, как лучше писать if Mode = true или if Mode = false ?
            Ответить
    • нифига не говнокод.
      Ответить
      • обоснуй
        Ответить
        • показать все, что скрытоспрячься
          Ответить
        • от обоснуя слышу!
          Ответить
        • Да что тут обосновывать то? +1 тому кто сказал что не говнокод. это нормальная запись на любом языке программирования. Я, например, оч редко пишу так:
          if variable ...tralala....
          Как в примере гораздо нагляднее и читабельнее.
          А по поводу примеров типа
          (if a= True) = True и так далее- чушь, таким образом тогда можно еще много каких конструкций в говнокодом назвать.
          вот так например: "Мол, чего вы, ребята, пишете
          if (() && ())
          ведь можно и так:
          if(() && () && 1 && 1...)
          "
          Ответить
    • Это стиль, а не говнокод
      Ответить
    • Подзабыл Delphi со временем. А не может тут Mode быть по типу - Integer? Или компилер ругнулся бы?
      Ответить
      • Ругнулся бы. true и integer не сравнимы в Delphi.
        Ответить
        • true и integer не могут быть не сравнимы, ибо одно - тип, а другое - значение.
          Ответить
    • вполне нормально
      это не минус проверки в данном случае, это минус именования объекта
      здесь Mode ничего не говорит о том, что по сути он является флажком
      вообще-то, куда лучше было бы назвать эту переменную IsMode - тогда было бы всё пучком без лишнего явного указания о том, что именно здесь происходит, и что с чем сравнивается

      p.s. кстати, IsMode - также не совсем удачно подобранное имя. лучше что-то типа IsSpecialMode, где "Special" меняется в зависимости от контекста
      Ответить
      • В данном контексте вместо Mode должно быть Value, т.к. это код из метода-аксессора SetMode.
        Ответить
    • показать все, что скрытоА давйте теперь вместо x=2-1 писать x = (2+0)*1 + (0-1) * (1+0)*1
      Ответить
    • А че минусуете? Неужели считаете это верным?
      Ответить
      • показать все, что скрытоНу дак минусуют дельфисты. Они же, в отличии от сишников - все пишут if Mode = True then.
        Ответить
        • Даже ассемблерщики так не пишут. ;)
          Ответить
        • Дельфисты минусуют, вот редиски... Не рубят правду матку...
          Ответить
        • Гвонокодо-постер сам делфист и за такое готов бить головой об батарею
          Ответить
      • я вот лично считаю это верным, хотя терпеть не могу работать с дельфи, поскольку:
        http://govnokod.ru/2304#comment11850
        http://govnokod.ru/2304#comment11891
        Ответить
        • т.е., я имею в виду, что говнокод (и то спорно, насколько он говнокод, а то прицепились как к самому простому) там не потому, что сравнили с true (я уже не считаю того, что вирт это предусмотрел умышленно; да и семантически это вполне верно), а потому что имя не правильное, совсем не такое, каким оно должно быть
          Ответить
    • Как минимум Mode - плохое название для переменной, так что говнокод. Плюсую.
      Ответить
      • Полный код метода:

        procedure TfrxEngineOptions.SetSilentMode(Mode: Boolean);
        begin
        if Mode = True then
        FSilentMode := simSilent
        else
        FSilentMode := simMessageBoxes;
        end;

        Где здесь плохо читаемый код? Чем плохо название параметра?
        Ответить
        • о плохочитаемом коде никто и не говорит
          имеется в виду только не совсем подходящее имя
          Ответить
        • Название плохо тем, что ни о чем не говорит.
          Надо в стиле IsSilentMode
          Тогда удобно будет if IsSilentMode then ...
          Ответить
        • FSilentMode=(IsSilentMode?simSilent:simM essageBoxes);
          Красота. :)
          Ответить
          • Это уже С++ попахивает, на Delphi так не сделаеш
            p.s. хотя впринципе можно
            Ответить
    • Если сейчас готовы в говнокод списать код типа этого, то что же будет дальше? Если все такие крутые, где ваш крутой код? пакажыти? :)

      эхх, а ведь раньше было время(http://govnokod.ru/best?time=ever) ;)
      Ответить
    • Это обычный код, дебилы
      Ответить
      • Это необычный код. Я бы даже сказал волшебный...
        Ответить
      • Сам чёрноротый гость, не уважающий окружающих!
        Ответить
    • говнокод, чего спорить-то? я за такое по рукам бью.
      Ответить
      • А я за такое их сразу отрубаю, что-бы впредь неповадно было.
        Ответить
    • это не говнокод. Максимум рекомендация но на говнокод никак не тянет
      Ответить
    • Чё спорите? Это обычный код студента.
      Ответить
    • Главное как скомпилет. Если переменная в регистре загружена будет, то нормально проверка как test Reg32,Reg32 или тоже через or, если в памяти, то зависит от контекста, тоесть если например регистр Edi содержит ноль, то проверка cmp dword ptr ds:[Mode],edi.
      Вобщем минусую. Хотя дельфе сам по себе гуан и напихает мусора кучу.
      Ответить
    • Я когда то тоже так писал, но мне было простительно я учил дельфи без книжек, инета и почти без посторонней помощи (хотя и очень профессиональной, от толкового программиста, который к тому же прекрасно и доступно объясняет, есть педагогический талант).
      Булеву арифметику я не знал. И мне было по началу очень непривычно видеть короткую запись. Так что такая запись имеет право быть если это ваш стиль, но если программа другие разработчики будут работать с вашими исходниками (а с FastReport именно так) то тут уже свои стили другим навязывать нельзя а использовать стандартный Борландовский.
      Так что уже говнокод.
      Ответить
    • Во вторых автору минус за то что написал только одну строчку, а не весь метод. Это вообще то много решает. Потому что тогда возникают много удивительных нюансов...
      Например в строчке
      if Mode = True then

      Mode может быть функцией возвращающей булево значение. Тогда желательно писать Mode() чтобы было видно что это вызов функции.
      Ответить
    • А ещё если бы Mode было вариантного типа то такая запись вполне имеет право быть.
      Что будет результатом выражения if Mode = True then если:
      Mode = undefined
      Mode = "abagagalamaga"
      Mode = Null
      Mode = -1

      Может вообще исключение получим? Потому что в этом месте вроде как значение должно быть приведено к типу, что не всегда можно. Или как?
      Если мне не изменяет память то когда то при работе с базой я именно специально так и писал сравнивая сами значения. Хотя это давненько было могу брехать.
      По тексту метода аргумент Mode обычного булевого типа, так что говнокод.
      Ответить
    • Название переменной действительно неудачно.
      Смотрим на код всего метода:
      procedure TfrxEngineOptions.SetSilentMode(Mode: Boolean);
      begin
        if Mode = True then
          FSilentMode := simSilent
        else
          FSilentMode := simMessageBoxes;
      end;

      Как видно этот метод просто изменяет внутреннее поле и ничего не возвращает, значит этот метод сеттер свойства объекта (property) которое выглядеть должно примерно так:
      property SilentMode: Boolean read GetSilentMode write SetSilentMode;
      Ответить
      • Нормальное название переменной...
        Смотрим в другом контексте - контексте вызовов из других мест.
        SetSilentMode(true)
        SetSilentMode(false)
        Если обернуто, то
        SilentMode := true
        По-моему все понятно... А в таком маленьком кусочке кода неприятных ощущений не вызывает.
        Ответить
    • У свойств обычно единственный аргумент называется Value. Так делает автоматическое дополнение кода.
      То есть намерено разработчиком было выбрано такое имя аргумента свойства и без приставки Is, так что говнокод дважды.

      Теперь хочу попросить взглянуть ещё раз на код метода. Если я правильно понял то это просто сеттер для внутреннего поля FSilentMode.
      Но тип свойства и внутреннего поля отличаются! Хотя по идее это одно и тоже!
      Не ну конечно возможно что внутреннее поле FSilentMode перечисляемого типа. Ну например типа такого:
      TSilentMode = (simMessageBoxes, simSilent, simKind1, simKind2);
        FSilentMode: TSilentMode;

      Но тогда бы понту не было бы от этого отдельного сеттера потому что проще использовать Exclude и Include. В этом методе значения присваиваются стирая любые другие комбинации, значит FSilentMode не перечисляемого типа.
      Значит поле имеет целый тип а свойство булевый.
      Из за этого прийдётся ещё и писать гетер GetSilentMode, вместо того чтобы прямо написать read FSilentMode.
      Короче как ни крути сетер и гетер не нужны, так что опять говнокод.
      Ответить
    • Это ещё не всё. В Delphi есть функция IfThen частично имитирующая оператор условной операции из Си. Пример на Си:
      a = b ? 1 : 0;
      если b будет истинно то переменной a будет присвоена единица, иначе ноль.
      IfThen перегружена для строк (в модуле StrUtils) и для целых и вещественных (в модуле Math)
      Используется это чудо примерно так:
      FSilentMode := IfThen(Mode = True, simSilent, simMessageBoxes);

      Одна строчка к тому же более осмысленная!
      Ответить
    • Во первых она годна только для четырёх простейших типов. Byte кажись не поддерживается.
      Обычный тип Char не поддерживается, поэтому каждый раз одиночные символы преобразоваться в строку которая занимает памяти больше: спереди записывается длина строки а в конце добавляется Null символ. К тому же строка уже не значение а указатель на значение. Выделение памяти очень дорогая операция. В критических по производительности местах (в циклах) такая хрень станет тормозом, если не будет исправлена оптимизатором.
      Перечисления использовать нельзя, хотя и можно изъебнутся и привести перечисление к целому но это низкоуровневая операция и вроде как не есть гуд для Дельфи. Вот на Си такое пожалуйста, сколько угодно.
      Кроме перечислений есть ещё set'ы которые даже к целому не приравняешь потому что внутри дельфи их оптимизирует и хранит одним байтом (опять таки могу ошибаться!).
      Ответить
      • Var n:Set Of Byte;
        Begin 
          WriteLn(SizeOf(n))
        End.

        Видало 32 байта (256 бит по биту на каждый элемент множества)
        Ответить
        • Тут всё зависит от количества вариантов (не более 256). Например, вот это:
          type T1 = (r0, r1, r2, r3, r4, r5, r6, r7);
          var s: set of T1;
          влазит в 1 байт.
          Ответить
    • Второй проблемой IfThen это то что аргументы вычисляются перед её вызовом. В дельфи нет ленивого вычисления как в функциональных языках. Ну по крайней мере в 7мой версии. Я вообще про 7мую версию только знаю и говорю. На .NET точно есть лямбды которыми вроде как тоже самое можно сотворить.
      Вполне нетривиальный пример:
      i := IfThen(NumberAsString = "", -1, StrToInt(NumberAsString));

      Допустим NumberAsString пустая, тогда вычисляется это так:
      NumberAsString = ""  => True
      -1                                => -1 
      StrToInt(NumberAsString) => StrToInt("") => исключение!
      Ответить
    • Такие моменты ситуации решаются классическим if'ом:
      if NumberAsString = "" then
        i := -1
      else
        i := StrToInt(NumberAsString);


      Вывод. Однозначно говнокод. Возможно я в чём то ошибаюсь потому что на дельфи писал уже давненько, да к тому же на 7мом, да к тому же не писал и разбирался как работает полностью говнокодовая программа. Там такой говнокодище что все примеры на этот ресурсе сосут. Хотя может это и преувеличении но не сильное.
      Если что поправьте меня пожалуйста.
      Ответить
    • дебилы, говнокод потому что FastReport - типа серьезный бизнес, а булевы выражения вроде
      a > b = true
      рожают только ступиденты "для большей ясности"
      Ответить

    Добавить комментарий