Много вложенных if
- Войдите на сайт для отправки комментариев
Ср, 28/07/2021 - 13:55
Здравствуйте.
Пишу код для управления розетками через СМС.
С форматами команд решил следующее
Для получения текущего состояния розетки отправляю смс вида GX
где G-это команда получения статуса, Х - номер розетки (от 1 до 6)
Пример G1 получить состояние розетки 1
Для включения/выключения розетки отправляю смс вида SX/Y
где S - это команда включения или выключения, Х - номер розетки (от 1 до 6), Y-установить значение (0-выключить, 1-включить)
Пример S4/0 Выключить розетку 4
Конкретно для команд получилась вот такая вот портянка из if
Мне приходится посимвольно забирать каждый символ, проверять его на валидность и уже идти дальше
Можно как-то упростить код, есть какие-нибудь мысли ?
#define SMSSTATUS 'G' #define SMSCOMMAND 'S' #define ROZETKED 6 //Количество розеток int getSMSMessage(String smsmessage) { int powerNumber=0; int powerStatus=0; if (smsmessage.charAt(0) == SMSSTATUS) { // ToDo; } if (smsmessage.charAt(0) == SMSCOMMAND) { if (isDigit(smsmessage.charAt(1))) { powerNumber = smsmessage.charAt(1)-'0'; if (powerNumber > 0 && powerNumber <= ROZETKED) { if (smsmessage.charAt(2) == '/') { if (isDigit(smsmessage.charAt(3))) { powerStatus = smsmessage.charAt(3)-'0'; if (powerStatus == 0 || powerStatus == 1) { //Мы в нужном месте и наконец можем переключить питание } } } } } } }
Инвертировать условия, по срабатыванию делать return. Будет покрасивее и уменьшится шанс запутаться в дереве.
За парсер зачитай чонить
А в чём проблема-то? Ифы - как ифы. В строке №14 else перед иф не хватает, а так, код как код.
Хочется в одну строчку? Тогда сюда, только потом не жалуйтесь :-)
А в чём проблема-то? Ифы - как ифы. В строке №14 else перед иф не хватает, а так, код как код.
Хочется в одну строчку? Тогда сюда, только потом не жалуйтесь :-)
Для одной команды regexp это наверное слишком, а так надо попробовать :)
Да как бы проблем нет, даже работает все :)
Мне почему-то бросилась в глаза такая вещь. С одной стороны проверок накручено много - например проверяется наличие слэша, осбого смысла не несущего. А с другой стороны - читаются символы по номеру в строке без проверки длины этой самой строки. Чего там этот charAt(x) вернёт?
Чего там этот charAt(x) вернёт?
Ноль.
Если r-value, то просто ноль, а если l-value, то ссылку на место, в котором уже есть ноль и куда можно что-то записать.
*чтобы не плодить темы уже спрошу тут*
Здравствуйте.
такая ситуация - тоже много if else if (но не вложенных)
но самый частый случай это когда flag==1 и для этого случая мы ничего не делаем с массивом а просто его печатаем. в данной реализации мы должны проверить все if и только потом распечатать самый частый случай.
если сделать так
то самый частый случай быстрее отрабатывает но смущает такой пустой if. как делают профи в такой ситуации ? или это нормально такая пустая заглушка если хотим побыстрее ?
Можно и так, но в вашем случае, когда в if-ах нет условий посложнее, удобнее пользоваться switch..case - проще читается.
negavoid2 ну так тоже все пробегут пока до дефолта дойдём, хотя надо на асме посмотреть что получается...
вот как b707 получается то что надо
вот как b707 получается то что надо
еще можно так :
трудно выстрелить себе в ногу стотонным танком... но у некоторых получается
Что вы тут за задачи решаете, что свич нужно в asm-listingе смотреть? Прямо страшно становится...
Очевидно, параноидальную экономию микросекунд :)
negavoid2 еще раз посмотрел неправильно у вас. нужнобыло это
в асме не микрос хотел увидеть :) а разницу в коде. посмотрел разницы нет. он также пробегает все условия. а хотелось проскочить все лишние условия. как мой второй пример или пример b707
Тяжелый случай.(
Боджечки )) ну поставьте первым case 1:break; хотя раз неправильно, значит неправильно :)))))
Тяжелый случай.(
это ж алекс...
Боджечки )) ну поставьте первым case 1:break;
https://www.youtube.com/watch?v=aw10753OJyg
а хотелось проскочить все лишние условия.
это ж алекс...
...из прекрасной страны, где не едят солёных огурцов.) Думал исправился со временем.(
Надо, alexbmd, надо! (с)
Надо, alexbmd, надо! (с)