Обрабатывать строку символ за символом и извлекать информацию. Как избежать вложенных if-операторов? - PullRequest
0 голосов
/ 07 декабря 2011

Я получаю сообщения размером 14 байт через сокет InputStream. Они выглядят так: a55a0b051000000000223664300c и у них есть определенный образец. Первые два байта предназначены для синхронизации и всегда постоянны.

Я ищу лучший способ проверить это сообщение. Сначала необходимо проверить длину в 14 байтов, затем первые 2 байта и т. Д.

Это мой подход до сих пор:

public void handleMessage(String msg){

    if(msg.length() == 14){
        if(msg.substring(0, 1).equals("a5") && msg.substring(2, 3).equals("5a") ){

            //Determine tpye
            if(msg.substring(4, 5).equals("0b")){

                //Type = 05
                if(msg.substring(6, 7).equals("05")){

                    if(msg.substring(8, 15).equals("0b")){

                    }
                }

            }
            else if(msg.substring(4, 5).equals("6b")){
                //Type = 05
                if(msg.substring(6, 7).equals("05")){

                    if(msg.substring(8, 15).equals("0b")){

                    }
                }
            }
            else if(msg.substring(4, 5).equals("4b")){
                // ...
            }
            else if(msg.substring(4, 5).equals("ab")){
                // ...
            }
            else System.out.println("Error: telegram type");

        }else System.out.println("Error: Sync Bytes.");



    }else System.out.println("Error: Telegram length.");



}

Но я хочу избежать всех этих вложенных ifs и избыточного кода, который идет с ними. Любые идеи о том, как обработать строку более эффективным способом? Спасибо!

Ответы [ 3 ]

1 голос
/ 07 декабря 2011

Если у вас нет материальных метрик, указывающих на проблему производительности, я бы сосредоточился на удобочитаемости, а не на эффективности.

Чтобы сделать код более читабельным, вы можете преобразовать его в серию вызовов методов с собственными именами для идентификациикакова ответственность каждого метода за валидацию и использовать множественные возвраты вместо вложенных ifs.

1 голос
/ 07 декабря 2011

сначала, как я сказал в комментариях, не конвертируйте в строку, когда вам не нужно

, вы можете инвертировать защитные причины и поставить досрочное возвращение туда, чтобы избежать этих отступов

также может быть разумным переключение на верхнем уровне, поскольку он более читабелен, чем каскад if-else (менее подвержен опечаткам)

public void handleMessage(byte[] msg, int off){
    if(msg.length()-off < 14){//just use the first 14 after offset          System.out.println("Error: Telegram length.");
        return;
    }
    if(msg[0+off]!=0xa5 || msg[0+off]!=0xa5 ){
        System.out.println("Error: Sync Bytes.");
        return;
    }
    //Determine tpye
    switch(msg[2+off]){
    case 0x0b:
        if(msg[3+off]==0x05){

            if(msg[4+off]==0x0b){
            }

        }
        break;
    case 0x6b:
        if(msg[3+off]==0x05){

            if(msg[4+off]==0x0b){

            }
        }
        break;
    case 0x4b:
        //...
        break;
    case 0xab:
        //...
        break;
    default:System.out.println("Error: telegram type");
        break;
    }
} 
0 голосов
/ 07 декабря 2011

Используйте Pattern и Matcher объекты вместо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...