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

    +92

    1. 1
    2. 2
    Result := not FExecuting;
    if not Result then Exit;

    сейчас работаю над правкой компонента доставшегося от другого разработчика :), причем эта вершина мысли была обнаружена в недрах левого компонента, используемого моим компонентом :) ,который использовал этот разработчик :), Сам код соправождаемого мною компонента не далеко по стилю ушел от этого куска

    Запостил: ageron, 23 Декабря 2010

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

    • простите за сумбурность изложения
      Ответить
    • не вижу ничего говнистого, мало контекста

      грамматикфюрер не прощает :р
      Ответить
    • Говна не вижу.
      Ответить
    • может автор хотел сказать, что
      Result := not FExecuting;
      if FExecuting then Exit;
      несколько нагляднее?
      но конкретно это на говнокод не тянет.
      Ответить
      • А если FExecuting - функция (ну почему даже в Аде не додумались до запрета вызова функций без пустых скобок)? А если с побочным эффектом?
        Ответить
        • зато в VB додумались)
          Ответить
        • А если Result — функция? (в Дельфи не прокатит).
          А если Exit переопределена и в ней туча побочных эффектов?
          Ответить
          • Exit это не настоящая процедура
            Ответить
            • Тем не менее,
              procedure TForm1.Exit;
              begin
                ShowMessage('He-he');
              end;
              Ответить
              • проверил, да, можно таки определить ложный эхит, даже ворнингом не плюется
                Ответить
          • > А если Result — функция? (в Дельфи не прокатит).
            function TForm1.Result: boolean;
            begin
              ShowMessage('WTF????');
              Result := false;
            end;
            Вызывается через self.Result; вот же ж блин, зачем я узнал это???77
            Ответить
            • для чистоты их надо простыми и глобальными :)
              Ответить
            • А можно и
              function Result: boolean;
              begin
                ShowMessage('WTF????');
                Result := false;
              end;
              Вызывается через Unit1.Result. Ну с Result хоть не так страшно, у локального Result приоритет выше, чем у переопределенного.
              Ответить
          • Если ексит переопределён, то автор мудак.
            А вот fexecuting - может быть и переопределена.
            Например, if OpenDialog1.Execute - с побочным эффектом, хотя по её виду не скажешь. Было бы Execute() - было бы понятно, но нет же, почему-то решили освободить паскалистов от написания двух скобочек, спасибо Вирту, блять, за это, а ещё спасибо ботланду за проперту, с которыми, блять ваще хуй поймёшь, что где, потому что она косит под переменную, а на самом деле это сраный вызов метода. Я вообще проперти в своих классах не использовал никогда (кроме когда совсем зелёный был) именно из-за этой путаницы, я лучше буду писать SelColor($123456) и сразу видеть, что это хитрожопый метод, но нет же, Color := $123456 - это же так модно смотрится, так сишарпненько, пидарасы, блять.
            Ответить
            • function TCommonDialog.Execute: Boolean; virtual; abstract;
              { не? }
              Ответить
            • ну и дурак. Проперти в делфях были задолго до появления сишарпов.

              Проперти позволяют с одной стороны сохранять инкапсуляцию а с другой делать код более естественным.
              Ответить
              • когда они еще в дельфи не преименовались.
                Ответить
          • а почему все забыли про
            type
              TMySuperProc = procedure;
            function GetProc: TMySuperProc;

            хотя, конечно, так вроде приоритеты другие и ничего не заработает
            Ответить
        • > А если FExecuting - функция
          Приставка F кагбэ намекает на просто field. Но да, лучше перепроверить :)
          Ответить
        • про функцию не подумал, потому что:
          1) префикс F - по стандарту это поле
          2) сам пишу всегда с пустыми скобочками, чтобы другим было видно, что это функция
          Ответить
      • обращение к стеку оптимальнее обращения к куче, не засчитано
        Ответить
    • if not Result := not FExecuting then Exit;
      Ответить
      • А вот этот прикол я бы добавил в паскаль.
        Ответить
        • Да. Только добавить не для прикола. :)
          Ответить
    • люди смотрю и охреневаю неужели никто не заметил что данные 2 строчки разворачиваются в:
      if not not FExecute then Exit; что равносильно:
      if FExecute then Exit;
      вот это и есть говнокод. тупое непонятное решение которое просто и изящно можно записать 1 строчкой. Уж недумал что все настолько слепые. а вы начинаете тут полемику разводить функция/не функция
      Ответить
      • и..?
        Ответить
      • А Резалт нам уже не нужен?
        Ответить
        • угу а что значит Result в Delphi помнишь? если помнишь то должен понимать почему это говнокод а есл не знаешь ну что ж... учите мат часть. и тем более эти 2 строчки не следуют правилу KISS (для тех кто в танке расшифровка "Сделай проще дурачок")
          Ответить
          • задам, перекрестясь, вопрос в третий раз, может разверзнется...
            Ответить
          • Я помню, что означает резулт в дельфе. Так что матчасть учи ты.
            Ответить
            • Ааа, я понял его, кажется! Ведь вызов функции возвращает результат в еах, и если сразу выйти, то в еах (то есть резулте) и будет храниться результат фекзекуте!!!
              Ответить
              • А компилятор не может засрать eax, если мы в явном виде резулту ничего не присваивали?
                Ответить
                • Не знаю, может и может.
                  Вообще это я типа пошутил, потому что закладываться на особенности внутренней реализации - это говнокодно.
                  Ответить
              • какой в жопу результат поля? оккам же!
                Ответить
                • Ох ты ж бля, это же поле, да.
                  Ну может компилятор в еах поле суёт перед сравнением, хотя тут не знаю.
                  Ответить
                  • всё равно Exit таки вернет то, что в Result записано
                    это ж не брутальный asm ret end
                    Ответить
                    • Дельфи по-любому втыкает mov eax, Result в конце, если не было директивы assembler в заголовке функции.
                      Ответить
                      • а скорее всего Exit оттранслируется в короткий прыг на конец
                        Ответить
              • Шутка по Фрейду?
                Ответить
    • О_о
      Я только что узнал, что функция может вызываться и без скобочек...
      Ответить

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