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

    +155

    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
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    <?php
    
    /**
     * Get category tree.
     * 
     * @param db $db
     * @return array
     */
    function getCategoryTree ($db) {
    	$query = $db->query('SELECT * FROM dle_category ORDER BY posi');
    	
    	if ($query->num_rows <= 0) {
    		return FALSE;
    	}
    	
    	$categories = $query->fetch_all(MYSQLI_ASSOC);
    	
    	$tree = array();
    	
    	foreach ($categories as $cat) {
    		if ($cat['parentid'] == '0') {
    			$tree[$cat['id']] = $cat;
    		}
    		else {
    			$tree[$cat['parentid']]['subcategories'][] = $cat;
    		}
    	}
    	
    	return $tree;
    }
    
    /**
     * Display categories.
     * Sorry for my french 'echo'.
     * 
     * @param array $category
     */
    function displayCategory ($category) {
    	$html = '';
    	
    	foreach ($category as $cat) {
    		$html .= '<li class="lonely "><a href="/">' . $cat['name'] . '</a>';
    		
    		if ($cat['subcategories']) {
    			$html .= '<span class="accordion"></span><ul>';
    			$html .= displayCategory ($cat['subcategories']);
    			$html .= '</ul>';
    		}
    		
    		$html .= '</li>';
    	}
    	
    	return $html;
    }
    
    // Getting categories
    $categories = getCategoryTree($db);
    
    if ($categories) {
    	echo displayCategory ($categories);
    }
    else {
    	echo '<li>Нету категорий</li>';
    }

    Мой говно модуль для DLE для отображения дерева категорий в меню.
    Почему DLE разработчики не могли это из коробки сделать? И почему там куча говнокода внутри? (на Англ. комментарии потому что привык)

    Запостил: volter9, 17 Сентября 2014

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

    • К стати, вывод дерева только на один уровень т.к. заказчику больше не надо.
      Ответить
    • Комменты для докси в 4 и 33 строках просто эссенция краткости и капитанства...

      P.S. 33 и 38 строки не согласованы.
      Ответить
      • А, понял о чем речь - display subcategories from specified category.
        Ответить
      • Это я сначала написал через echo, потом подумал что говнокод. Переписал, а переименовать забыл. А комментарии, так, на всякий случай. В итоге говнокод.
        Ответить
    • > Нету категорий
      > Нету
      > у

      Да тут говно не только в коде!
      Ответить
      • может хохол писал?
        Ответить
        • А что у вас против хохолов и слова "нету"?
          Ответить
          • Мне монописенуарно на хохлов и их мову
            Ответить
            • > монописенуарно
              Монопенисуально же ;)

              Писе нуар это что-то из другой области...
              Ответить
              • я шел по темным улицам Киева. Холодный ветер бил мне в лицо. Улицы - лишь продолжение сточных канав.
                Ответить
                • Чувствуется влияние бредогенератора. Чем больше ему сопротивляешься, тем больше он захватывает разум.
                  Ответить
                  • я то не прикасался к бредогенератору
                    Ответить
                    • Значит заразился воздушно-капельным путём.
                      Ответить
                      • оу щщщит, прикоснулся....

                        Во всякой книге предисловие есть первая и даже журналов к буквальному значению слов. Иные ужасно обиделись, вместе с тем последняя вещь; оно или служит объяснением цели сочинения,. Во всякой книге предисловие есть первая и до нравственной цели сочинения, или служит объяснением. Во всякой книге предисловие есть первая и уродливыми, отчего же вы верили возможности существования всех трагических потому они не может иметь места; что ежели любовались вымыслами гораздо более острое, почти невидимое даже журналов к враждебным дворам, остался бы уверен, человек.
                        Ответить
                        • Надо было покормить его текстом подлиннее, а то вон как стонет от голода и заговаривается.
                          Ответить
                          • первый блин комом

                            Подъехав к подошве Койшаурской горы, мы продолжали молча отвечал мне опять скажете, что каждый из маленькой кабардинской трубочки, обделанной в серебро. Боже его избави от этого не бывало, несмотря на перекладных из черного, полного мглою ущелья, тянется серебряною нитью и уродливыми, отчего же вы любовались вымыслами гораздо более острое, почти невидимое понимает басни, если в гору,. Большая часть из волшебных сказок у вас пощады?
                            Ответить
                          • суки, теперь я сижу генерю тексты и хихикаю. весь день псу под хвост
                            Ответить
                            • день свой ты сделал .
                              Ответить
                              • Если б я сделал день, это был бы номер.
                                Если б день сделал меня, я б наверно помер.
                                Ответить
                                • Если бы я сделал какой багор, это был бы номер.
                                  Если бы багор сделал меня, я б наврено помер.
                                  Ответить
                                  • Если б был багор на мне - вот бы был бы номер!
                                    Если б я был на багре - я б наверно помер
                                    Ответить
                • > я шел по темным улицам Киева.

                  Но не обычной грязью пахли канавы. Нет, не той грязью, что поглощала средневековый Лондон. От канав веяло радиоактивным илом Киевского водохранилища. В воздухе ощущалось напряжение.
                  Ответить
              • Фабрики рабочим, землю крестьянам, писе нуар.
                Ответить
                • Абстрактные фабрики фабрик
                  Ответить
                  • да у вас оопоз. 3 кубика хаски внутривенно
                    Ответить
                    • Ты так говоришь, как-будто в хаскеле нельзя замутить фабрики фабрик.
                      Ответить
                      • нельзя. Классов то нет. В ООП смысле
                        Ответить
                        • Похапэ программисты могут писать похапэ и не другом языке, что же тут мешает?
                          Ответить
                      • Тишина... Я прям чувствую как ты пишешь фабрику фабрик на хаскелле
                        Ответить
                        • Угощайся: http://ideone.com/U3uPy3
                          Ответить
                          • Если я не сошел с ума (а у меня есть справка) паттерны нужны что бы делать жизнь проще. Что то я тут не заметил этого.

                            А так - идеальный код на стенд - "Сбежал программист java. Пытается кодить на хаскелле вот так. при обнаружении кинуть ему под ноги андроид и вызвать милицию"
                            Ответить
                            • > делать жизнь проще
                              Судя по паттернам, это как понижение трудоёмкости алгоритма.
                              Без паттерна - С1*N^2, с паттерном - С2*N*log(N), но только бывает, что C2 >> C1.
                              Ответить
                              • нельзя понизить сложность исполнения не меняя алгоритма. Не пугай меня псевдоформулами

                                Паттерны не понижают трудоемкость, паттерны - эбаут упрощение структуры и гибкость изменений
                                Ответить
                                • Это ж, аналогия, господин программист.
                                  А упомянутая трудоёмкость проявляется в написании/поддержке/изменениях кода.

                                  Скажем, без паттерна придётся добавлять новый тип фабрики за O(числа классов), а с паттерном - за O(1). Но для использования паттерна придётся написать ещё 6.66 своих классов.
                                  Ответить
                                  • >>А упомянутая трудоёмкость проявляется в написании/поддержке/изменениях кода.

                                    У нах ты тогда пишешь эти псевдоформулы?

                                    [минутка ненависти]
                                    Паттерны - вообще еще то говно. Набор велосипедиков. Учить надо не юзать паттерны, а создавать свою архитектуру. Ибо если человек понимает как построить хорошую архитектру - ему не нужна эта херня, а если не умеет - один фиг не поможет
                                    [/минутка]
                                    Ответить
                                    • > Паттерны - вообще еще то говно.

                                      Напомнило
                                      http://govnokod.ru/15505#comment221515
                                      Ответить
                                    • > нах ты тогда пишешь эти псевдоформулы
                                      Для примера. Мне привычнее познавать мир на примерах и аналогиях, что я подсознательно переношу на других.

                                      > Набор велосипедиков.
                                      В http://habrahabr.ru/post/170125/ есть несколько слов в защиту паттернов.
                                      Кратко: программист A использовал паттерн X, программист B посмотрел и сказал "О, это же X,
                                      мне всё ясно". Понимание.

                                      Кстати, паттерн может и трудоёмкость поменять..
                                      // Модный высокоуровневый ООПаттерн:
                                      foreach(x in executors) {
                                        try {
                                          x.exec(task);
                                          break;
                                        } catch(*) {}
                                      }
                                      
                                      // Быстрее только у Царя:
                                      if(task.type >= 0 || task.type < executors.length)
                                        executors[task.type](task);
                                      Ответить
                                      • >>программист A использовал паттерн X, программист B посмотрел и сказал "О, это же X, мне всё ясно".

                                        Ага, краткий обмен информацией. в целом годно. Но все равно лучше один раз схему увидеть.

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

                                          Эту хрень мы поняли еще на групповой практике... Курсы до нас пытались делать всё в одном экзешнике, и в последний день люто, бешено, страдали совмещая куски кода. А мы поступили проще - раз у нас 5 групп разрабов , значит пусть будет 5 независимых экзешек, общающихся между собой по жестко зафиксированным протоколам через TCP, СУБД и общие папки. Но как было сложно пропихнуть такую архитектуру закостенелой преподше... Ей то хотелось один экзешник, по традиции.
                                          Ответить
                                          • Ну да, можно творить садом и гоморру в своем блоке если нет побочных эффектов. Плюс тестировать проще

                                            Грань - это задача архитекторов. У хорошего архитектора и связанность низкая и зацепление высокое

                                            Ответить
                                            • > Ну да, можно творить садом и гоморру в своем блоке если нет побочных эффектов.
                                              Ага :) Главное, чтобы говно не переполнило модуль и не полилось через интерфейсы в соседние...

                                              Пример из практики: надо было из астериска передать номер телефона по HTTP. urlencode нету. Ну я и написал тупо ...&exten=${EXTEN}. Тем самым я испортил интерфейс, и поплатился за это - на HTTP серваке пришлось заменять пробел на плюсик.
                                              Ответить
                                              • ох уж эти устные форматы текста
                                                Ответить
                                                • Ещё и устное программирование.
                                                  "Процессор, быстро заменять пробел на плюсик, а то щас как выключу"
                                                  Ответить
                                                  • где то я это уже видел

                                                    http://www.youtube.com/watch?v=RHaIjAk0X7Y
                                                    Ответить
                            • Это очень неправильное понимание того, что такое pattern. В русском переводе используется, как правило, слово "шаблон", но это не правильно. Pattern значит не шаблон (в смысле трафарет, или матрица, применяя которую можно получить повторяющийся орнамент / текст и т.п.), а именно повторяющийся элемент. Например, speech pattern - это фигура речи, которая повторяется, decorative pattern - это узро / орнамент, который повторяется.
                              Pattern'ы надо избегать, а не использовать. Т.е. видя pattern нужно использовать какую-то технику, которая заменит повторяющийся код одной конструкцией.
                              Ответить
                    • Есть, например, фабрика фабрик, которая создает исключительно такие фабрики, которые не могут создавать объекты своего класса. Может ли такая фабрика создавать объект своего класса?
                      Ответить
                      • Какая прелесть, кое кто дорос до парадокса Рассела
                        Ответить
                        • А где парадокс?

                          (1) ФФ ---> Ф1, (2) для всех Ф1 ---> О != Ф1

                          Если создаёт, ФФ ---> ФФ => ФФ ---> О != ФФ, правило 2 нарушается
                          Если не создаёт, ФФ --X> ФФ => ФФ ---> О != ФФ, правило 2 не нарушается

                          Значит создавать не может. Парадокса вроде бы нет, но если "исключительно" заменить на "все возможные", парадокс точно будет.
                          Ответить
                          • не будь занудой
                            Ответить
                            • И я зануда? Я пытался ответить на вопрос, как на интересную задачку, тут математик Кегдан такой выходит и говорит, что это парадокс Рассела, мол всё уже доказано до нас, уходите детишки спать, это место только для математиков, мне аж гуглить пришлось, что за парадокс такой. Жуть.
                              Ответить
                              • не будь занудой

                                CCCCombo!
                                Ответить
                                • Давайте пойдём логическим путём.

                                  Откроем викисловарь и посмотрим определение слова "зануда".
                                  Зануда - надоедливый человек, тот, чьи действия вызывают тоску и раздражение.
                                  Рассмотрим мои комментарии. Они полны радости, надежды и стремления к светлому будущему. Как они могут вызывать тоску?

                                  Откроем Википедию и посмотрим, что там написано про тоску:
                                  Тоска́ — отрицательно окрашенная эмоция, тяжёлое, гнетущее чувство[2]. Близкими чувствами являются грусть, уныние, тревога[2][3].
                                  Как же полные радости комментарии могут вызывать отрицательно окрашенные эмоции?

                                  Тоска отличается выраженным снижением настроения и ухудшением общего самочувствия.
                                  То есть Вы, милейший, обвиняете меня практически в отравлении посетителей ГК своей мелкой твёрдой психозой? Но ведь это абсурд!

                                  Пойдём далее, чьи действия вызывают тоску и раздражение. Как мои, направленные на мир во всём мире действия, могут вызывать чьё-то раздражение?

                                  Нет, сэр, я не зануда.
                                  Ответить
                          • Нормально все с "исключительно". Если она создавать не может - то может, т.к. она удовлетворяет правилу, т.е ее можно создавать... Если может - то не может... и так по кругу.
                            Ответить
                            • "исключительно" запрещает ей создавать фабрики, которые могут создать объекты своего класса. Но оно не вынуждает ее создавать все возможные фабрики, которые, не могут создавать объекты своего класса. В том числе это правило не вынуждает ее создавать экземпляры себя. Поэтому противоречий нет. И ответ - "нет, не может".
                              Ответить
                            • Если она может создать, то не может из-за противоречия - это для меня ясно. Следовательно, остаётся либо "не может", либо "парадокс".

                              > Если она создавать не может - то может, т.к. она удовлетворяет правилу
                              А это откуда следует?
                              Фабрика не создаёт экземпляры своего класса, но при этом создает исключительно такие фабрики, которые не могут создавать объекты своего класса. При этом связь развязывается. Условия, действующие на фабрики, создаваемые фабрикой фабрик могут быть уже любыми и не описывают фабрику фабрик.

                              P.S. противоречия, противореции...
                              Ответить
                              • // Фабрика
                                class Factory
                                {
                                public function getInstance($class)
                                {
                                return new $class;
                                }
                                }

                                // Фабрика которая не может создавать объекты своего класса
                                class ExclusiveFactory extends Factory
                                {
                                public function getInstance($class)
                                {
                                if (is_a($class, static::class, true)) {
                                throw new Exception('Не могу создавать объект своего класса');
                                }

                                return parent::getInstance($class);
                                }
                                }

                                // Невозможная фабрика
                                class ImpossibleFactory extends Factory // или ExclusiveFactory?
                                {
                                public function getInstance($class)
                                {
                                // Все ок, но тогда я могу сам себя создавать, а это противоречие!
                                // Типо я должен тогда быть ExclusiveFactory

                                // ок если я ExclusiveFactory - то условие пройдет и я создам объект сво
                                его класса - противоречие

                                if (!is_a($class, 'ExclusiveFactory', true)) {
                                throw new Exception('Могу создавать только фабрики не могущие создать объект своего класса');
                                }

                                return parent::getInstance($class);
                                }
                                }
                                Ответить
                                • Мда. Комменты - говно. Сорри.

                                  Короче, если наследуем просто Factory

                                  (new ImpossibleFactory)->getInstance('ImpossibleFactory');

                                  Будет ексепшн:
                                  Могу создавать только фабрики не могущие создать объект своего класса

                                  Так блин, ну? Не смогли же создать объект своего класса? Так какого фига?

                                  Или если делаем ее ExclusiveFactory
                                  тот же
                                  (new ImpossibleFactory)->getInstance('ImpossibleFactory');

                                  Выдаст второй ексепшн:
                                  Не могу создавать объект своего класса

                                  Хм... не можешь - ну ок, так тогда типо должна же была создать.
                                  Ответить
                                  • Да нету там противоречий, нету...

                                    ФФ может создать объект своего класса? Нет. Значит среди того, что она может создать её самой нет и быть не может. Зато она может запиливать другие фабрики, которые не могут запилить себя. ВСЕ такие фабрики она запиливать не обязана по условию. Противоречия нет.

                                    Вот если ты исправишь условие на "ФФ может создавать экземпляр ЛЮБОЙ фабрики, которая не может запилить оьъект своего класса" - будет противоречие.
                                    Ответить
                                    • В принципе, сдаюсь. "Исключительно" никак на саму нее не влияет - она может и другое че-то не создавать по каким-то прчинам. Да, "исключительно" ее не ограничивает.

                                      А если потребовать "любую" - то, кажись, все таки будет противоречие.
                                      Ответить
                                  • > Мда. Комменты - говно. Сорри.
                                    Попробуйте [code]ваш код[/code]

                                    Предварительный диагноз - использование дополнительного условия, в первом комментарии не озвученного (вот и Борманд про условие говорит):

                                    Единственному деревенскому брадобрею приказали: «Брить всякого, кто сам не бреется, и не брить того, кто сам бреется». Кто побреет брадобрея?
                                    ↓ ↓ ↓
                                    Единственная фабрика фабрик запрограммирована, чтобы: «Создавать все фабрики, которые не могут создавать объекты своего класса, и не создавать фабрики, которые могут создавать объекты своего класса». Кто создаст фабрику фабрик?
                                    (вроде бы при такой формулировке парадокс будет)

                                    А я пока беру таймаут на сон и раздумья над кодом.
                                    Ответить
                                    • А я пойду Нулизу досматривать... Надоело спорить.
                                      Ответить
                                      • Слава атаку! Анимэшникам слава! Кто не смотрит - не задрот

                                        Пойду смотреть доктора. Первого. В оригинале. Блин, я тоже задрот.
                                        Ответить
                                        • Да какой я анимешник...

                                          Дакимакуры с Аской нету, мульты смотрю относительно редко, в тусовке не участвую...
                                          Ответить
                                          • у меня тоже нет звуковой отвертки, сериал смотрю наскоками и других хувиантов не видел ирл. но тем не менее
                                            Ответить

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