"PHP" / Говнокод #3642 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 doroshenkoes, (Updated )

Комментарии (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 например? )
      или функция способна принимать аргументы нескольких типов?

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

            Это хак, а хаки нужны только когда без них не обойтись.
            Ответить
            • Приведи пример ситуации, в которой без указания типа в имени обойтись невозможно
              Ответить
                  • Что бы увидеть ошибку в коде:
                    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) и не должна заменять его. К тому же
          падает эффективность автокомплита.
          Ответить
        • > есть в бестиповых языках такая нехорошая практика: перезаписывать переменную разными типами. Если мы ее хотим использовать, венгерка помешает

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

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8