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

    −53

    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
    function get_filenamebyid(req_file_id_in:integer;is_answer:boolean;X_MESS_SWAP_path:string):string;
    var FILENAME_ONSERVER,FILE_PATH_ONSERVER,s,ss:string;
    req_file_id:integer;
        begin                                  //sdsd
          req_file_id:=abs(req_file_id_in);
        s:=inttostr(req_file_id div (1000*1000*1000));
        while length(s)<3 do s:='0'+s;
        ss:=s;
        s:=inttostr(req_file_id div (1000*1000));
        while length(s)<3 do s:='0'+s;
        ss:=ss+'\'+s;
        s:=inttostr(req_file_id div (1000));
        while length(s)<3 do s:='0'+s;
        ss:=ss+'\'+s;
    
        FILE_PATH_ONSERVER:=ss;
        FILENAME_ONSERVER:=inttostr(req_file_id)+ ifthen(is_answer,'.answer','')+'.xml';
        result:=X_MESS_SWAP_path+FILE_PATH_ONSERVER+'\'+      FILENAME_ONSERVER;
        end;

    Предлагаю отрефакторить

    Запостил: tucvbif, 01 Февраля 2016

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

    • Ну не ужас-ужас.
      "while length(s)<3 do s:='0'+s;" конечно не блеск, но часто встречается, уже "принюхался".
      Аналоги LPAD не везде есть, да и более краткое типа right('00' + s, 3) ещё придумать надо.
      Ответить
      • Суть в том, что right('00' + s, 3) работает немного по-другому.
        Ответить
        • по-другому по сравнению с чем? я мысль не понял.
          Ответить
          • По сравнению с кодом выше. Я тоже сначала хотел его переписать, но пришлось оставить для совместимости это.
            Ответить
            • Оставили для совместимости? Я допускаю, что у вас просто времени не хватило для анализа, но ведь времени сюда запостить хватило?
              То, что я написал, абсолютно идентично по результату. По крайней мере, для integer, поскольку для int64 значение req_file_id div (1000*1000*1000) выходили бы за 3 знака.

              У меня нет под рукой компилятора паскаля, и помню смутно, но всяческих функций форматирований числа там хватало.
              В 1С я бы написал так, одной строкой:
              ss = Формат(req_file_id, "ЧЦ=12; ЧС=3; ЧРГ=\; ЧВН=");

              Сдвиг на 3 вправо, дополнение нулями до 12 знаков, разделитель тысяч "\"
              Ответить
              • Напишите в каменте, что он должен выдать, если на вход поступит, например, 12338? 3281284?
                Ответить
                • Я без отладки немного ошибся. Раз уж я использую сдвиг, а не деление на 1000, то 9 знаков нужно, и форматная строка будет "ЧЦ=9; ЧС=3; ЧРГ=\; ЧВН="
                  Для 12338 результат будет "000\000\012"
                  Для 3281284 результат будет "000\003\281"
                  Ответить
                  • Нет. Вторая попытка.
                    Ответить
                    • Ну да, из головы писать тяжело. Вижу, что их в обратном порядке нужно собрать.
                      Всё равно, это возможно максимум 3-мя функциями format()
                      Ответить
                      • как уже показали ниже, достаточно одной. Просто этот код во-первых, повторяется в нескольких местах с вариациями, а во-вторых — скоро это всё будет полностью переписано и вообще не понадобится.
                        Ответить
                        • На паскале (как и в 1С) одной не хватит, если только какую-нибудь хитрожопую библиотеку не прицеплять.
                          Ответить
                          • То же самое, что строкой ниже — только на delphi
                            result:=format('%s%0.3u\%0.3u\%0.3u\%0.3u.%s', [X_MESS_SWAP_path,id div 1000000000, id div 1000000, id div 1000, req_file_id_in,ifthen(is_answer,'answer','xml')]);
                            Ответить
                            • Мне кажется, ноль после процента не обязательно писать.
                              Ответить
                  • Там чёт типа 3281284 -> 000/003/3281/3281284.xml

                    sprintf(name, "%03u\\%03u\\%03u\\%u.%s", id/1000000000u, id/1000000u, id/1000u, id, isAnswer ? "answer" : "xml");
                    Ответить
                    • http://ideone.com/Dchqle
                      Ответить
                    • Да, именно так. Вот только это дело в нескольких вариациях в паре дюжин разных мест программы, и мне как-то ссыкотно что-то трогать.
                      Ответить
                      • Ну когда говно в функцию инкапсулировано, а не размазано по всему коду сотней копий - это уже круто.
                        Ответить
                        • да, надо быть оптимистами. Плюс у в этой функции нет ни одного goto
                          Ответить
                      • А всё-таки почему там такой странный путь получается? Автор забыл добавить mod 1000, а потом уже куча файлов накопилась в этом кеше и пришлось бы их все переименовывать?
                        Ответить
                    • И ещё: вы забыли abs. В базе id-шники хранятся со знаком -, наверное чтобы никто не догадался.
                      Ответить
                      • Я на него забил :) Считай, что код портанут с 6 строки.

                        З.Ы. У нас принято общаться на ты.
                        Ответить
                      • > id-шники хранятся со знаком -
                        А положительных совсем не бывает? Или там знак что-то означает (типа -локальный +удалённый или ещё что-то подобное).
                        Ответить

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