1. Куча / Говнокод #17875

    +127

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    // А
    if (x) {
        ...
        doStuff (x);
        ...
    
    // Б
    if (x) {
        ...
        doStuff (true);
        ...

    что меньшее говно? А или Б?

    в случае А приходится напрягать мысль на строчке doStuff(x) чему же там равно х. но при этом эту строчку можно безболезненно вынести за if(x), если понадобится.

    Запостил: makc3d, 27 Марта 2015

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

    • А язык-то какой? А так Б вообще нелогично выглядит -- зачем ему true передавать, если в случае с !x doStruff никак не вызывается?
      Ответить
      • так сказал, будто это единственное место, где doStuff используется. в других местах может быть и false аргумент.
        Ответить
        • Ну так и соль в том, что говно или не говно зависит от сущности x и doStuff
          Ответить
    • Получается, у кода, вызывающего твою функцию, и самой функции, в той или иной степени задачи пересекаются. Бей метод на более мелкие части, которые уже можно будет вызывать в зависимости от чего-то там. Рефакторинг во все поля. Если же по какой-то причине хочешь без этого обойтись, то А и комментирование каждого чиха и метода в коде с автогенерируемой документацией.
      Ответить
      • а какой тут м б рефакторинг? только разделить на doStuff1() = doStuff(true) и doStuff2() = doStuff(false)
        Ответить
        • собсно так и сделаю. станет больше if-ов, да и хуй с ним
          Ответить
          • Сути не видишь. Тут явно бросается в глаза, что у тебя условие и в вызывающем функцию фрагменте кода, и в самой функции. Сделай так, что у тебя условие будет либо там, либо там. Если ситуация в твоём коде так же примитивна, как в этом примере, то правильно будет отрефакторить. Если же ситуация сложнее и между повторяющимися условиями пятьдесят слоёв абстракций и функций, то без полного взгляда на картину ничё особо не посоветуешь, такие дела. Если метод приватный и всё работает, то не трогай — ну его на хуй вообще в это говно ввязываться.
            Ответить
          • Ну как, стало?
            Ответить
    • Б, при условии, что х, который проверяется и х, который передается в функцию, отвечают за разные вещи.
      Ответить
      • кстати, вот изоморфный код

        some.width = 123;
        doStuff(some.width); // A

        или

        some.width = 123;
        doStuff(123); // Б

        и тут уже мало кто скажет, что Б менее говнист.

        > при условии, что х, который проверяется и х, который передается в функцию, отвечают за разные вещи

        но как могут значения булевых переменных быть принципиально разными? true всегда равен другому true.
        Ответить
        • У Спольски об этом было: http://www.joelonsoftware.com/articles/Wrong.html . Он это показывал на примере чисел. Но на это можно посмотреть с более философской точки зрения.

          Дело в том, что т.н. material implication (т.е. отношение следования, которое используется в математической логике) - это не то же самое, что и т.н. real implication (т.е. отношение следования в настоящем мире). Например, с точки зрения математической логики если завтра взойдет солнце и у меня есть пять пальцев на каждой руке, то Волга впадает в Каспийское море - это вполне легитимное умозаключение. Более того, если у меня что-то случится с пальцами, то судьба Каспийского моря будет под вопросом.
          Существует множество попыток найти формальную систему, которая бы лучше описывала настоящее следование (модальная логика, системы S1..S5, отказ от аксиомы несуществующего третьего, более строгие требования к участникам формул и т.д.), но хорошей системы таки нет.

          То, что используется во многих ЯП - это "классическая" логика предикатов (нулевого порядка), и поэтому в них проблема следования не решена, поэтому в них может случиться причинно-следственная связь между вещами совсем не связаными (как в примере выше). В таком случае можно сказать, что разные переменные булевого типа, со значением true, имеют разный смысл.
          Ответить
    • doTrueStaff();
      // if
      Ответить

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