Правильный код на С++

anarch
Offline
Зарегистрирован: 10.09.2017

Вопрос наверное философский или из раздела кому как удобней, но все же.

Имеем некое условие (состояние реле) при котором отправляем то или иное сообщение на MQTT.

Как будет правильно оформить код?

Вариант #1

if (digitalRead(RELAY)) {
    client.publish(mqtt_state_topic, "1");
}  else {
    client.publish(mqtt_state_topic, "0");
}

Вариант #2 (без фигурных скобок)

if (digitalRead(RELAY))
    client.publish(mqtt_state_topic, "1");
else
    client.publish(mqtt_state_topic, "0");

Вариант #4 (используем тернарный оператор)

digitalRead(RELAY) ? 
client.publish(mqtt_state_topic, "1") :
client.publish(mqtt_state_topic, "0");

Ну и на закуску если кусок используем в нескольких местах.

Обычная функция или встроенная?

inline void sendStateRelay(){
    digitalRead(RELAY) ? 
    client.publish(mqtt_state_topic, "1") :
    client.publish(mqtt_state_topic, "0");
}

 

b707
Offline
Зарегистрирован: 26.05.2017

с точки зрения логики все варианты неверные, так как топик нужно публиковать только в случае, когда состояние реле изменилось.

В вашем случае. если вы например поставите свою функцию в loop() - у вас обновление топика будет формироваться десятки и сотни раз в секунду, что перегрузит сеть и сервер

anarch
Offline
Зарегистрирован: 10.09.2017

А если мы сначала в обработчике кнопки сменим состояние реле и в нем же сделаем вызов функции с логикой думаю все нормально будет ;) А еще после реконекта с сервером отправим в топик состояние реле. 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

С точки зрения экономии траффика - нужно публиковать при изменении состояния, это верно. Но, учитывая концепцию MQTT "Shoot and forget", я бы склонялся к периодической публикации топика с любым значением. Нужно только вычислить интервал, отвечающий допустимой задержке срабатывания удалённого устройства.

anarch
Offline
Зарегистрирован: 10.09.2017

Все же вопрос не стоит в том когда и как работать в с MQTT, а в правильности написания кода. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А зачем вообще два одинаковых вызова функции? Думаете соптимизирует? Сомневаюсь. Скорее, так два и всунет. Почему одним вызовом не обойтись? Типа

char c = digitalRead(RELAY) + '0';
client.publish(mqtt_state_topic, &c);

ну, или, в варианте для девочек:

client.publish(mqtt_state_topic, digitalRead(RELAY)  ? "1" : "0");

Я б чёнить подобное написал бы.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

anarch пишет:

Все же вопрос не стоит в том когда и как работать в с MQTT, а в правильности написания кода. 

Хорошо, выкинем MQTT.

Вы думаете, что оптимизатору компилятора не пофигу - через if() или через тернарный? 

Сейчас Ваш вопрос выглядит так: "Кому как нравится буквочки расставлять?"

С инлайном так же. Будет один вызов - легко получите auto-inline. В отрыве от основного кода рассуждение о таких вещах - сплошная маниловщина.

anarch
Offline
Зарегистрирован: 10.09.2017


ЕвгенийП пишет:

client.publish(mqtt_state_topic, digitalRead(RELAY) ? "1" : "0");

Я б чёнить подобное написал бы.

client.publish(const char* topic, const char* payload)

sadman41 пишет:

Сейчас Ваш вопрос выглядит так: "Кому как нравится буквочки расставлять?"

С инлайном так же. Будет один вызов - легко получите auto-inline. В отрыве от основного кода рассуждение о таких вещах - сплошная маниловщина.

Об этих вещах и хотелось поговорить.

b707
Offline
Зарегистрирован: 26.05.2017

anarch пишет:



client.publish(const char* topic, const char* payload)

и к чему это написано?

anarch
Offline
Зарегистрирован: 10.09.2017

Притормаживаю немного кавычки не досмотрел ;)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не, это я неправильные кавычки впялил в первом примере, сорри. Сейчас поправил в #5

anarch
Offline
Зарегистрирован: 10.09.2017

ЕвгенийП пишет:

char c = digitalRead(RELAY) + '0';
client.publish(mqtt_state_topic, &c);

Такую конструкцию я считаю излишней, лучше как для девочек :)

Ну а вообще тема родилась после прочтения статей на тему красивый/правильный код на С++.

Да и нужно ли заморачиваться на это тему или нет, а писать как удобно и что в голову пришло. )) 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

anarch пишет:

Да и нужно ли заморачиваться на это тему или нет, а писать как удобно и что в голову пришло. )) 

В 99% случаев не нужно, но в тех случаях, когда нужно экономить каждый байт программной памяти (или каждый такт быстродействия), то (исследую только память, быстродействие - сами):

void proba (char * s) { Serial.print(s); }
void setup(void) {
	char c = digitalRead(1) + '0';
	proba(&c);
}
void loop(void) {}

1578

void proba (char * s) { Serial.print(s); }
void setup(void) {
	proba((char *)(digitalRead(1)  ? "1" : "0"));
}
void loop(void) {}

1558

void proba (char * s) { Serial.print(s); }
void setup(void) {
if (digitalRead(1)) {
    proba((char *)"1");
}  else {
    proba((char *)"0");
}	
}
void loop(void) {}

1560

Вот и смотрите.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

anarch пишет:
Да и нужно ли заморачиваться на это тему или нет, а писать как удобно и что в голову пришло. ))
  Если Вы не умете читать, то не важно как написано. Правильно или неправильно. А если Вы написали как в голову пришло, то и будете читать свое же "то что в голову надуло". И потом не надо где-то на просторах открывать тему,"вот мамой клянуся тогда работало,а сейчас не работает,помогите найти ошибку". 

vlad072
Offline
Зарегистрирован: 01.08.2017

Не люблю многабукав, поэтому пытаюсь писать максимально компактно

client.publish(mqtt_state_topic, digitalRead(RELAY) ? "1" : "0");

 

anarch
Offline
Зарегистрирован: 10.09.2017
proba((char *)(digitalRead(1)  ? "1" : "0"));

Получается  запись короче и на 2 байта меньше кушает.

Могу сделать вывод, что такая запись выигрывает по всем показателям. 

vlad072 пишет:

Не люблю многабукав, поэтому пытаюсь писать максимально компактно

client.publish(mqtt_state_topic, digitalRead(RELAY) ? "1" : "0");

Стало интересно как будет с меньшим числом буков.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так оно и по памяти - чемпион (из того, что я рассмотрел). Так что, получается, "для девочек - самое лучшее!"

anarch
Offline
Зарегистрирован: 10.09.2017

qwone пишет:

anarch пишет:
Да и нужно ли заморачиваться на это тему или нет, а писать как удобно и что в голову пришло. ))
  Если Вы не умете читать, то не важно как написано. Правильно или неправильно. А если Вы написали как в голову пришло, то и будете читать свое же "то что в голову надуло". И потом не надо где-то на просторах открывать тему,"вот мамой клянуся тогда работало,а сейчас не работает,помогите найти ошибку". 

Одно дело когда в своем разбираешься, а вот совсем другое когда кто то в твоем коде голову ломает.

А если сам не можешь разобраться что писал, считаю этот случай печальным :(

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

В детстве тоже такие вопросы возникали, а теперь предпочитаю максимально читабельный вариант. Например, "для девочек". Экономия на спичках - она такая, сэкономил на копейку, да пропил на рубль.

 

anarch
Offline
Зарегистрирован: 10.09.2017
if(a==b){
    return true;
}else{
    reurn false;
}
a==b ? true : false

Что первый, что второй вариант читается нормально, на мой взгляд.

Но во втором варианте запись короче и как выяснилось ресурсов меньше съедает.

Как уяснил для себя, кому как удобней.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

А низя  return (a==b); штоли? Клапа запретил?

или bool c = (a==b);  если надо куданить присвоить...

anarch
Offline
Зарегистрирован: 10.09.2017

Только если рилигиозные взгляды не позволяют )) 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

А низя  return (a==b); штоли? Клапа запретил?

Я бы даже без скобок написал (ну, если не запретил, конечно).

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ЕвгенийП пишет:

DetSimen пишет:

А низя  return (a==b); штоли? Клапа запретил?

Я бы даже без скобок написал (ну, если не запретил, конечно).

Признай, что чернила экономишь, как тот писарь из "Формулы любви"! ;))))

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Если бы все скобки экономили, глядишь и компьютеры послабее требовались. Все ездили бы на запорожцах и по грунтовке.Ближе к корням предков ,к экологии ближе.

anarch
Offline
Зарегистрирован: 10.09.2017

qwone пишет:

Если бы все скобки экономили, глядишь и компьютеры послабее требовались. Все ездили бы на запорожцах и по грунтовке.Ближе к корням предков ,к экологии ближе.

Звучит как призыв бросить программирование и в руки лопату )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

wdrakula пишет:

Признай, что чернила экономишь

А то! Они ж дороже шанели №5 стоють!