1. C# / Говнокод #1999

    +133.4

    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
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    if (carCountNumber != null && carCountNumber == 1)
    			{
    				if (yearsOld <= 3)
    				{
    					if (volume <= 1500)
    					{
    						return volume * 0.6;
    					}
    					else if (volume > 1500 && volume <= 2500)
    					{
    						return volume * 0.7;
    					}
    					else if (volume > 2500)
    					{
    						return volume * 0.75;
    					}
    					else
    					{
    						return -1.0;
    					}
    				}
    				else if (yearsOld > 3 && yearsOld <= 10)
    				{
    					if (volume <= 1500)
    					{
    						return volume * 0.35;
    					}
    					else if (volume > 1500 && volume <= 2500)
    					{
    						return volume * 0.4;
    					}
    					else if (volume > 2500)
    					{
    						return volume * 0.6;
    					}
    					else
    					{
    						return -1.0;
    					}
    				}
    
    				else if (yearsOld > 10 && yearsOld <= 14)
    				{
    					return volume * 0.75;
    				}
    				else if (yearsOld > 14)
    				{
    					return volume * 2;
    				}
    				else
    				{
    					return -1.0;
    				}
    			}
    			else if (carCountNumber >= 2)
    			{
    				if (yearsOld <= 3)
    				{
    					if (volume <= 2500)
    					{
    						return volume * 3.5;
    					}
    
    					else if (volume > 2500)
    					{
    						return volume * 5;
    					}
    					else
    					{
    						return -1.0;
    					}
    				}
    
    				else if (yearsOld > 3 && yearsOld <= 7)
    				{
    					if (volume <= 1000)
    					{
    						return volume * 0.85;
    					}
    					else if (volume > 1000 && volume < 1500)
    					{
    						return volume * 1;
                                            }
    					else
    					{
    						return -1.0;
    					}
                                      }
                                 }
                                 else
    				{
    					return -1.0;
    				}

    можно... xD xD xD
    стебитесь... )))
    все? успокоились???
    Теперь серъезно:
    подскажите как избавиться от такого шиткода, может switch....case???

    Запостил: TrueLauncher, 20 Октября 2009

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

    • первым делом,
      carCountNumber != null && carCountNumber == 1 можно заменить на
      carCountNumber == 1...
      switch...case - это не для диапазонов, а точных значений....
      не так сильно внимательно читал, но можно к примеру какую-нибудь табличку составить, по столбцу yearsOld, по строке volume - и внутри значения эти..
      Ответить
    • Я бы избавился от return -1.0 в пользу исключений. А местами и просто логически до них исполнение не дойдёт.
      Ответить
    • Чем не угодил этот код? Ты думешь, что можно написать что-то более простое? Я так не думаю.
      Ответить
    • Чем тебе тут switch case поможет?, тоже вид сбоку.
      Ответить
    • Однозначно, за исключения.
      Для того чтобы избавится от нарезки if-ов используйте ассоциативные массивы. Применение хорошо описано у С.Макконела "Совершенный код".
      вычисление volume по значению yearsOld лучше выделить в отдельные функции (внутренние код по отношению к выбор по carCountNumber), ибо 3-х мерный ассоциативный массив это тоже извращение :-)
      Ответить
      • Уточни пожалуйста, что ты подразумеваешь под "вычисление volume по значению yearsOld". Я этот код понимаю так, что carCountNumber, yearsOld и volume -- заданные прараметры.
        Ответить
        • По коду я предположил, что вычисляется скорректированное значение volume, Что кстати само по себе является поводом для рефакторинга - volume лишний параметр функции. Вычислять можно безразмерный коэффициент преобразования величины volume.
          Примерно так:
          if (carCountNumber == 1)
          return singleVolume(yearsOld);
          else if(carCountNumber >= 2)
          return multipleVolume(yearsOld);
          else
          // генерировать исключение EArgumentOutOfBound
          Ответить
          • Вообщем... суть метода такова, что в него передается 3 параметра:
            yearsOld, carCountNumber, volume.
            А метод возвращает дабл переменную.
            это Расчет растаможки автомобиля - берем год, номер автомобиля по счету который гоним за год, и его объем (куб.см.)
            а на выходе кол-во EURO за растаможку!
            Поэтому volume параметр не лишний!
            Ответить
            • Тебе все правильно написали - лишний тут Volume.
              Должен быть метод а-ля calcCoefficient(year, carCount), который считает коэффициент. Бабло после этого вычисляется одним умножением на полученный коэффициент (без размазывания этого умножения по куче мест).
              Ответить
              • Вы не правы, Volume не лишний и коэффициент вы не посчитаете без него. Скорее метод будет таким: calcCoefficient(year, car_type, owner_type, volume),
                где
                year - год выпуска,
                car_type - тип автомобиля (легковой, грузовой, трактор и т.д.),
                owner_type - растаможивает юрлицо или физлицо,
                volume - объем двигателя.

                И еще там правило чуть сложнее, чем в этом коде наверху.
                Ответить
                • Да, факт, проглядел, что коэффициенты тоже от volume зависят. :(
                  Ответить
          • Судя по коду, это расчет таможенной пошлины, которая зависит от: юрлицо/физлицо, тип транспорта, объем двигателя, год выпуска. От количества транспорта растаможка, насколько я знаю, не зависит. Каждая единица транспорта растамаживается отдельно.

            Было бы эффективней записать коэфициенты в массивы по типам транспорта и объему двигателя, чтобы не лазить по коду и менять алгоритмы, когда очередным постановлением правительство поменяет таможенные ставки., а просто подкорректировать данные в конфиге. Правда обычно они меняют и правила расчета :D.

            Непонятно, что программист хотел здесь: return -1.0;

            В общем, код некрасивый, мало в нем гармонии. Да и он уже почти как год устарел.
            Ответить
            • полохо вы осведомлены значит по поводу растаможки=). для каждой страны она своя (алгоритм расчета взят из Таможенной службы). И в данном случае она зависит от количества представленных транспортных средств к таможенному оформлению в течение календарного года... (лан не в этом суть)
              Позже переделал, данные которые могут менятся снесены в конфиг...
              Можно кусок кода с примером на массивы про которые вы говорите?
              Ответить
              • А я и не говорил про разные страны, только про Россию.

                Код не покажу, ибо лень. Суть в том, что попарно сравниваем значения объемов, забитые в массиве, получаем индекс элемента с коэффициэнтом. Запарка не такая уж большая, вместо того чтобы громоздить тонну if..else. Ваше решение?
                Ответить
    • А декоратор - это из пушки по воробьям будет?
      Ответить

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