Задать вопрос

Законно ли писать программу из процедур без in/out параметров, которые оперируют глобальными переменными?

Добрый день!

Столкнулся с программой написанной на мой неопытный взгляд в странном стиле, а именно:

Почти все действия выполняет большое количество процедур не умеющих IN/OUT параметров. При этом они оперируют глобальными параметрами. В программе уже 4200 строк.
Упрощено программу можно представить следующим образом:
int a;
int b;
int result;
int c = 6;
void Click1() { 
   proc1();
   proc2();
   proc3(); 
}
void Click2() { 
   proc1();
   proc2();
   proc4(); 
}
void proc1() {a = 3;}
void proc2() {b = 5;}
void proc3() {result = a + b + c; Console.Write(result)}
void proc4() {result = a * b / c; Console.Write(result)}


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

На мой взгляд, программа должна должна выглядеть следующим образом:
int C = 6;
void Click1() { 
   proc1(int out a);
   proc2(int out b);
   proc3(a, b, C);
}
void Click2() { 
   proc1(int out a);
   proc2(int out b);
   proc4(a, b, C); 
}
void proc1(int out a) {a = 3;}
void proc2(int out b) {b = 5;}
void proc3(int a, int b, C) {
    int result;
    result = a + b + С;
    Console.Write(result)
}
void proc4(int a, int b, C) {
    int result;
    result = a * b / С;
    Console.Write(result)
}
  • Вопрос задан
  • 375 просмотров
Подписаться 3 Простой 10 комментариев
Пригласить эксперта
Ответы на вопрос 6
@Akina
Сетевой и системный админ, SQL-программист.
Не стреляйте в пианиста - он играет как умеет.

Ну что вы так сразу все набросились-то? Придурок писал, увольняйся нафиг... Вопрос совершенно чётко утверждает, что программа, созданная инициативно, полностью готова и корректно выполняет всё в неё заложенное - так что создавший её как бы не совсем придурок-то. А то, что руководство требует её развивать, однозначно говорит, что она ещё и полезна.

Как я понимаю, программа эта выполняется локально и монопольно, вряд ли многопоточная, и даже допускаю, что не разрешающая одновременного запуска нескольких инстансов (хотя вот это уже совсем предположение). А потому не вижу никаких противнопоказаний к нормальному рефакторингу и получению в конечном итоге приложения, сохранившего весь функционал, но написанного "по науке".

Сейчас главное - полностью разобраться в том, что и как программа делает, и просто понять, что будет дешевле - модифицировать программу или, при сохранении текущей версии и используя её как основу, написать новую версию с нуля.

Армянское Радио
Такие программы пишут или в лютой спешке, или при полном отсутствии опыта - а это больше говорит о работодателе, чем о разработчике программы.

Такие программы сплошь и рядом начинаются как маленькие приблуды, создаваемые одним работником для себя, для облегчения своей работы и снятия с себя тупой рутины. И работодатель тут вообще никаким боком - он не поручал и не заказывал, оно само родилось. И тут уж как работник смог, так и сделал. И то, что программа не просто работает, но и полезна настолько, что принято решение её развивать и это развитие оплачивать - так это работнику жирный плюс.
Ответ написан
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
За такой код, по идее, надо бить по рукам.

Развивать и поддерживать его невозможно уже или станет в ближайшем будущем. Надо срочно рефакторить или вообще переписывать части с нуля.

Очевидно, что писал это кто-то вообще без опыта или "переучившийся" на си с какого-то другого древнего языка.

Солидарен с другими отвечающими: если нет возможности это исправить - бегите.
Ответ написан
AgentSmith
@AgentSmith
Это мой правильный ответ на твой вопрос
Этот код писал школьник, который не знаком с программированием от слова "совсем".
У тебя два выбора:
- переписать всё с нуля
- бежать оттуда
Тот факт, что ты сам этого не понял, говорит о том, что твой уровень программирования на том же уровне.
Законно ли писать программу из процедур без in/out параметров, которые оперируют глобальными переменными?

Нет, не законно, согласно законам программирования DRY/SOLID и прочих. Но ты же о них не слышал, не так ли?
Ответ написан
Комментировать
gbg
@gbg
Любые ответы на любые вопросы
Правильным решением было бы забрать трудовую книжку.

Такие программы пишут или в лютой спешке, или при полном отсутствии опыта - а это больше говорит о работодателе, чем о разработчике программы.

4к строк - это еще можно перерефакторить за пару-тройку месяцев в обнимку с отладчиком. Мне в свое время досталось три проекта по 50к строк на Дельфи. С сущностями вроде Button72. Эх, были времена...
Ответ написан
@Filipp42
Не знаю, в каком случае такой подход вообще применим (может, так пытались повысить производительность?), но я думаю, ещё пара тысяч строк кода, и программа станет абсолютно не читаемой, или по крайней мере поддерживать её будет очень трудно.
Рекомендую прочитать главы SICP об абстракции при помощи процедур.
Ответ написан
Комментировать
@d-stream
Готовые решения - не подаю, но...
Законно.
Никто не запрещает даже спать на потолке и какать стоя. Но это неудобно и ноги постоянно пахнут.

Поэтому в рамках развития и поддержки программы - доводить её до более удобного в плане поддержки и развития состояния. Естественно изучив материалы про рефакторинг и его концепции (Кериевски, Мартин и др).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы