Есть два измерительных модуля в одном из приборов, которые мы делаем -- Module1 и Module2. Меряют разные характеристики. Один давление, другой температуру.
Разные экземпляры прибора могут быть укомплектованы разным набором модулей. И вот данный конкретный экземпляр имел только Module2. И его эксплуатировали 4 месяца не включая этот модуль. Но понадобилось включить. И оказалось, что модуль не работает.
Начинаю отлаживать ПО. И вижу картину маслом:
То есть: если в приборе НЕ установлен модуль 1 (а он и не был установлен), прекратить инициализацию модуля 2! Модули более-менее независимы. Это меня удивило. Я сделал svn blame. Эта команда позволяет установить, кто является автором каждой строчки кода (и у неё есть синоним -- svn praise, лол). В результате этого я выяснил, что данную строчку написал начальник. Как раз 4 месяца назад. И тогда же обновляли ПО на данном приборе.
Я подумал, может быть в этом есть глубокий смысл? Спросил его. Но оказалось, что это всего-навсего последствия невнимательного копипаста при рефакторинге. В первом модуле текст был правильным. Инициализация отличалась несильно. Поэтому начальник просто скопировал текст инициализации первого модуля и подправил нужные места. Но не все...
Разные экземпляры прибора могут быть укомплектованы разным набором модулей. И вот данный конкретный экземпляр имел только Module2. И его эксплуатировали 4 месяца не включая этот модуль. Но понадобилось включить. И оказалось, что модуль не работает.
Начинаю отлаживать ПО. И вижу картину маслом:
void InitModule2()
{
if(Settings.bModule1Installed==false)
return;
//далее инициализация модуля2
}
То есть: если в приборе НЕ установлен модуль 1 (а он и не был установлен), прекратить инициализацию модуля 2! Модули более-менее независимы. Это меня удивило. Я сделал svn blame. Эта команда позволяет установить, кто является автором каждой строчки кода (и у неё есть синоним -- svn praise, лол). В результате этого я выяснил, что данную строчку написал начальник. Как раз 4 месяца назад. И тогда же обновляли ПО на данном приборе.
Я подумал, может быть в этом есть глубокий смысл? Спросил его. Но оказалось, что это всего-навсего последствия невнимательного копипаста при рефакторинге. В первом модуле текст был правильным. Инициализация отличалась несильно. Поэтому начальник просто скопировал текст инициализации первого модуля и подправил нужные места. Но не все...
08.07.2017 в 10:01
switch( condition )
{
case a: return aaa;
case b: return bbb;
...
}
Я таких вещей не люблю, поэтому я сделал "нормально":
Type res;
switch( condition )
{
case a: res = aaa;
case b: res = bbb;
...
}
return res;
Но я совершенно не заметил, что в оригинальном варианте не было ни одного брейка! На автомате заменил все ретурны на присваивание и успокоился. А свитч после этого стал пробегать по всем веткам!
08.07.2017 в 15:06
switch(c)
{
case 1:
case 2:
action1();
break;
case 3:
action2();
break;
}
Тут после первого кейса я, естестественно, брейк не ставлю, т.к. так и задумано.