1. Pascal / Говнокод #10066

    +107

    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
    function Ns(ds: char; var vs: byte): boolean;
    begin
       case ds of
    'Q': vs:= 81;
    'W': vs:= 87;
    'E': vs:= 69;
    'R': vs:= 82;
    'T': vs:= 84;
    'Y': vs:= 89;
    'U': vs:= 85;
    'I': vs:= 73;
    'O': vs:= 79;
    'P': vs:= 80;
    'A': vs:= 65;
    'S': vs:= 83;
    'D': vs:= 68;
    'F': vs:= 70;
    'G': vs:= 71;
    'H': vs:= 72;
    'J': vs:= 74;
    'K': vs:= 75;
    'L': vs:= 76;
    'Z': vs:= 90;
    'X': vs:= 88;
    'C': vs:= 67;
    'V': vs:= 86;
    'B': vs:= 66;
    'N': vs:= 78;
    'M': vs:= 77;
    else vs:= 0;
      end;
     if vs = 0 then Result:= false else Result:= true;
     end;

    Определение кода виртуальных клавиш, вот что бывает, когда кто-то не знает матчасть, вся эта белиберда легко заменяется на :

    function Ns(ds: char; var vs: byte): boolean;
    begin
    case ds of
    'A'..'Z': vs:= byte(ds);
    else vs:= 0;
    end;
    if vs = 0 then Result:= false else Result:= true;
    end;

    И не лень же было клаву мучить!

    Запостил: Alegun, 27 Апреля 2012

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

    • Я умещу этот код в две строки:
      function Ns(ds: char; var vs: byte): boolean;
      begin
          vs := byte(ds) * ord (ds in ['A'..'Z']);
          Result := vs <> 0;
      end;
      Ответить
      • легким движением руки код превращается... код превращается... в элегантный однострочник!
        Ответить
        • Самое смешное, сборка, из которой выдран этот кусок, работает совсем без него, поменялась логика :)
          Ответить
    • if vs = 0 then Result:= false else Result:= true;
      вот одно это воняет на весь модуль
      Ответить
      • зато так компилятору понятнее
        Ответить
      • Result := vs <> 0 хорошая замена, но так она уж больно скобками воняет. В явном присвоении значения булеанке думаю говнокода совсем нет, буков немного побольше только, зато и понятнее результат ИМХО. Или я не прав?
        Ответить
        • нет, это воняют не скобками, а незнанием логики и логических типов
          васичникам простительно, а поцкалистам уже нет
          Ответить
    • Result := Letter in ['A'..'Z'];
      Ответить
      • С этим согласен, но ведь оригинальная функция предполагает побочный эффект, инициализирующий второй аргумент.
        Ответить
    • ord() решает
      Ответить
    • Избавимся от умножения
      function Ns(ds: char; var vs: byte): boolean;
      begin
          Result :=ds in ['A'..'Z'];
          vs := byte(ds)  and (-ord (Result));
      end;
      Ответить

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