1. C++ / Говнокод #17530

    +51

    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
    static bool convertCharToHexByte(char& ch)
    {
    	if (ch >= '0' && ch <= '9') {
    		ch -= '0';
    		return true;
    	}
    
    	if (ch >= 'a' && ch <= 'f') {
    		ch -= 'a';
    		ch += 0xA;
    		return true;
    	}
    
    	if (ch >= 'A' && ch <= 'F') {
    		ch -= 'A';
    		ch += 0xA;
    		return true;
    	}
    
    	return false;
    }

    Запостил: alek0585, 27 Января 2015

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

    • А в чем говно? Имеет право на жизнь. Тем более это, скорее всего, деталь реализации большей функции, и никто этот convertCharToHexByte() из других модулей дергать не будет.
      Ответить
      • возможно автор считал, что нужно было писать именно
        [0-9A-F]
        Ответить
      • static bool convertCharToHexByte(char& ch)
        Ответить
        • Ну т.е. только в названии (т.к. на выходе не байт, а nibble внутри чара)?
          Ответить
        • P.S. Нужно понимать, что у нас сейчас намного меньше контекста, чем у вас. По сравнению с тем, что мне доводилось видеть и править, этот код отлично читается и в нём нет ошибок. Поэтому, в данном конкретном треде, я отношусь к автору с оптимизмом и симпатией, и пытаюсь оправдать код, а не обосрать его.

          Мы ведь даже не знаем, где этот статик находится - в публичном интерфейсе класса, в приватной части класса или же вне класса в cpp'шке. А от этого многое зависит...
          Ответить
          • >Поэтому, в данном конкретном треде, я отношусь к автору с оптимизмом и симпатией, и пытаюсь оправдать код, а не обосрать его.
            Эти джве ветки обычно в одну сводят
            if (ch >= 'a' && ch <= 'f') {
            if (ch >= 'A' && ch <= 'F') {
            Ответить
            • > Эти джве ветки обычно в одну сводят
              Каким образом?
              Ответить
    • Надо ещё больше return'ов добавить! Полезность порчи входящего чара тоже под вопросом. Скорее всего вызывает эту функцию другой говнокод. Хотелось бы на него посмотреть
      Ответить
      • > Надо ещё больше return'ов добавить!
        Чем return'ы тебе не угодили? Предлагаешь флаг мутить и возвращать?

        > Полезность порчи входящего чара тоже под вопросом.
        Предложи свой интерфейс. Там все варианты равнозначны, как мне кажется (сходу придумал штуки 4). И для приватной функции можно забить на перфекционизм.

        > Скорее всего вызывает эту функцию другой говнокод.
        Да какой-нибудь банальный цикл, составляющий из помятых этой функцией чаров число или байтстринг. На самом деле, bool и char & в таком контексте довольно удобны. А эта convertCharToHexByte, скорее всего, приватная.
        Ответить
        • >Чем return'ы тебе не угодили? Предлагаешь флаг мутить и возвращать?

          помниться у нас тут эпичный спор был. Еще когда стертор был жив.
          Ответить
        • Ну назови её флагом. Функция должна иметь одну точку выхода, а не четыре. Даже если она такая небольшая и понятная.

          Если использование исключений нежелательно или очень хочется иметь булеан на выходе, то я бы использовал интерфейс с чарИн и чарОут. Если юзеру охота, то может сувать туда одну и ту же переменную, а может и разные. Но он это будет делать явно.
          Ответить
          • > Функция должна иметь точку выхода, а не четыре.
            Дейкстрены объелся?
            Хоть конечно я тоже считаю что порча казённого чара и отсутствие else плохо.
            Ответить
          • > Но он это будет делать явно.
            Я еще раз повторюсь, что если эта функция - приватный хелпер, то совершенно похеру. Но ОП так и не сказал нам, откуда эту функцию юзают.

            > я бы использовал интерфейс с чарИн и чарОут
            Наверное даже intOut.
            Ответить
            • > если эта функция - приватный хелпер, то совершенно похеру
              так-то оно, почти так. Но даже в этом случае прозрачный интерфейс поможет не наступить на собственные грабли в будущем

              и да, наверное всё-таки чарОут. В чём бенефит интОута?
              Ответить
              • > В чём бенефит интОута?
                Да в общем-то ни в чём... Варианты равнозачные. Просто мне int там показался более семантичным - "целое число от 0 до 15".
                Ответить
                • Поддерживаю.

                  Об ретурнах -ИМХО нет никакой разницы. Но из 3ного цикла проще ретурнуться чем каскадно брякнуться с сохранением состояния
                  Ответить
                • static bool convertCharToHexByte(char ch)
                  {
                          int r=-1;
                  	if (ch >= '0' && ch <= '9') {
                  		r=ch - '0';
                  	}
                          else if ((ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F')){
                  		r=(ch|('a'-'A')) - 'a';
                  		r += 0xA;
                  	}
                  	return r;
                  }
                  in-out. чё разве, так нельзя написать?
                  И они еще борются за почётное звание «чистых языков типа хаскеля», - это же кошмар, кошмар!
                  Ответить
                  • > bool convertCharToHexByte(char ch)
                    > int r
                    у вас сигнатура поехала
                    Ответить
                  • Можно и так. Но тут *особое значение* возвращается. Хотя, для сишки, вполне адекватно. Там в каждой первой функции возвращают какое-нибудь особое значение.
                    Ответить

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