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

    +156

    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
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    <?php
    	
    	class Train {
    		
    		private $strFrom;
    		private $strTo;
    		private $strName;
    		....................................
    		
    		public function __construct($arrParameters) {
    			$objThis = $this;
    			
    			$objThis->strFrom = $arrParameters['strFrom'];
    			$objThis->strTo   = $arrParameters['strTo'];
    			$objThis->strName = $arrParameters['strName'];
    			
    			................................
    			
    			$intCount = count($arrParameters);
    			for ($intI = 0; $intI < $intCount; $intI++) {
    				............................
    			}
    			
    			................................
    			
    			foreach ($arrParameters as $strKey => $mixedValue) {
    				............................
    			}
    		}
    		
    		....................................
    	}

    Интересно ваше мнение о венгерской нотации

    Запостил: doroshenkoes, 05 Июля 2010

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

    • имхо, достаточно одной буквы префикса, а то $intI - это нечто. А для счетчиков и прочих "левых" переменных можно и не пользоваться венгерской
      Ответить
    • да годный код, а такую нотацию юзали во времена, когда все набиралось в текстовом редакторе и о IDE с их подсветками, показыванием типа, Ctrl+Left Mouse Click - переход к дефинишну перменной и пр. свистоперделками никто не слышал, а так сразу ясно что за тип у переменной

      И кстати да, если область использования переменнной по высоте меньше одного экрана - это ставит под сомение её использование, но не факт, что цикл со временем не увеличится, так что - спорно

      так что если код по каким-либо причинам будет эдитися в простом редакторе - то это безусловно крайне полезно, ну или автор олдфаг и привык так.
      Главное - что у него есть свой стайл. По сравнению с другими творениями этого раздела - это просто конфета, а не код
      Ответить
      • Ага, конфетка, только коричневая ) Одно только $objThis = $this чего стоит )
        Ответить
    • венгерская нотация это конечно неплохо,но в большом коде такие выебоны типа
      $objThis = $this;
      обернутся рано или поздно трудноотлаживаемым пиздецом
      Ответить
      • ну если все в одном стиле пишется и одним автором, то ниче не случится, по крайней мере, пока кто-либо другой не начнет писать просто $this ))
        но это уже вопрос соблюдения принятого стиля
        Ответить
        • ИМХО конечно очевидные вещи вроде счетчиков i,j и this глупо так писать, но, повторю все зависит от принятого на проекте код-стайла
          Ответить
    • По-моему, не шибко говнокодисто. То что он такие имена переменных накатал, и $ObjThis - это его стиль, правдо с таким стилем программирования в команде низя работать) сразу тапком по рукам, чтобы не писал так :)
      Ответить
    • нахрена нужна венгерская нотация в языке в котором всего пара типов - скаляр и хэш (или что там еще есть?)
      Ответить
      • наверно именно поэтому - из определения переменной неясно для чего она служит, для хранения строки, числа или чего еще
        Ответить
        • венгерская нотация хороша, когда нужно разграничить, например, переменные большой и малой "ёмкости" - bCounter (byte) & lCounter (long), но в пхп (да и прочих динамических языках) все числа хранятся в переменных одного и того же размера (т.е. нет градации на byte, int, long etc). По поводу строк - ну так давайте им осмысленные имена типа $from_field_value, вместо вырвиглазных $szFrom
          Ответить
          • Вам гетом пришел ID. Вам нужно перевести его в инт или вставить в формулу.

            Как тут без венгерки?
            $nId = $strId - 0; //php такой php
            $nFoo = $strFoo - 0;
            $nSize = $nFoo * SOME_CONST;
            
            //Если увидите в коде
            $strFoo * SOME_CONST ;// знайте: это -- ошибка.


            Это и есть "wrong code looks wrong"
            Ответить
            • $nId = $strId - 0; //php такой php это кстати нифига не пхп это яваскрпт без танцев глючит
              Ответить
      • паратипы - мне нравится термин
        Ответить
    • В мире без статической типизации венгерка (именно такая) это хорошо. Только ассоциативный массив должен иметь префикс "h" -- hash, так как массив и хеш это разные вещи (хотя в PHP об этом часто забывают).
      Во всех остальных случаях (кроме таких языков ;)) -- плохо.

      За объяснением смотреть весьма спорную, и местами откровенно лажевую, но все таки очень познавательную и интересную статью Спольски "let the wrong code look wrong".

      Смысл в том, что Вы можете случайно написать:
      $params[$index]
      //но вы никогда не напишите
      $hParams[$intIndex]
      //так как очевидно что это хеш и по индексу туда ходить не нужно.


      Только я считаю что префикс "obj" не нужен (по умолчанию можно считать объектом) и почему в конструкторе по хешу бродят без коснтант?
      Ответить
      • > так как очевидно что это хеш и по индексу туда ходить не нужно.
        да ну? для хешей (карт) индекс то же что и ключ, и он вполне может быть целочисленным, но не 0..n

        h - hash
        a - array (тот же хеш только ключи 0..n)
        o - object

        можно даже вроде
        lbl - обьект типа Label
        Ответить
        • >>да ну? для хешей (карт) индекс то же что и ключ, и он вполне может быть целочисленным, но не 0..n
          Тоесть $a['1'] есть, и $a[22] есть, а $[2] нету?
          Это крайне нездоровая ситуация, imho)

          Просто в PHP хеши и массивы выглядят одинаково, и это может привести к путанице (кстати, это одна из причин, почему php causes brain damage (c) -- люди и код начинают путать хеши и массивы): даже в перле они выглядят по разному.

          Что бы скомпенсировать эту ляпу языка и гоже юзать разные префиксы.
          Ответить
          • кстати да, ляпа действительно большая: за счет обьединения хешей и массивов в пхп получаем беспорядочный массив с черт знает какими индексами. Меня помнится долго клинило, в массиве $a=array('a','b') $a[1]='c' сделает нам массив из трех элементов или перезапишет второй?
            в таких случаях даже венгерская нотация не спасет
            Ответить
            • >>за счет обьединения хешей и массивов в пхп получаем
              >>беспорядочный массив с черт знает какими индексами. Меня
              >>помнится долго клинило, в массиве $a=array('a','b') $a[1]='c'
              >>сделает нам массив из трех элементов или перезапишет второй?

              О_о ... пхп такой пхп
              Ответить
            • Есть круче пример:
              $foo['name'] = 'a';
              $foo['lastName'] = 'b';
              $foo[] = 'c';
              $foo[1234] = 'd';


              что выведет print_r такого массива?
              Ответить
      • quote "В мире без статической типизации венгерка (именно такая) это хорошо. "

        входящие аргументы функции ты тоже по венгерской нотации обозначаешь? а если нам пофигу на тип, главное что бы квакало? ( duck typing - ну отзывалось на to_s например? )
        или функция способна принимать аргументы нескольких типов?

        будешь писать несколько функций? или динамически генерировать имена переменных?
        Ответить
        • Это редкий случай, тут я не буду применять венгерку.
          Ответить
          • А разве в проекте не должна быть принята единая нотация?
            Ответить
            • Должна быть, но низкоуровневые, утилитарные функции (а только такие функции могут не знать о типе своего аргумента) могут ее нарушать.

              Это хак, а хаки нужны только когда без них не обойтись.
              Ответить
              • Приведи пример ситуации, в которой без указания типа в имени обойтись невозможно
                Ответить
                • $id; //Какого типа эта переменная?
                  $user; //А эта?


                  Вас тоже сюда направляю: http://www.joelonsoftware.com/articles/Wrong.html
                  Ответить
                  • Зачем мне знать тип этих переменных? Для общего развития?
                    Ответить
                    • Что бы увидеть ошибку в коде:
                      printf($user); //это объект


                      Послушайте, я не хочу пересказывать Спольски) Почитайте его, правда. Он ответит на все вопросы
                      Ответить
                      • А я вот взял и прочитал. И вот какой пример приводит Спольски:

                        All strings that come from the user must be stored in variables (or database columns) with a name starting with the prefix "us" (for Unsafe String). All strings that have been HTML encoded or which came from a known-safe location must be stored in variables with a name starting with the prefix "s" (for Safe string).

                        Ни намека на тип. Дальше больше:

                        So in Systems Hungarian you got a lot of dwFoo meaning “double word foo,” and doggone it, the fact that a variable is a double word tells you darn near nothing useful at all.

                        Надеюсь, Спольски ответил на все вопросы? ;)
                        Ответить
                        • > So in Systems Hungarian you got a lot of dwFoo meaning “double word foo,” and doggone it, the fact that a variable is a double word tells you darn near nothing useful at all.

                          > Надеюсь, Спольски ответил на все вопросы?

                          Прозреваю, это он про языки со статической типизацией, типа си. Там можно в любом адекватном ИДЕ, наведя мышку, посмотреть что за тип. К пхп это неприменимо.
                          Ответить
                          • Первая цитата относиться к примеру на VB, так что это применимо ко всем языкам. Что касается IDE, то (тут ключевое слово адекватная) многие из них успешно подсвечивают тип, а также хорошо работают с phpdoc.
                            Ответить
                      • А вот еще золотые слова этого дядьки (которые нужно вырезать бритвой на жопах говнокодеров):

                        • Keep functions short.
                        • Declare your variables as close as possible to the place where you will use them.
                        • Don’t use macros to create your own personal programming language.
                        • Don’t use goto.
                        • Don’t put closing braces more than one screen away from the matching opening brace.
                        Ответить
                        • Про жопы очень в тему, учитывая, что Спольски гомопидор.
                          Ответить
                        • особенно вот эти 2 надо татуировать
                          1Don’t use macros to create your own personal programming language.
                          2Don’t use goto.

                          ЗЫ о УебКилл вернулся
                          прошу больше не разможатся делением пополам и ссорится как несинхронизированые треды)))
                          Ответить
                        • > Don’t use goto.
                          мля. даж выражаться не хочу, до меня все холивары были
                          Ответить
              • debug obj
                pp obj
                и прочие методы вывода все содержимого объекта
                Ответить
    • Венгерка, ИМХО, применяется обычно в двух случаях.

      1. При попытке сделать кривой код (такой как в сабже) более поддерживаемым. Например, автор обращается к
      $arrParameters как к массиву, хотя от того, что он имеет префикс, массивом может и не быть. К тому же эти
      элементы в массиве могут и не существовать. И зачем обходить массив два раза? В общем код потенциально
      бажный, и какую нотацию тут не используй лучше он не станет.

      2. При особой любви к статической типизации. Вот зачем пытаться эмулировать фичи своего любимого языка там,
      где их нет и они вообще не предусмотрены? Как вариант, нужно прекращать травмировать психику себе и
      окружающим и юзать наиболее подходящие языки: C#, Java...
      Ответить
      • >>Как вариант, нужно прекращать травмировать психику себе и
        окружающим и юзать наиболее подходящие языки: C#, Java...

        К сожалению это не всегда возможно.
        А приведите пример ситуации, когда венгерка мешает
        Ответить
        • есть в бестиповых языках такая нехорошая практика: перезаписывать переменную разными типами. Если мы ее хотим использовать, венгерка помешает
          опять же, случай с счетчиками и короткоживущими переменными: префикс только удлинит название, а смысловой нагрузки не несет
          Ответить
          • Все верно, могу еще добавить что практические недостатки этой нотации выявляются при работе с IDE.
            Венгерка не сравнима по удобству с документированием (phpdoc) и не должна заменять его. К тому же
            падает эффективность автокомплита.
            Ответить
          • > есть в бестиповых языках такая нехорошая практика: перезаписывать переменную разными типами. Если мы ее хотим использовать, венгерка помешает

            Хе-хе, это единственная отличительная фишка бестиповых языков, и люди, юзающие такие языки, пытаются эту фишку обойти как баг. Борьба с собственным инструментом это так весело
            Ответить
        • >>А приведите пример ситуации, когда венгерка мешает
          Самый очевидный пример: я читаю код, смотрю по очереди на переменные и пытаюсь понять, что они содержат. Вместо этой информации я получаю информацию о типе. Этот факт заметно снижает понятность кода
          Ответить
          • Кроме типа есть еще имя перемернной.

            Чем $strId хуже чем $id?
            Ответить
            • Тем, что первое, что мне необходимо знать о переменной - это её смысловое содержимое, а не тип
              Ответить
              • ))Вы предлагаете писать тип в конце?

                Почитайте Спольски, он сказал на эту тему больеш меня:
                http://www.joelonsoftware.com/articles/Wrong.html
                Ответить

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