1. JavaScript / Говнокод #5127

    +163

    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
    ....
    this.add_var = function(code){
      if(!this.undef.oneOf(code[1])){
        vName = code[1];
        if(this.isName(vName)){
          if(this.type[vName] == undefined){
            this.type[vName] = 'var';
            if(code[2] == '='){
              if(!this.undef.oneOf(code[3])){
                if(this.isNumber(code[3])){
                  value = parseFloat(code[3]);
                  this.vars[vName] = value;
                  return value;
                }else if(this.isName(code[3])){
                  if(this.vars[code[3]] != undefined){
                    value = this.vars[code[3]];
                    this.vars[vName] = value;
                    return value;
                  }else{
                    return 'Error:variable ' + code[3] + ' undefined.'
                  }
                }else{
                  return 'Error:value must be variable or number'
                }
              }else{
                return 'Error:you not type var value.'
              }
            }else{
              return 'nil';
            }
          }else{
            return 'Error:variable already defined.';
          }
        }else{
          return 'Error: in variable name.'
        }
      }else{
        return 'Error: you not type var name.'
      }
    }
    ....

    Часть исходника интерпретатора функционального ЯПа добавляющая переменные в контекст.
    Представляет собой каскад всевозможных проверок.

    Запостил: art543484, 01 Января 2011

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

    • Ну ты попал дrужок! Затrоллю!
      Ответить
    • очаровательно, возвращать и значение, и сообщение об ошибке. Успешного тестирования!
      я уж не говорю о циклической сложности кода
      Ответить
      • Дело в том что возвращаемые значения передаются в стек а после выполнения каждой команды в эмулятор консоли, таким образом сообщение об ошибке будет показано или же будет показано значение числа
        Ответить
        • ну так не зря же отделяли stdout от stderr
          Ответить
          • А вы подали отличную идею, да и исправлять мало придется
            Но вот есть вопрос, где тут циклическая сложность кода?
            Ответить
            • > А вы подали отличную идею, да и исправлять мало придется
              тем более, что обычно и stdout и stderr выводятся в ту же консоль - если иное не указано явно
              > Но вот есть вопрос, где тут циклическая сложность кода?
              проанализируйте метрику кода и вам покажут. Может, я термин не совсем тот употребил, но куча вложенных ифов однозначно показатель, что код срочно нуждается в рефакторинге
              Ответить
              • Учитывая количество вложенных условий я сам все понимаю.
                И единственное что я с моими малыми знаниями сумею сделать тут так это поставить рядом сообщения об ошибке и действия если бы не было ошибки.
                А что вы предлагаете изменить.
                Ответить
                • Исключения нужно использовать и код станет красивше.
                  Ответить
                  • Если вы не читали то это исключения рантайма другого яп
                    Да и вобще мне надо почитать блог про ревизию кода на хабре
                    Ответить
                    • ХАБРАБЫДЛО В ТРЕДЕ ВСЕ В МАШИНУ!
                      Ответить
                      • Я даже там не зарегестрирован, я просто читатель, надеюсь пока что.

                        Но благодаря именно хабру я сча понял как улучшить код
                        Ответить
                        • > Но благодаря именно хабру я сча понял как улучшить код
                          после иисуса у меня рассосалось! аминь!
                          Ответить
                          • У тебя сам иисус отсосал? Дай хуец лизнуть...
                            Ответить
                      • Говнокодач зашкворен! Валим отсюда паrни!
                        Ответить
                • ну хотя бы сообщение не возвращайте, а вызывайте функцию, которая напечаетет сообщение в консоль, а вернет какое нить дефолтное значение - 0, null или ""
                  а как от ифов избавиться, тут уже надо вникнуть, что делает данный кусок и чуть поменять алгоритм. Чаще всего помогает обращение логики.
                  Например, вместо
                  if (a) {
                   if (b) {
                    return 1;
                   }
                  }
                  return 0;

                  можно написать
                  if (!a) return 0;
                  if (!b) return 0;
                  return 1;

                  а если условия совсем простые, то и даже
                  if (!a||!b) return 0;
                  return 1;

                  для данного примитивного кода вообще все свертывается в
                  return(a&&b)?1:0;


                  идея, надеюсь, понятна. Но все же, почитайте на досуге книжки про хороший код и best practices, благо торренты все еще живы
                  Ответить
                  • я не использую такие вещи как несколько return так как это как я считаю не очень хорошая практика
                    но вот сейчас мне пришла идея о вот такой замене
                    if(a){
                    if(b){
                    Действие
                    }else{
                    //Выплевываение ошибки
                    }
                    }else{
                    //Выплевываение ошибки
                    }


                    на

                    if(a){
                    next = true;}else{
                    //ВЫплевывание ошибки
                    next =  false;}
                    if(b && next){
                    
                    }else{
                    
                    }
                    Ответить
                    • тоже подход, но мне как то ретурны больше нравятся.
                      а такой флаг как-то настораживает немного.

                      интересно, что скажут остальные жители говнокода?
                      Ответить
                      • БЕСПРОСВЕТНОЕ ГОВНО
                        Ответить
                      • Дело в том что подход с ретурнами не сработает в C или я просто туплю. и по этому я предпочитаю использовать более универсальные методы
                        Сейчас я знаю точто что запостив этот код я планировал получить кучу замечаний и ноль советов но я ошибался, и сейчас уже переписываю часть кода
                        Ответить
                        • почему не сработает? оно сработает везде, даже в бейсике
                          Ответить
                          • Значит вероятно я туплю
                            Но вот только каждый ретурн это отсылка значания в стэк и он будет засоряться это конечно не приведет к переполнению но все равно не чисто получится.
                            Может в интерпретируемых языках выполнение функции прекратиться после 1 ретурна но вот в C врятле существует такой хороший оптимизирующий компилятор
                            Ответить
                            • ага, пора прогуляться, подышать свежим воздухом. выпить пива, может даже навестить соседку сверху :)
                              Ответить
                              • > сверху
                                страпон?
                                Ответить
                                • вы уже к ней заходили? сочувствую, вы наверное ошиблись дверью
                                  Ответить
                              • а эт вы мне говорите или сами с собой но при этом отписываетесь?
                                Ответить
                                • вам )
                                  что бы не тупить советую менять иногда деятельность )
                                  Ответить
                                  • вынужден вас огорчить, мне 14, мне свойствено тупить
                                    Ответить
                                    • меня возраст не огорчает.
                                      Все равно - надо и кропотливо учиться, и так же отдыхать хорошо. И все будет ок
                                      Ответить
                                    • лоли! покажи ягодицы!
                                      Ответить
                              • Это та жыруха в рваных панталонах?! Помню как вы с ней... Ух... Зажигали!
                                Ответить
                            • Пиздец, даже я так толсто не троллил Си.
                              Ответить
                      • >что скажут остальные жители говнокода?
                        Просто пошлют в далёкую секретную клоаку всех и вся.
                        Ответить
    • Неплохой тролинг нелюбителей исключений.
      Но я в таких случаях готаю.
      Ответить
    • Чё вы меня минусуете?
      Ответить
    • Алилуя это случилось я сделал 'нормальный' код
      this.add_var = function(code){
        next = true;
        if(!this.undef.oneOf(code[1])){
         vName = code[1];}else{next=false;
        error('you not type var name.');}
        if(!this.isName(vName) && next){next=false;
          error('in variable name.')}
        if(this.type[vName] == undefined && next){
           this.type[vName] = 'var';}else{next = false;
           error('variable already defined.');}
        if(code[2] != '='){next=false;
          return 'nil';}
        if(this.undef.oneOf(code[3])){next=false;
          error('you not type var value.');}
        
        if(this.isNumber(code[3])){
          value = parseFloat(code[3]);
          next = false;}
        if(this.isName(code[3])){
          next = false;
          if(this.vars[code[3]] != undefined){
            value = this.vars[code[3]];
          }else{
            error('variable ' + code[3] + ' undefined.')
          }
         }
        if(next){
          error('value must be variable or number')
        }else{
          this.vars[vName] = value;
          return value;  
        }
        
      }
      Ответить
      • уже лучше :)
        Ответить
        • но до идеала далековато,
          исходя из опыта могу предположить что еще парочка часов и весь код будет в элегантных решениях
          Ответить
        • Самое лучшее решение
          this.add_var = function(code){while(true){
              if(this.undef.oneOf(code[1])){this.error('you not type var name.');break}
            vName = code[1];
              if(!this.isName(vName)){error('in variable name.');break;}
              if(this.type[vName] != undefined){this.error('variable already defined.');break}
            this.type[vName] = 'var';
              if(code[2] != '='){return 'nil';break;}
            if(this.undef.oneOf(code[3])){this.error('you not type var value.');break;}
            
            if(this.isAtom(code[3])){
              val = this.valueOfAtom(code[3])
              this.vars[vName] = val;
              return val;}
          }}
          Ответить
      • Где тут нормальный кот?

        Лишь убогая крыса.
        Ответить
    • ненавижу каскады
      jetbrains, срочно озаботьтесь джаваскриптерами, им тоже бывает тяжело
      Ответить

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