1. Java / Говнокод #8613

    +80

    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
    private static final char DELIM = '_';
    
    public String createDocName() {
        ...
        final String sDelim = Character.toString(DELIM);
        String res = stringWithDelimiter(docType) + stringWithDelimiter(docNumber) + stringWithDelimiter(docDate) + stringWithDelimiter(documentReceiptDate);
        res = res.length() < sDelim.length() ? "" : res.substring(0, res.length() - sDelim.length());
        res = res.replace(sDelim + sDelim + sDelim, sDelim);
        res = res.replace(sDelim + sDelim, sDelim);
    
        if (res.charAt(0) == DELIM)
          res = res.substring(1);
    
        if (res.charAt(res.length() - 1) == DELIM)
          res.substring(0, res.length() - sDelim.length());
        
        return res;
    }
    private String stringWithDelimiter(Object o) {
        final String sDelim = Character.toString(DELIM);
        String s = (String) o;
        return StringUtils.isNotEmpty(s) ? s + sDelim : sDelim;
    }

    метод createDocName должен из нескольких полей документа составить имя документа, используя в качестве разделителя "_".
    Сначала я не мог предположить что делает этот код, но подсказал коллега по работе:
    потензицально, вызов String res = stringWithDelimiter(docType) + stringWithDelimiter(docNumber) + stringWithDelimiter(docDate) + stringWithDelimiter(documentReceiptDate) ; может давать запись например такую: "docType___" - в случае если docNumber, docDate и documentReceiptDate будут пустыми строками (а можно получить и "___documentReceiptDate".
    НО, предусмотрительный разработчик позаботился об это проблеме!
    Он заменяет, "___" и "__" с помощью:
    res = res.replace(sDelim + sDelim + sDelim, sDelim);
    res = res.replace(sDelim + sDelim, sDelim);
    Затем удаляет знаки подчеркиваний в начале и в конце строки:
    if (res.charAt(0) == DELIM)
    res = res.substring(1);
    if (res.charAt(res.length() - 1) == DELIM)
    res.substring(0, res.length() - sDelim.length());

    Отличное решение, можно было бы конечно переписать метод stringWithDelimiter, чтобы он не дописывал "_" для пустых строк, но это ведь не так круто правда? Жаль только что придется этот класный код снова переписывать если вдруг измениться число параметров, или поменяется разделитель...

    Запостил: LexeY4eg, 23 Ноября 2011

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

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

    Ошибка компиляции комментария:
    1. Гости могут высказаться только в понедельник, среду, четверг или воскресение
    ava Где здесь C++, guest?!
    А не использовать ли нам bbcode?
    • [b]жирный[/b] — жирный
    • [i]курсив[/i] — курсив
    • [u]подчеркнутый[/u] — подчеркнутый
    • [s]перечеркнутый[/s] — перечеркнутый
    • [blink]мигающий[/blink] — мигающий
    • [color=red]цвет[/color] — цвет (подробнее)
    • [size=20]размер[/size] — размер (подробнее)
    • [code=<language>]some code[/code] (подробнее)
    Проверочный код