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

    +162

    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
    private function _moveIndexes($filters,$int){
    		$count = count($filters);
    		for($i=2;$i<$count;$i++ ){
    			$filters[$i]["filter"]["index"] += $int;
    		}
    		return $filters;
    	}
    
    	private function _removeDefaultFilters(){
    		$this->data["Data"]["filters"] = $this->_moveIndexes($this->data["Data"]["filters"],-2);
    
    		$count = count($this->data["Data"]["filters"]);
    		for($i=0;$i<$count-2;$i++){
    			$this->data["Data"]["filters"][$i] = $this->data["Data"]["filters"][$i+2];
    		}
    		array_pop($this->data["Data"]["filters"]);
    		array_pop($this->data["Data"]["filters"]);
    	}

    Такой вот код... Ни строчки пояснений к нему не прилагается.
    Метод "_removeDefaultFilters()", а в коде сплошная магия.

    Почему в for() $count-2??? А внутри цикла [$i+2]...
    В другом же for() $i=2???
    В вызове _moveIndexes() второй параметр -2 (минус 2) и это значение внутри фнкции плюсуется!
    Вдовершение всего двойной вызов array_pop()...
    И всё это покрыто тайной мрака.

    Запостил: zabuhailo, 08 Июля 2011

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

    • Да, так говнокод и пишется. Ой, с count-1 ошибка вылезает! Поставим count-2. Хм, теперь в другом месте не сходится - поставим $i+2. Хм, теперь в конце не то остается, поставим array_pop. Нет, лучше два.
      Ответить
      • черная магия без её разоблачения
        Ответить
      • А все от лени вывести отладочную инфу и прочитать описание функций.
        Ответить
    • $this->data["Data"]["filters"] — список фильтров. Первые 2 — фильтры «по умолчанию». В _removeDefaultFilters они удаляются. Для этого массив сдвигается на -2, два последних элемента удаляются. $this->data["Data"]["filters"][$i]["filter"]["index"] — индекс фильтра в этом массиве, должен быть равен $i, это корректируется в _moveIndexes.

      Всё очевидно и ясно. Не так ли?
      Ответить
      • ага, очевидно. Очевидно будет весело, если несколько раз вызвать
        Ответить
        • «А вы так не делайте».
          Ответить
          • /** НЕ вызывать больше одного раза */
            private function _removeDefaultFilters(){
            Ответить
            • Э-э-э, нет, комментарии нарушат первозданную чистоту кода.

              На самом деле приватность метода даёт шанс надеяться, что эта гарантия обеспечивается по месту вызова и извне не всё так страшно. Но небольшой.
              Ответить
      • Оно конечно... но это ведь и есть говнокод. Это говнокод проектного уровня.
        >> Первые 2 — фильтры «по умолчанию».
        Это вот оно и есть. Сегодня их два, завтра один - залезай поколено в код и правь руками...
        Опять же, на чём основано соглашение о "первых"... тоже сильно пахнет.
        Ещё. Конкретное значение индексов не должно никого волновать, важно их отношение между собой.
        Код не очевиден. К тому же избыточен (и тратит машинный ресурс за зря)

        Ах, да... модификатор private это я дописал, собственно код опирался на соглашение что имена методов начинающиеся с '_' указывают на приватность метода. Тем не менее в проекте часто такие имена вызываются извне.

        За такой код нужно увольнять с требованием вернуть все зарплатные выплаты. (Это я ещё и под эффектом от остального кода проекта) :-)
        Ответить
        • Вопрос был саркастический.

          Код-то как бы может и работающий (в определённых условиях), и логика какая-то есть, но писан марсианами. Вызывает улыбку, пока не приходится с ним работать. Нам смешно, а вам сочувствую.
          Ответить
          • Спасибо за сочувствие. :-)
            Полагаю и вы тут не случайно оказались... )
            Ответить

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