1. C++ / Говнокод #12870

    +25

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    bool Channel::applyPreprocessorSettings()
    {
    	if (captureDeviceID_.empty() || !isSafeToChangeSettingsNow())
    		CHANNEL_LOG("deferring applyPreprocessorSettings()");
    		needApplyPreprocessorSettings_ = true;
    		return false;
    
    	// ... (куча кода)
    	
    	return true;
    }

    Никогда - слышите, НИКОГДА! - не пишите на C++ одновременно с питоном.

    Запостил: Kirinyale, 09 Апреля 2013

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

    • Вот кстати начал замечать за собой такую вещь - первым делом бросаю взгляд на отступы, и именно по ним разбираю структуру кода. А вот есть ли скобки или лишние точки с запятой, увы, нахожу только потом.
      Ответить
      • Мне в последнее время приходится очень много писать на питоне и очень мало - на плюсах. Вот и результат. Лично для меня это первый такой случай за очень, очень много лет. Что делать? :)
        Ответить
        • Наверное должны помочь утилиты проверки стиля кодирования.
          Ответить
        • >Что делать?
          Переходи на sql.
          Ответить
        • Включить автоиндент в среде разработки. По кривому отступу сразу видно, что скобки не так встали.
          Ответить
          • MSVS, всё включено. Почему-то не спасло.

            На чуть посвежевшую голову всерьёз призадумался: почему в данном конкретном случае компилятор не выдал варнинг "unreachable code"? Придётся завтра проверять, что там лиды за warning level поставили...
            Ответить
        • Я пишу параллельно на обоих языках. У меня такого не происходит, т. к. я всегда параноидально расставляю скобки вокруг if-else-блоков (если только это не return или break, располагающийся на той же строке).
          Ответить
          • > я всегда параноидально расставляю скобки
            В питоне тоже? :)
            Я-то тоже к такой паранойе привык было, но постоянные переключения начинают мешать. Уже и для ифов скобки забываю иногда, но это хотя бы не компилируется.
            Ответить
            • В питоне, разумеется, нет. Не знаю, контекст всегда легко переключается...
              Ответить
              • А доля (в рабочем времени) питона и плюсов сильно отличаются? Возможно, дело в том, что у меня сейчас примерно 90/10 (не в пользу плюсов).
                Ответить
                • ПлюсОв больше. Но когда пишу на питоне, скобки ставить не хочется :)
                  Ответить
        • стать окончательной вебо-девочкой.
          Ответить
        • Переходи на Аду.
          Ответить
    • > Никогда - слышите, НИКОГДА! - не пишите на C++ одновременно с питоном.
      Почему?
      Ответить
    • показать все, что скрытоНикогда таких проблем не испытывал. return, если он есть в языке - всегда один и в конце функции. По-другому - только если очень-очень лень переделывать.
      Проблем изза того, что return всегда в последней строке никогда не было.
      Ответить
      • да ты упорот, братиш.
        проблема не в ретурне.
        Ответить
      • Опуститесь с небес на землю, попробуйте отвлечься от рассуждений о лиспе, и чуть-чуть задержите взгляд на строках 5 и 6.
        Ответить
        • А при чем тут Лисп? :| Строки 5-6 выполняются безусловно. Если бы return был в функции всего один раз - такой ситуации бы не возникло. Что я такое не заметил?
          Ответить
          • Была бы не менее печальная проблема - по пути к последнему return отрабатывала куча не предназначенного для этого кода.
            Ответить
            • Нет, человек бы не стал вообще такой if писать, т.как если не предполагать возможность выйти "досрочно", то и код такой не получитыся, только если совсем не понимать, что делаешь.
              Ответить
              • bool result = false;
                if (cond1)
                    doThis();
                    andThat();
                    result = true;
                if (cond2)
                    doMore();
                    andEvenMoar();
                    result = true;
                return result;
                Ответить
              • Он с питоном переработал, и вместо скобок на 4-6 сделал отступ. Вот и весь сакральный смысл этого говнокода.

                А IDE "помогла" ему, и не отменила лишние отступы в неподобающих местах, поэтому он не заметил ошибку.
                Ответить
              • И какова же альтернатива? Заключать всё тело функции в if ради одной проверке в её начале, неоправданно увеличивая отступ для всего этого самого тела? Или дублировать эту проверку перед каждым вызовом функции из разных мест?
                Ответить
                • Откуда взялось второе условие? Из исходного варианта этого не видно. Из исходного варианта можно понять, что если бы не было return, то человек бы написал else, и следующий за ним код был бы в блоке else. Соответственно, если бы else остался в такой же ситуации, в которой сейчас return - была бы синтаксическая ошибка.
                  Ответить
                  • Не понял, что за "второе условие"? "Исходный вариант", по-моему, кристалльно ясен (в том числе по идентификаторам и тексту лога): есть функция, которая что-то делает, но только в том случае, если прямо сейчас это безопасно. Если небезопасно, функция ничего не делает, а только откладывает до лучших времён.

                    Чего ради мне в этом случае писать else после ветки, заканчивающейся return? Для красоты? Для того, чтобы добавить лишний отступ перед всем, что идёт дальше?
                    Ответить
                    • Второе условие: вопрос к roman-kashitsyn. Вы определитесь уже тогда, либо вы можете return в конце ветки, либо не ко мне с такими вопросами.
                      Ответить
                      • > вопрос к roman-kashitsyn
                        Мой пример - лишь иллюстрация того, что правило "одна точка выхода из функции" в общем случае никак не спасает от ошибки, на которую попался автор.
                        Ответить
                      • > Второе условие: вопрос к roman-kashitsyn
                        А, ну так к его посту и надо было ответ писать, чтоб не путаться.

                        Определяться мне пока не с чем. Я только понять пытаюсь, на чём основана эта Ваша странная идея, что return нужно ставить только в конце функции, а всё остальное - от лукавого.
                        Ответить
                        • > на чём основана эта Ваша странная идея, что return нужно ставить только в конце функции

                          Это же целое идиологическое направление, взявшее начало от Дейкстры.
                          У функциональщиков также принято возвращать значение последнего выражения, но досрочный ретурн сымитировать таки можно через монаду Cont.
                          Ответить
                        • "Моя" идея основана на следующих наблюдениях:
                          - когда я читаю код, то расстояние до левого края мне сообщает о том, что этот код выполняется всегда, безусловно. Это простое правило, которому просто следовать интуитивно (сокращает время потраченное на чтение).
                          - отлаживать функцию в которой нет преждевременных окончаний - проще, т.как можно просто на предпоследней строчке вызвать отладчик, не вдаваясь в подробности / не обвешивая фунцию вызовами отладчика по периметру.
                          - в языках, где существуют всякие вариации синтаксиса, такого типа, как в примере выше это помогает избежать подобные ситуации, т.как любой код, который бы должен был выполнятся по условию будет механически помещен за гарда этого условия (либо if, либо else).
                          - написание покрытия тестами становится немного проще (но не существенно).

                          Если ради этого мне нужно пожертвовать одной "ступенькой" - мне это видится вполне приемлимой платой. Наверное, это меньше понравится людям, которые пишут по 8 пробелов в "ступеньке"... но я к ним не отношусь.
                          Ответить
    • программирование на C++ одновременно с питоном - это называется парное программирование
      Ответить
      • Угу. Нас двое - я и питон. Оба пишем на C++.
        Ответить
        • Неужели питон так плох? Мне кажется, писать на нём приятней, чем на плюсах...
          Ответить
          • Фу-фу, холиварным духом пахнет :)

            Вообще, смотря для чего и в каких масштабах. По удобству работы со стандартными контейнерами, безусловно, питон убирает плюсы одной левой. Но повсеместно-принудительная "свободная" типизация и прочие прелести вроде автосоздания переменных присваиванием очень напрягают, когда 99% ошибок и опечаток, которым C++ не дал бы даже скомпилироваться, приходится ловить в рантайме, несмотря на всю PyCharm'овскую подсветку (а иногда и "благодаря" ей).

            Особенно мне это нравится при работе с серверной частью: написал большой кусок кода (или порефакторил существующий), залил на сервер, запустил. Глянул в логи, нашёл трейсбек, поправил. Остановил сервер, перезалил, перезапустил. Глянул в логи, нашёл следующий трейсбек. Поправил, остановил, перезалил, перезапустил... и так пару часиков. :)
            Ответить
            • Просто юзайте модуль unittest, отлаживать софт на сервере - удел похапешников
              Ответить
              • Да. Вот не далее как вчера. Но там всего лишь не хватало расширения php-xml, поэтому на локальной копии не воспроизводилось, а до Vagrant+Chef еще руки не дошли.
                Ответить
        • Питон - кодогенератор для плюсов?
          Ответить
          • Да нет на самом деле, я просто развил тему. :)
            Питон здесь - пристройка к движку, на которой нужно писать практически всю логику (в том числе клиент-серверную). В рамках моей текущей задачи C++ нужен только для непосредственной работы с одним сторонним SDK.
            Ответить
        • Я и одноглазый змей друга.
          Оба работаем руками.
          Ответить
    • Я на питоне после явы сложил строку и число. Ошибка нашлась у клиента.
      Ответить
      • Питонопроблемы :)

        Питон без юнит-тестов юзать нельзя. Вообще.
        Ответить
        • Это правда, но бля, задолбешься писать юниттесты для ТАКИХ вещей, тем более что у меня там было if i % 100 = 0: код (индикатор прогресса), у меня i до ста не дошел, а у клиента дошел.
          Ответить

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