1. PHP / Говнокод #6101

    +155

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    private $data = array(
    		'name' => '',
    		'organization' => '',
    		'mail' => '',
    		'phone' => '',
    		'comment' => '',
    		'model' => '',
    	);

    Так адекватные люди создают асоциативные массивы? Или по другому?

    Запостил: greshnik, 27 Марта 2011

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

    • Человек привык к Си и выделению памяти))
      Ответить
    • ну а в чем проблема? declare before use
      Ответить
    • С одной стороны лучше посмотреть в одном месте, какие поля есть в массиве,
      чем косвенно это выяснять, лазия по всей проге.
      А с другой - никто же не проверяет соответсвие тому, как там вначале задекларировано - т.е. с тем же успехом можно было комментарий написать - что коментарий, что это объавление надо править вручную при изменении полей.
      Ответить
      • Если нужна структура данных для описания составного юнита, есть объекты. Ассоциативные массивы (или хэши) - это keyed свалка юнитов, они для другого нужны.
        Ответить
        • А для чего же они нужны?

          Будем честны: в скриптовых языках разницы между "объектами" и "ассоц массивами" быть не должно.

          Lua всё делает правильно. В каком-то смысле и JS, хотя там есть странный Map
          Ответить
          • По этому я за lua
            Ответить
          • > А для чего же они нужны?

            Для коллекции однородных сущностей. Как массивы, но вместо смещения - ключ. По обычным связным массивам искать по конкретному ключу дорого (например хэдер по его имени, а их статичным объектом не опишешь ибо их дофига, сервер может дефайнить какие угодно свои), поетому и придумали хэши.

            > Будем честны: в скриптовых языках разницы между "объектами" и "ассоц массивами" быть не должно.

            Язык - инструмент реализации информационной системы. Если программер использует структуры данных упуская их семантику, то это приводит к перлам и костылям типа такого: http://govnokod.ru/27396 (на месте нынешнего меня, я бы в головной структуре делал 2 поля: chars и total, в первом бы хранил хэш "символ-вес"). То что в JS нет на уровне языка разницы между объектами и хэшом - упущение дизайна (зачем для языка, который изначально разрабатывался как скриптуха для интерактива в веб-документиках, такой замороч?).

            В PHP же оно есть, так почему бы не использовать объект если заранее известно что там будет храниться и как с етими данными роботать?
            Ответить
            • Никакой семантической разницы между объектом/структурой и хешем/мапой/ассоц массивом в скриптовых языках нет.

              То, что в языках типа python есть для этого отдельные сущности, приводит к тому, что одно и тоже делается разными способами
              Ответить
              • Следуя такой же логике, раз в PHP нет разницы между обычным массивом и хэшом, использовать и числовые и строковые ключи в нем - хорошее решение с точки зрения архитектуры. Раз в Си нет классов, то можно любые процедуры размазывать по каким попало указателям и структурам.

                > То, что в языках типа python есть для этого отдельные сущности, приводит к тому, что одно и тоже делается разными способами

                Так ето свойство любого языка. There's more than one way to solve a problem.
                Ответить
                • Семантическая разница между массивом и хешем есть.

                  Массив последователен, а хеш нет. Они используются для разных задач, и обычно всегда понятно нужен ли мне массив или хеш.

                  Что такое "по каким попало указателям" мне особо понятно, тут трудно прокомментировать. Процедуры в Си обычно раскладывают по модулям (единицам странсляции, и соответствующим им заголовочным файлам).

                  Структура и ассоциативный массив имеют одинаковую семантику: они отображают ключ на значение.

                  В языках типа Java, C#, C++ эти сущности разные по двум причинам:

                  * Структура намного эффективнее, ведь её поле это просто смещение
                  * Декларация структуры содержит знание о типе

                  В скриптовом языке обе эти причины неважны: скорость там всегда плохая, а статической типизации там нет.

                  Нет никакой причины разделять случаи

                  foo.bar
                  и
                  foo["bar"]

                  часто бывает непонятно какой вариант выбрать, и почему.

                  >. There's more than one way to solve a problem.
                  Это плохо, и лучше бы уменьшать количество таких кейсов.
                  Ответить
                  • Как отличить bar, который является частью интерфейса словаря и позволяет изменить его поведение от bar, который я решил хранить в словаре?
                    Ответить
                    • Это годный вопрос. К счастью, instance методов у Object в JS мало, а у table в lua вроде и вовсе нет.
                      Ответить
    • В седьмой строчке копипаста детектед...
      Ответить
      • php пофиг на оканчивающую запятую в массивах
        Ответить
        • и кстати, это специально для удобства копипасты сделали, что бы не заморачиваться с запятыми
          Ответить
          • Это не только для копипасты удобно, но и для временного однострочного закомментирования. Что строчку в середине списка комментировать, что последнюю — всё равно.
            Ответить
        • ...а потом удивляются, "откуда это дети берутся"?.. (с)
          Ответить
          • *задумался* копипастой? или наследованием? а, наверное специальным фабричным методом...
            я правда не знаю, потому что я - синглтон.
            Ответить
            • цит.:
              <<
              - Друзья мои, я бездетный!... Моя мама была бездетной, и бабушка была бездетной...
              - А откуда же ты?!?
              - Я?.. Я из Ялты...
              >>
              Ответить
          • Поясни шутку.
            Ответить
        • Именно поэтому я за "PHP".
          Ответить
    • У вас там в 2011-м году все любят руби
      %w[name organization mail phone].map { |k| [k, ''] }.to_h
      Ответить

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