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

    +165

    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
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    function get_sel_values(index){
                    var test = eval('typeof opt_val'+index);
                    if ( test != 'undefined' ){
                      eval('var sel_values = opt_val'+index);
                      return sel_values;
                    }
        else { return false; }
    }
    //**************************************************************
    function get_sel_text(index){
                    var test = eval('typeof opt_text'+index); 
                    if ( test != 'undefined' ){
                      eval('var sel_text = opt_text'+index);
                      return sel_text;
                    }
        else { return false; }              
    }
    //**************************************************************
    function show_select(index, lev, dv){
        if ( dv == 'jdc1'){ var tr = "jdc2";}
        if ( dv == 'jdc2'){ var tr = "jdc3";}
        if ( dv == 'jdc3'){ var tr = "jdc4";}
        var curr_sel_text = get_sel_text(index);
        var curr_sel_value = get_sel_values(index);
                    if ( curr_sel_value != false && curr_sel_text != false ){
          if ( dv == 'jdc1'){
            document.getElementById('jdc1').style.visibility = "visible";
            document.getElementById('jdc2').style.visibility = "hidden";
            document.getElementById('jdc3').style.visibility = "hidden";
            document.getElementById('jdc4').style.visibility = "hidden";
                              document.forms["form1"].elements['cc2'].length = 0;
                              document.forms["form1"].elements['cc3'].length = 0;
                              document.forms["form1"].elements['cc4'].length = 0;
                      }
          if ( dv == 'jdc2'){
            document.getElementById('jdc1').style.visibility = "visible";
            document.getElementById('jdc2').style.visibility = "visible";
            document.getElementById('jdc3').style.visibility = "hidden";
            document.getElementById('jdc4').style.visibility = "hidden";
                              document.forms["form1"].elements['cc3'].length = 0;
                              document.forms["form1"].elements['cc4'].length = 0;
                      }
          if ( dv == 'jdc3'){
            document.getElementById('jdc1').style.visibility = "visible";
            document.getElementById('jdc2').style.visibility = "visible";
            document.getElementById('jdc3').style.visibility = "visible";
            document.getElementById('jdc4').style.visibility = "hidden";
                              document.forms["form1"].elements['cc4'].length = 0;
                      }
          var count_values = curr_sel_value.length;
          var category_list = document.forms["form1"].elements[lev];
          var count_category_list = category_list.options.length;
          category_list.length = 0; 
          for (i = 0; i < count_values; i++){
            if (document.createElement){
                var newCategoryListOption = document.createElement("OPTION");
                newCategoryListOption.text = curr_sel_text[i];
                newCategoryListOption.value = curr_sel_value[i];
                (category_list.options.add) ? category_list.options.add(newCategoryListOption) : category_list.add(newCategoryListOption);
            }else{
                category_list.options[i] = new Option(curr_sel_text[i], curr_sel_value[i], false, false);
            }
          }
          document.getElementById(tr).style.visibility = "visible";
              }
                    else{
          document.getElementById(tr).style.visibility = "hidden";
                    }
      }
    //-->

    Запостил: qbasic, 23 Февраля 2011

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

    • а где собственно говнокод? Что, ради 4 значений надо было циклы с проверками городить? Может dv еще используется дальше...
      Ответить
      • Простой способ отрефакторить такое счастье:
        шаг 1. копируете все в одну функцию.
        шаг 2. находите уникальные элементы, их выносите в параметры функции.
        шаг 3. в функции оставляете только повторяющиеся элементы, а уникальные заменяете ссылками на параметры.
        шаг 4. повторить шаг 3.
        ???
        profit!
        Ответить
        • да вы чо
          рефакторить-шнифакторить
          eval('typeof... блистает
          Ответить
        • Один фиг кода будет не меньше, а проверок больше
          Ответить
          • Проверок не будет больше. Но смысл не в количестве - если вам принципиально количество - есть Closure "компилятор". А потом можно еще это все упаковать в SWF (из SWF можно передать любой код в HTML, так например Facebook делают). А еще его можно написать на каком-нибудь компилируемом языке, тот же AS3, например, а еще его можно написать и скомпилировать в машинные коды (если писать для Nacl). Будет гораздо меньше и в разы быстрее... Но смысл не в этом.
            Смысл в том, что тупое механическое копирование одного и того же кода == говнокод. Это так потому, что когда вам нужно будет сделать логически одно изменение (например, "jdc" по причине поллит не корректности надо будет назвать "jcd"), вероятность того, что произойдет ошибка, и не все обращения к "jdc" будут заменены на новые будет тем выше, чем больше раз бы к нему обращались.
            Ответить
            • А лучше вообще все написать на С++ да? Смысл в том, чтобы написать в кратчайшие сроки сносный рабочий код. Любой код можно улучшать до ассемблера, но смысл? На оптимизацию будет ресурсов угрохано гораздо больше, чем будут потери от ошибок.
              Ответить
              • Я все чаще убеждаюсь в том, что писать более одного абзаца для онлайн аудитории не то, что бессмысленно, но даже вредно :) У читателя от нетерпения и желания высказаться начинает бурлить, и он отвечает, так и не дочитав.
                Ответить
                • Ну если вы не можете четко изложить мысоль, то и 10 абзацев не хватит. В простых случаях тратить нехило времени на оптимизацию смысла нет - больше ошибок будет. Ну а называть 3-4 повторяющиеся строчки говнокодом...
                  Почему бы весь неоптимизированный код не назвать говном?
                  Ответить
          • //
            // Let's try to make some sense of this program
            //
            
            // given:
            document.getElementById('jdc1').style.visibility = "visible";
            document.getElementById('jdc2').style.visibility = "hidden";
            document.getElementById('jdc3').style.visibility = "hidden";
            document.getElementById('jdc4').style.visibility = "hidden";
            
            // step 1:
            function setElementVisible()
            {
            	document.getElementById('jdc1').style.visibility = "visible";
            }
            
            // step 2:
            function setElementVisible()
            {
            	document.getElementById('jdc1').style.visibility = "visible";
            //------------------------------^--------------------------^ unique
            }
            
            // step 3
            function setElementVisible(element, visible)
            {
            	document.getElementById(element).style.visibility = visible;
            }
            
            //
            // The program is more optimized and less error prone, however
            // it still repeats itself, which is, no the contrary, error prone.
            // (The number of errors in the code is proportionate to the
            // number of lines).
            //
            
            setElementVisible("jdc1", "visible");
            setElementVisible("jdc2, "hidden");
            setElementVisible("jdc3, "hidden");
            setElementVisible("jdc4, "hidden");
            Ответить
          • //
            // Let's try to optimize and rearrange the input values
            //
            
            // step 1:
            if "jdc1" then "visibe"
            if "jdc2" then "hidden"
            . . .
            if "jdc" + N then "hidden"
            
            // step 2:
            var conditions = 
            {
            	"jdc1" : "visible",
            	"jdc2" : "hidden",
            	"jdc3" : "hidden",
            	"jdc4" : "hidden"
            }
            
            //
            // Now the program is a one-liner, yet it's not self-explanatory 
            // enough. (Another developer won't see the reasoning behind 
            // the condition hash population).
            //
            
            // step 3:
            for (var jdc in conditions) setElementVisible(jdc, conditions[jdc]);
            
            //
            // Let's see how the pattern is built...
            //
            
            // step 1:
            "jdc1".substing(0, 3) == "jdc2".substring(0, 3) == . . .
            
            // step 2:
            var conditions = { };
            var jdc = "jdc";
            var jdcI;
            for (var i = 1; i < 5; i++)
            {
            	jdcI = jdc + i;
            	if (i == 1) conditions[jdcI] = "visible";
            	else conditions[jdcI] = "hidden";
            }
            
            //
            // Does "jdc" suffix have any significance? 
            // It appears it is yet another redundancy. Since it's not
            // clear what it means, let's follow Occam's rule and drop it.
            //
            
            // finally
            for (var i = 1; i < 5; i++)
            {
            	if (i == 1) setElementVisible(i, "visible");
            	else setElementVisible(i, "hidden");
            }
            
            function setElementVisible(element, visible)
            {
            	document.getElementById("jdc" + element).style.visibility = visible;
            }
            Ответить
          • function isElementVisible(index)
            {
            	return index == 1 ? "visible" : "hidden";
            }
            
            function setElementVisible(element, visible)
            {
            	document.getElementById("jdc" + element).style.visibility = visible;
            }
            
            for (var i = 1; i < 5; i++) setElementVisible(i, isElementVisible(i));

            :)
            Ответить
            • Хорошо, а с этим справитесь? ))
              document.forms["form1"].elements['cc4'].length = 0;
              Ответить
              • чота странно хайлайтер отработал, чует говнокод
                document.form1.cc4.length = 0 /* что бы эта херня ни означала */
                Ответить
              • Если этот код действительно работал, то единственное тому объяснение - cc4 - это тоже форма, очевидно вложенная в другую. Любой другой элемент HTML, даже если у него и есть свойство length, либо предоставляет его только для чтения, либо при попытке присвоить новое значение бросит ошибку. Так что скорее всего document.forms["cc4"].length = 0.
                Ответить
                • Я бы не стал так категорично про единственное объяснение. Нет свойства - добавится, какие проблемы. "Петька, приборы! 25!"
                  А кстати, это select, см.#5784
                  Ответить
                  • Если это был селект, то код в принципе не рабочий.
                    Ответить
                • > форма, очевидно вложенная в другую
                  формы в коллекцию elements не попадают

                  > document.forms["cc4"]
                  опять?
                  Ответить
                  • Не знаю... документация говорит, что должно возвращать список управляющих компонентов. Можно истолковать двояко.
                    Ответить
                  • Я потыкал в Опере, как ни странно у селекта нашлось свойство length (по количеству опшенов), и оно даже успешно обнуляется, но при этом внешне ничего не происходит.
                    Строку можно просто удалить.
                    У формы length - чистый геттер, Опера и ФФ его "в лоб" менять не дают.
                    Ответить
                    • > даже успешно обнуляется, но при этом внешне ничего не происходит
                      а в самой новой опере даже успешно почистились опции, надо же
                      Ответить

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