Множественный выход из модуля

Буквально 3 часа назад я столкнулся с вопиющим безобразием: меня почти убедили, что нет ничего плохого в выходе из модуля в разных местах («Это же удобно»). Конечно, внутреннее негодование вызвала давняя попаболь по этому поводу.

Ситуация такая:

int func(…){

int s;

if(a != 0)return 0;

…[аля многобукв]…

if(a = b)return 0;

if(b = c)return 0;

…[многобукв]…

return s;

}

Если вас ничего тут не смутило, то проходите мимо, остальной кусок статьи бессмысленный для вас (нет).

Вообще эта проблема со дня распространения структурного программирования весьма остро стояла перед прогерами, люди в принципе так и не пришли к консенсусу. Одни с пеной у рта утверждают  что это нормально, другие же противятся. Я отношусь к тем, кто противится.


Внимание: протест не распространяется на полевое программирование (на коленке, на олимпиадах, хакатонах и прочих подобных адовых для перфекционистов мероприятиях ).


Итак, я говорю о работе именно в команде и без жесткого ограничения по времени (скажем 5 часов на 8 прог, это же безобразие). В такой обстановке множественный выход из любой структуры неприемлем и вот почему:

  1. Сложно отлаживать. Я не говорю про автора сего шедевра,который только только это написал, я говорю про человека, который через месяц или неделю глянет это и ужаснется.
  2. Сложно поддерживать и изменять такой код. Человек, который разбирается в и без того сложном участке кода, должен будет думать о ваших множественных вылетах. Может случиться даже такое, что до части, где он что-то меняет, программа вовсе не доходит.

И вообще весь этот бардак мне напоминает goto, коварного терзальца незащищенных умов. Не зря авторы  всевозможных пособий по структурному программированию призывают не использовать в своей практики этот коварный оператор. Он учит слишком необдуманно относиться к коду. Развращает юные умы простотой использования. Ничего не напоминает? Например, легкий финал посреди представления… return null; и нет проблем..

Напоследок скажу, что множественный выход из модуля является весьма дурным тоном в структурном программировании, ведь он нарушает один из принципов хорошего кода, авторство которого приписывается Эдсгеру Дейкстре и которое звучит так:

«модуль должен иметь только одну точку входа и только одну точку выхода»

Еще от себя хочу посоветовать классную книжечку: клешенкой клац. Я считаю, что она вообще должна быть настольной, для любого, кто видит себя в будущем в крупной фирме или хотя бы намерен работать в команде.. (ну или просто перфекционист)

Безобразие сверху я бы исправил так:

int func(…){

int s;

bool goodEnd=true;

if(a != 0)goodEnd=false;

…[аля многобукв]…

 if(a = b)goodEnd=false;

 if(b = c)goodEnd=false;

…[многобукв]…

 if(!goodEnd)s=0;

return s;

}

В такой код можно поставить несколько точек останова и глянуть правильно ли он исполняется. Если у вас нет времени на такое, увы и ах, наказание не потребует себя долго ждать, если вы все же прогаете в команде. Лично я остался 2 раза без премии, больше не хочется, знаете ли.

maxspt

Оставить отклик

Ваш адрес эл.почты не будет опубликован.