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

    +125

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    //сервер сайд (из colors.php)
    
    $colors = [
        'banana'   => 'yellow',
        'orange'   => 'orange',
        'cucumber' => 'green'
    ];
    
    echo $colors[$_GET['fruit']];
    
    
    //клиент сайд (js)
    var fruits = ['banana', 'orange', 'cucumber']
    for (var i in fruits) {
        var fruit = fruits[i]
        $.get('colors.php?fruit='+fruit, function(color){
            document.write(fruit +' is '+ color +'<br/>')
        })
    }

    Этот код показывают и задают вопрос почти на любом собеседовании на должность web-программита:
    Что здесь неверно и как это исправить?

    Запостил: LispGovno, 02 Марта 2013

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

    • Я тут вижу
      a) Синхронный запрос. Надо асинхронно
      б) Поштучный запрос. Надо всей толпой, чтобы снизить нагрузку и увеличить скорость работы.
      в) передача имени объекта. Я бы передавал id
      г) Общая бредовость конструкции
      д) Отсутствие ";" в js-коде (по вкусу)

      Какой ответ считается правильным?
      Ответить
      • А запрос, кстати, таки асинхронный. Что ситуацию улучшает не сильно.
        Ответить
      • Видимо минусанувший знает дзен. На минус мне пофиг, а вот дзен ПОВЕДАЙТЕ :)
        Ответить
      • Про а) вы уже заметили.
        б) Экономия на спичках. Мимо.
        в) Экономия на спичках.
        г) Вполне нормальный синтетический код для вопроса на собеседовании
        д) Поддерживаю, но это не приводит к ошибке.

        Ошибка заключается в том, что, поскольку запрос асинхронный, во всех трех запросах fruit == 'cucumber' - замыкается последнее значение, определенное в цикле. Это стандартное поведение замыканий в JS.

        Исправление соответствующее:

        for (var i in fruits) {
            (function (fruit) {
                $.get('colors.php?fruit='+fruit, function(color){
                    document.write(fruit +' is '+ color +'<br/>');
                });
            })(fruits[i]);
        }


        Поскольку выглядит ужасно, лучше использовать http://api.jquery.com/jQuery.each/:
        $.each(fruits, function (k, v) { /* $.get...*/ });
        Ответить
        • Какая забавная хрень с дополнительной костыльной обёрткой, и какое нелогичное поведение. Не пыхпыхом единым.

          Про б) не соглашусь - это экономия на спичках, пока у вас нормальный интернет, а когда вам попадает в руки 3G свисток с откликом в секунду, ситуация резко меняется.
          в) Ну так и тест-то синтетический.
          г) Бредовость в том, что запрос к серверу можно вообще убрать, побавив данные в страницу :)
          Ответить
          • Да, костыль. Проблема в том, что не все реализации JS имеют метод each (или аналог) в интерфейсе массивов. Благо, в любом фреймворке это реализовано.

            г) Согласен. Тут все зависит от цели проведения теста. Я бы тоже убрал, чтобы в тесте остался только JS, чтобы тест не требовал дополнительной внимательности при поиске ошибки. А для проверки внимательности я бы использовал больший отрывок кода.
            Ответить
        • О, дааа... Наступал я на эти грабли, было дело :)
          Ответить
          • Да все, наверное, наступали. Я вот тоже попадался, когда маркеры для опенлейерс расставлял. У меня клик по маркеру всегда редактировал последний.
            Ответить
        • Эммм, да?
          http://img13.imageshost.ru/img/2013/03/03/image_5132dede01b38.png
          Ответить
          • Да-да. fruits в параметре $.get будет правильным, как на рисунке. А вот когда результат придет, и вызовется замыкание - вот там баг и проявится. Внутри замыкания fruits будет равно cucumber во всех трех случаях.
            Ответить
    • Быть может, тут for..in в Array с вылезающим "lenght" и fruit, которая одна на все вызовы callback'a, с пришествием асинхронности имеющая шанс принять последнее значение для всех вызовов callback'a?
      Ответить
      • Нет, js, вроде как, копирует ссылку на объект в замыкании. То есть, пары значений будут таки верными. Единственное, может нарушится их очерёдность.
        Ответить
        • Таки callback будет действительно связан с fruit, но не с конкретным значением.
          Подобное наркоманство под Node выводит 3 строчки вида "cucumber is цвет<br/>":
          // Говноэмулятор jQuery и сервера
          var $ = {
            get: function(url, func){
              var fruit = url.substring(url.indexOf('=')+1);
              
              setTimeout(func.bind(this,{
                'banana': 'yellow',
                'orange': 'orange',
                'cucumber': 'green'
              }[fruit]), 666*Math.random());
            }
          };
          var document = {
            write: function(x){console.log(x);}
          }
          
          // Тот самый код
          var fruits = ['banana', 'orange', 'cucumber']
          for (var i in fruits) {
              var fruit = fruits[i]
              $.get('colors.php?fruit='+fruit, function(color){
                  document.write(fruit +' is '+ color +'<br/>')
              })
          }
          Ответить
    • В пыхе квадратные скобки не являются литералом массива.

      Еще из плохих вещей: для аргументов в жквери есть специальная функция, чтобы не писать самому амперсанды и вопросительные знаки, плюс она же там чего-то экранирует, хотя тут это не принципиально.
      document.write - плохая идея вообще всегда, но тут же высосаный из пальца пример, так что хер знает...
      Кроме того, если уж использовали жквери для того, чтобы отрпавить запрос, так уже и циклы делали бы по жквери, а то как-то не с руки...
      Ответить
      • В общем тут непонятная задача с размытыми критериями оценки.
        Ответить
      • c версии 5.4 пых поддерживает квадратные скобки как способ объявления массива
        Ответить
        • А где вы видели админа, который согласится на прод 5.4 поставить? :)
          ...У нас на 5.3 только с этого года, накоенц, отважились... По случайности: забыли новому человеку сказать что у нас 5.2, и не проследили чем 2 месяца занимался - не переписывать же теперь заново... И то теперь всякую мистику отлавливаем. :)
          Ответить
          • В чем проблема с 5.4? Уже целый год и 12 версий прошло, вполне годится для использования. Я последние два года пишу под 5.3.
            Ответить
            • Хз. у нас 5.2 по причине доисторических драйверов для mssql. Но апдейт намечен не к следующему пыху, а к Руби, поэтому терпим :(
              Ответить
              • Отказ от mssql_* это большая проблема, но я бы посоветовал для начала перейти на PDO. Хотя там тоже много проблем (именно с SQL Server из-за проблем с драйверами ODBC/DBLIB), но по крайней мере не нужно переписывать все.

                Переход на другой язык при наличии legacy-кода в количестве более 1 приложения и более одного разработчика может стать непосильной задачей.

                В любом случае желаю удачи.
                Ответить
                • Что смешно: из всех технологий использующихся в проекте, SQL Server - пожалуй самое хорошее, что есть. Я вообще, как человек ранее далекий от баз данных, имел дело только с Мускулом, и то поверхностно, очень даже проникся. Но люди все равно ухитрились так испохабить, что при всем желании, проще сделать по-новой.
                  С mssql будет жалко расставаться, а все остальное выбросить - это облегчение, наоборот.
                  Ответить
    • Тогда еще из недостатоков: апоплексически расставлены пробелы: то они есть с обеих сторон вокруг плюсов, то только с одной, то их нету вообще. Аналогично фигурная скобка, то отделяется пробелом от предыдущего выражения, то нет.
      Ответить
    • А еще тут ясно видна проблема английского языка. Если бы banana был yellow, а cucumber - green, не пришлось бы использовать мапу. Апельсин - молодец.
      Ответить
      • А они уже заняты: yellow это желток, green это зелень. Лучше новые цвета придумать - огуречный (cucumber) и банановый (banana). Тогда все отлично стыкуется ;)
        Ответить
    • Все что в теме упоминалось - я назвал на собеседовании. Вопросяторов мой ответ не устроил.
      На самом деле ответ на вопрос
      Что здесь неверно и как это исправить?
      должен был быть такой:
      Массив fruits (фрукты) содержит cucumber (овощ) и banana (ягоду). Раз я этого не обнаружил, то у меня проблемы с логикой. Как это исправить они не ответили, но зато сказали что они мне не подходят.
      Ответить
      • Прикольно, но я в английском не знаю аналога слову "денатурат", а каких-то других собирательных понятий обобщающих фрукты и овощи - ни в том и ни в другом языке как бы и нету... или тогда уже просто растениями их называть.
        Ответить
      • Банан - это фрукт. Огурец действительно не в тему.
        Ответить
      • Серьёзно, что ли? *ultimate facepalm*
        Ответить
        • Ну если человек с логикой не дружит, то явно такого брать на работу не должны, так что проверка весьма годная имхо. Уж я то должен был догадаться, что как минимум с огурцом что-то не так. Самое смешное я так и не придумал как правильно исправить эту проблему. Я думаю переназвать имя массива, но как?
          Ответить
          • дадада, должны были )
            Тут такая концентрация лажи на квадратный символ, что становится просто не до именования. И на программерсом тесте, вообще, принято код писать/проверять, а не психологические задачки решать.
            А если ещё после полного описания того почему код-говно, проверяющего ответ не устроил, то он либо hh, либо долбоёб.
            Но всё это выглядит слишком сюрреалистично, поэтому я остановлюсь на варианте, что это такая шутка с вашей стороны :)
            Ответить
          • Огурец, кстати, как уже писали, технически ягода. Как и помидор :)
            Ответить
            • Технически огурец это закуска, как и помидор.
              Ответить
              • Помидор - это синьор. А огурец - молодец. Особенно если малосольный.
                http://youtu.be/QKmgL-gp5z8
                Ответить
          • >Я думаю переназвать имя массива, но как?
            edible, food, vegetarianMenu, grocery, arr1, massivOvoschiFrukty...
            Ответить
          • Вода, водка, сок, булочка. Назовите одно лишнее.
            Водка. Всё остальное безалкогольное. Как вариант - вода, потому что всё остальное калорийное.
            Ответить
      • Berries which develop from an inferior ovary are sometimes termed epigynous berries or false berries, as opposed to true berries which develop from a superior ovary. In epigynous berries, the berry includes tissue derived from parts of the flower besides the ovary. The floral tube, formed from the basal part of the sepals, petals and stamens can become fleshy at maturity and is united with the ovary to form the fruit. Common fruits that are sometimes classified as epigynous berries include bananas, coffee, members of the genus Vaccinium (e.g., cranberries and blueberries), and members of the family Cucurbitaceae (e.g., cucumbers, melons and squash).[1]

        Ха-ха-ха. Вобщем, огурец - тоже ягода. Я как-то даже это подозревал, т.как знал, что арбуз, технически считается ягодой. Так что... не катит :)
        Ответить
        • Тыквина (лат. pepo, peponium) — плод растений, характерный для представителей семейства Тыквенные (в том числе для тыквы, арбуза, дыни).
          Ответить
      • А ты чего это в веб подался? Вроде же крестами раньше занимался. В чем причина такой резкой перемены?
        Ответить
        • У нас в городе крестушкам платят 10-25к, с - 10-15к, а web - 10-50к, 1с - 20-60к. Так что выбор не сложен.
          Ответить
          • Мда. Во всё мире, чем реже специалист, тем выше зарплата, а в роисси - наоборот.
            Ответить
          • А в нашем городишке только наша контора и занимается разработкой, да и то с переменным успехом. Во всех остальных IT == мальчик-эникейщик. К концу лета, если ничего не случится, думаю податься в Новосиб или Питер...
            Ответить
            • В какой город или страну уехать работать? Я в Москву ездил отдыхать во время каникул. Так уныло. Загазовано, шум, зелени нет, людей и машин дохрена, пробки, до работы не добраться, да чтоб тебя даже мусорки от взрывов бронированные.
              Ответить
              • >в Москву ездил отдыхать
                отдыхать надо в других местах
                Ответить
                • Ну блиин. Я же не знал, что там так уныло. Вижу ты ПРО шареный. Подскажи тогда куда поехать? В том числе отдыхать.
                  Ответить
              • В Варшаву.
                Ответить
            • почему питер?
              Ответить
              • Ехать нужно в Канаду. Там климат такой же как и в России в умеренном поясе.
                Ответить
                • везде хорошо, там где нас нет
                  Ответить
                  • Тогда почему не Питер?
                    Ответить
                    • Болотный газ — бесцветный газ со слабым, но неприятным запахом, который выделяется со дна стоячих водоёмов в результате гниения ила и других остатков растительного и животного происхождения.
                      Ответить
                      • Странно, я влюбился в питер с первого визита. Многие из моих знакомых уехали туда жить и не жалеют. К москве, кстати, тёплых чувств я ни разу не испытываю.
                        Ответить
                        • фасады в питере действительно лучше, это очевидно
                          Ответить
                          • >фасады в питере действительно лучше
                            А еще мосты. Но вот строители такие же.
                            P.S. Мы ведь о паттернах говорим?
                            Ответить
                            • о паттерне visitor "выберись с васильевского острова ночью"
                              Ответить
                              • после прорыва трубы на площади Труда и закрытия Дворцового на ремонт, можно заменить на: "выберись с васильевского острова any time"
                                Ответить
                          • А поребрик?
                            Ответить
                            • Поребрик не может быть лучше. Потому что в других местах его просто нет.
                              Ответить
                            • обоссаные парадные, протёртые бадлоны, черствые булки
                              Ответить
                            • Вот вы хаха, а я часто "поребрики" в Калининграде слышу )
                              Ответить
                      • >бесцветный газ
                        а в Москве бывает очень даже цветный
                        Ответить
              • > почему питер?
                Есть друг у которого можно перекантоваться месяц-другой, а это, имхо, немаловажно.
                Ответить
        • @bormand, как ты ещё жив, такой доверчивый...
          http://www.gamedev.ru/flame/forum/?id=173497&page=2
          Ответить
          • > инди-хоррор
            Пакмен! Четыре привидения, таблетки которые постоянно глотает протагонист, непонятный и страшный лабиринт... Чем не хоррор.
            Ответить
            • Для усиления хоррор-эффекта можно ограничить видимость в радиусе 3-4 тайликов, и добавить звуки крадущихся призраков.
              Ответить
              • Получили Diablo 1.
                И до кучи скрестить с сапёром, показывая в уголках тайлика цифру - кол-во врагов вокруг него.
                Ответить
                • И с тетрисом, примерно так: http://www.youtube.com/watch?v=QwXRWlp5a8w
                  Ответить
      • Тут, кстати они неправы. Fruit до сих пор может значить и «плод» (оригинальное значение), а в роли глагола «плодоносить» даже сейчас употребляется достаточно часто.
        Пруф: http://dictionary.reference.com/browse/fruit?s=t
        Первая же запись: «any product of plant growth useful to humans or animals.»

        EDIT: Далее там же: « To a botanist, apples, peaches, peppers, tomatoes, pea pods, cucumbers, and winged maple seeds are all fruits
        Ответить
    • > Что здесь неверно и как это исправить?
      оифг....
      1. пыхомассив, как ни прискорбно, обьявляется через псевдофункцию array.
      2. нет проверки на существование параметра fruit.
      3. нет проверки существования ключа $colors.
      4. массивы fruits и $colors определены несогласованно
      5. fruit будет неверен (как уже заметили)
      6. нет обработчика ошибок, что приведет к тому, что не все цвета будут напечатаны и мы об этом не узнаем
      7.асинхронность запросов приведет к беспорядочному выводу

      это то, что бросилось в глаза сходу. в реальном, не синтетическом коде засад было бы еще больше, а тут уж ладно...
      Ответить
      • >1. пыхомассив, как ни прискорбно, обьявляется через псевдофункцию array.
        PHP 5.4 же! Сказали уже.

        >5. fruit будет неверен
        Особенно банан.
        Ответить
    • По-моему проблемы с логикой как раз-таки у разработчика, который видя нерабочий код начинает доколупываться до названий переменных вместо того, чтобы искать ошибку. Искренне желаю им найти такого сотрудника.
      Ответить
      • кстати, чаще всего сначала надо переобозвать переменные, которые мешают вникнуть в суть и сосредоточиться.
        я знаю несколько случаев появления багов только из-за названия свойства disabled вместо enabled.
        Ответить
    • Я бы хранил на сервере JSON с соответствием фрукта его цвету в виде:
      {
        "banana: "yellow",
        "orange": "orange",
        "cucumber": "green"
      }


      С помощью
      $.getJSON
      можно единоразово загрузить всю таблицу соответствия и использовать уже ее. Из-за кучи запросов, оригинал будет работать очень медленно, если ping до сервера большой. Да и вообще, трафик в моем случае экономится в разы, т.к. в оригинале отношение объема заголовков HTTP и протоколов низших уровней к объему полезной информации составят более 90%. В результате при большом разнообразии фруктов снижаем нагрузку на канал в 10 раз.
      Ответить

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