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

    +154

    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
    $zak=$row['content']; 
        $ret=$ret.'<td>';  
        $p_ret=array();
      $t_zak=explode('{',$zak);
      $t_c=count($t_zak)-2;
    
      //------------------------------------------  
    
    for($t_i=0;$t_i<$t_c;$t_i++){
      $zak=$t_zak;
      $zak=explode('}',$zak[$t_i+2]);
      $zak=explode(';',$zak[0]);
      $p_zak=array();
      $c=(int)floor(count($zak)/2);
      $c=(int)($c*2);
      for($i=0;$i<$c;$i=$i+2){
        $temp=explode(':',$zak[$i]);
        $ind=str_replace('"','',$temp[count($temp)-1]);
        $temp=explode(':',$zak[$i+1]);
        $val=str_replace('"','',$temp[count($temp)-1]);
        $p_zak[$ind]=$val;
      }
      $p_zak['id']=(int)$p_zak['id'];
      //[count] => 3 [id] => 21 [name] => Стул [price] => 213454
      $p_ret[]='<a href="[[~'.$p_zak['id'].']]">'.$p_zak['name'].'</a> '.$p_zak['count'].' шт.';

    После модернизации одного из Интернет магазинов сломался личный кабинет ( MODX Revolution, Shopkeeper ).

    Начал изучать и понял, что прошлый программист изобрел заново unserialize.

    Запостил: Rostov114, 14 Июня 2013

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

    • Взрыв мозга, честно.
      Ответить
    • > Стул [price]
      Тут я полагаю, это медицинский термин, а не предмет мебели?
      Ответить
      • В данном случае, это тестовый "результат" работы кода.

        И к магазину ни какого отношения не имеет.
        Ответить
        • Я к тому, что это слово очень хорошо код характеризует :)
          Ответить
    • Господи, откуда только такие мудаки берутся.
      Ответить
      • Из злой.
        Автор кода просто альтернативно одарённый, не обязательно мудак. Одна основная претензия - кодингстиль "вырвиглазный трындец".
        Ответить
    • Поляна без побивки на семантические блоки, [случайная] табуляция двумя пробелами, египетские скобки, заки в именах переменных. Хочется взять и... переписать!
      Ответить
      • Согласен во всем кроме египетских скобок ;) Они имеют право на жизнь, в отличие от всего остального вышеперечисленного.

        P.S. Пробелов еще не хватает перед скобками и между for'ами и скобками:
        for($t_i=0;$t_i<$t_c;$t_i++){
        // vs
        for ($t_i = 0; $t_i < $t_c; $t_i++) {
        P.P.S. И подчеркивания между однобуквенными словами в t_i и t_c бесят ;)
        Ответить
      • Питух, египетские скобки - это удел ибранных, а не анскильных питухов типа тебя. 2 пробела - идеальная "табуляция" на вменяемом мониторе, а питухи с говном не нужны.


        Хочется взять и поржать над питухом.
        Ответить
        • Египетские скобки - питушня.
          Фараоны пишут с лисповыми скобками:
          int n, a[n]; //n - количество элементов
          void qs(int* s_arr, int first, int last) {
            int i = first, j = last, x = s_arr[(first + last) / 2]; 
            do   {
              while (s_arr[i] < x) {
                i++;}
              while (s_arr[j] > x) {
                j--;}
              if(i <= j)  {
                if (i < j) {
                  swap(s_arr[i], s_arr[j]);}
                i++;
                j--; }}
            while (i <= j);
            if (i < last) {
              qs(s_arr, i, last);  }
            if (first < j)  {
              qs(s_arr, first,j); }}
          Ответить
          • Лисповые скобки питушня, ибо некрасиво. Тогда уж пиши без переносов, аля while (s_arr[i] < x) { ++i(i++ пишут только анскильные питухи, которые не асилили семантику икремента);}


            А вообще и указатели не юзают только питухи. И не осилили нормально запятую тоже питхи. И питуш int* s_arr тоже питухи, ибо люди пишут int * s_arr, int *s_arr; на худой конец.


            Вобщем код питушня, ах да, а ещё обрамление скобками тела из одной строки - питушня.

            У меня такое чувство, что из вас, питухов, никто не осилил синтаксис и его семантику.
            Ответить
            • > Лисповые скобки питушня, ибо некрасиво.
              Зато пустых строк нету.

              > Тогда уж пиши без переносов
              Не, тут вся фишка в том, что заголовки и тела на разных строках. Если не смотреть на правый край, то код выглядит, как питоний. В этом есть своя красота.

              > А вообще и указатели не юзают только питухи.

              Скорее наоборот, указатели - это чисто сишная питушня. И они - главная проблема сишки по оптимизации.

              > а ещё обрамление скобками тела из одной строки - питушня.

              Это не питушня, это дальновидность.
              Ответить
              • >Зато пустых строк нету.
                Это строки не пустые - они делят блоки на подблоки.

                >Не, тут вся фишка в том, что заголовки и тела на разных строках. Если не смотреть на правый край, то код выглядит, как питоний. В этом есть своя красота.
                Для меня лисп и питон уродливая питушня.


                >Скорее наоборот, указатели - это чисто сишная питушня.
                Ок. Я гвоорю только о сишке.
                >И они - главная проблема сишки по оптимизации.
                Нет, не проблема. Просто подход у питух-оптимизаторов к питушне. Надо изначально всё затачивать над указатели, и писать так, чтобы не скрывать указатели в указателях за указателями под указателями.
                Ответить
                • Указатели - это питушня, потому что они указывают на ячейки памяти, а для перфоманса нужна не память, а регистры. Передача параметров в функцию по указателю - это питушня, передача по in-out, как в Фортране или Аде - это по-фараоновски, потому что это идеологически ближе к идее хранения их в регистрах.
                  Ответить
                  • Нет, указатели - это куча. У тебя нет регистров, чтобы хранить массивы на гигабайты. Поэтому указатель - это дамп регистра по адресу, а разименование - превращение указателя в регистр.


                    Если ты хочешь идти дальше - то это уже ммапирование на уровне процессора и ручной кеш.


                    ДА нет никаких параметров в функции - запомни это. есть инлайн и регистры. Передаются только указатели с тоннами данных.
                    Ответить
                    • > ДА нет никаких параметров в функции - запомни это. есть инлайн и регистры.

                      Правильно, но сишка не умеет передавать инты как inout, если я хочу написать функцию, которая будет менять инт, то я этот инт должен передавать ей по питухоуказателю, и после этого надеяться на милость компилятора.
                      Ответить
                      • Умеет. int inc(int a) { return ++a; } - вот так. Если надо больше одного, то питухоуказатели, но это тебе не паскаль - это гцц умеет. Даже структуры до 2-3елементов. Т.е. передавая указатель на структуру в 2-3 елемента - гцц передаёт её как поле==регистр( надесю теперь ты поймёшь, почему я не навижу питух abi, которое не даёт гцц возможно юзать поле==регистр для структур с более, чем 3-мя полями).

                        Можешь возвращать структуру - гцц вернёт из функции 2-3регистра.


                        Вобщем вся ваша С++ питушня не нужна, ибо конпелятор умеет всё это делать сам.
                        Ответить
                        • > Если надо больше одного, то питухоуказатели,

                          Вот-вот

                          > но это тебе не паскаль - это гцц умеет.

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

                          сравни:
                          void inc (int inout a) { ++a;}
                          как данные пришли в a, так они в том же a и вернутся, при этом чтобы сделать a синонимом какого-нибудь регистра, компилятору требуется намного меньше думать, чем для питухоуказателей.
                          Ответить
                          • Поэтому и нужен вменяемый конст и алиасы - плюс бинды, о которых я говорил в соседней теме.

                            void inc(int alias a) { ++a;}, либо void inc(int a) {++a;} bind(inc.a/inc::a, i); inc() - будет увеличивать i.


                            Поэтому в нормальных ЯП надо уходить от всяких-там автоматичесикх определялок и юзать inline void f();, а тупо void f(); и думать "а заинлайнит он или нет", так же для рекурсивных функций - юзать recusive или что-то типа этого.


                            В сишке над этим уже думают - всякие restrict и прочее.
                            Ответить
                            • > Поэтому и нужен вменяемый конст и алиасы - плюс бинды
                              имхо, эти твои алиасы и бинды не нужны, указатели тут даже реализуют идею более ясно - в первом случае звездочка вместо ключевого слова, во втором - не надо ничего отдельно биндить
                              Ответить
                              • Нет, указатель адрес - он не может работать для регистра, ибо у него нет адреса - это питушизм. Это работает только потому, что конпелятор это умеет. В реальном мире стек давно сдох.


                                Алиас явно и чётко показывает идею - входящий елемент - есть алиас исходящего, как ссылка в путих С++. А с указателем ты такую фигню не сделаешь - только указатель на указатель.


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


                                Поэтому алиасы и указатели совершенно разные вещи, а бинды и кастыли со структурами - тоже разные вещи, ибо кастыли со структурами - питушня.
                                Ответить
                                • ну я так и понял, что тебе машинные наносекунды дороже человекодней
                                  Ответить
                                  • Сейчас он правильные вещи говорит. Посмотри на Фортран и Аду, как там in-out параметры сделаны. На гейдеве была эпичная тема где-то, где за счёт этой фичи адский код скомпилировался оптимальнее крестового, найти уже не могу правда.
                                    И да, микрооптимизации хоть и грязная работа, но кто-то таки должен ими заниматься.
                                    Ответить
                                    • Ну оптимальней крестов можно собрать что угодно. Миф о перфомансе плюсов - это ещё со времён си с классами, ибо тогда кресты не отличались от сишки и собирались одним конпелятором. Люди продолжали писать на плюсах, но так же как на Си, только с классами.


                                      Сейчас плюсы неимеют никакого отношения к Сишке и тем плюсам, что были раньше, а мифы питушки до сих пор юзают. Да, относительно жабы у плюсов ещё есть перфоманс, ибо конпелятор намного сильнее жабаговна. Нет гц и всяких питушней и стл пишут сишники, а её оптимизации заложены в конпелятор.

                                      Т.е. конпелятор просто научили идеально понимать и оптимизировать стл-портянки, и то в давольно простых случаях.

                                      Реально слить плюсы может любой ЯП с нормальным кодогеной и идеологией запила близкой к железу.
                                      Ответить
                                    • > Посмотри на Фортран и Аду, как там in-out параметры сделаны. На гейдеве была эпичная тема
                                      > адский код скомпилировался оптимальнее крестового

                                      Зашли ссылку? Ада оптимальнее сишечки?
                                      Ответить
                                      • > Ада оптимальнее сишечки?
                                        Ну где-то в недрах ГК есть и тред, в котором прога на хаскеле порвала сишную по всем параметрам ;) Но это все-таки не от того, что хаскель оказался так крут, это просто сишный алгоритм был туповат...
                                        Ответить
                                  • Т.е. писать std::vector<int> vec; тебе не лень, ибо на сишке это пишется так: int * vec;


                                    Писать касты на 20строк, вместо кастой в систайле - тебе тоже не лень. Писать классы на сотни строк ради того, чтобы прибиндить к функциям пару параметров. Это всё дешевле человеческого времени, а вот:


                                    Писать inline, alias(оба слова пишутся за секунда) - это дорого. С учётом того, что нормальный человек пишет 400-500символов в минуту - это строк 50 в минуту - это 3к строк в час - это 10+к строк за смену. Но реально из анскильных питухов пишет за еду ну тысячу строк в день - это максимум и то это невероятно. Реально сотня-другаяа.

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

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


                                    Какие нахрен человекодни. 95% питухов бесполезны и я клал на их человекодни, ибо они бездарные рабы. Написание кода у нормального человека не ограничено производительностью его печати.
                                    Ответить
                                    • Слишком много внимания инлайну. Да, он может сократить время исполнения, так как нет лишнего вызова и лишнего питушения стека. Однако, радикальных изменений он не даёт.
                                      Ответить
                                      • Да что ты за глупое существо, какие нахрен изменения не даёт - даёт и дохрена каких. Я уже привёл 2-3портянки, где нормальный инлайн упращает код, а лиспговно привёл ещё одну.


                                        Для анскильных питухов инлайн - оптимизация, как для анскильных питухов оптимизация выражений - лишь оптимизация. Для пацанов - это кодогинератор, а для питухов - для питухов всё птихи, ибо они анскильны тотально.
                                        Ответить
                                    • > alias слово
                                      Можно поподробнее? Это не сишный стандарт, а гнутое расширение? Что делает?
                                      Ответить
                                      • Нет, это моя идея( авось уже была до меня). Чтобы избравится ото всей питушни - надо ввести слово alias. Неконстантные ссылки питушни, как в крестах, а нормально и почеловечески.

                                        void inc(int alias t) {
                                          ++t;
                                        }
                                        
                                        int i = 0;
                                        inc(i);//тут t в функции является алиасом i - т.е. указывает конпелятору, что это один объект, только у него разные имена.


                                        Это если не уходить от того, что аргумент в функции - копия. Можной уйти и ввести слово copy void f(int copy i) { ++i;} - эта функция не будет иметь смысла, а void f(int i) { ++i;} - тубет иметь смысл.

                                        И т.п.
                                        Ответить
                                        • > конпелятору
                                          Блин, походивши на говнокод, я уже начинаю сомневаться, что это не правильно. Скоро буду даже питушки писать вместо петушков.
                                          Ответить
                              • Звёздочка вместо ключевого слова это питушня, потому что у ней смысл другой.
                                Ответить
                                • Таки да, в Паскале тоже можно написать ^Integer вместо Integer, и это будет аналог звёздочки. Указатель ещё придётся разыменовывать.

                                  Сишники возмутятся, вспомнив, что у них есть амперсанд. Однако, это такой же синтаксический сахар, как слово var в Паскале: тоже передаётся указатель, только явно указывать разыменование его в теле функции не надо, поскольку компилятор это сделает за программиста.

                                  Итого: передачи по значению в обратную сторону ни в Си, ни в Паскале нет.
                                  Ответить
                                  • > Итого: передачи по значению в обратную сторону ни в Си, ни в Паскале нет.

                                    Ну в сишке структура в ретурне может оптимизнуться в нечто подобное. А вот в паскале насколько помню запись вернуть нельзя.
                                    Ответить
                                    • В ТП функции могут возвращать только скалярные значения; сложные типы приходится забирать через var. В Дельфи функция может возвращать что угодно: хоть запись, хоть массив, хоть объекты. Причём в Дельфи сделали хитро: там память под результат выделяет вызывающий код и передаёт указатель на место под результат в функцию как скрытый параметр.

                                      В ISO 7185 ограничений на типы возвращаемых значений я не нашёл.
                                      Ответить
                                  • > как слово var в Паскале: тоже передаётся указатель

                                    Это уже особенность реализации. А кто берёт указатели на var-параметры, тот сам себе виноват.
                                    Ответить
                                • показать все, что скрытода, нет, питушня ты баттхертящий паскаледебил
                                  Ответить
        • > 2 пробела - идеальная "табуляция" на вменяемом мониторе
          вот здесь даже соглашусь.
          Ответить

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