LINUX.ORG.RU

Глобальные переменные - зло или нет?


0

0

Я не раз читал, что глобальные переменные нужно использовать как можно меньше, или совсем не использовать. Сейчас у меня такая ситуация: есть код (на perl) для работы с БД: 3 функции
db_init();
db_finish();
db_sql;
все три используют одну глобальную переменную (кроме них её больше никто не использует) для хранения идентификатора соединения с БД. Что здесь может быть плохого и как можно исправить? Можно избавиться от неё и писать код вроде
my $dbh = db_init();
...
db_sql($dbh, ...);
...
db_finish($dbh);
Но, опять же это только лишняя писанина, ничего не улучшающая (мне так кажется).

Хочу подчеркнуть, что я имею ввиду именно процедурно-ориентированное программирование, если писать в ОО-стиле, подобных вопросов у меня нет.

★★★★★

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

А будет тогда песец.

Глобальные переменные - зло. Иногда без них не обойтись, но в 90% случаев их наличие является сигналом к отправке горе-программиста в отпуск на биржу труда.

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

> А что случится, когда ты попробуешь работать с двумя базами (не важно по каким причинам)?

Вообще говоря в текущем проекте такая ситуация попросту невозможна. Но если она возникнет, наверное придется написать аналоги этих трех функций. Это конечно плохо. Но очень маловероятно.

> А если кто-нибудь запользует под свои цели переменную с таким же именем?

Насколько я понимаю, в перле это не проблема, во-первых её использовать сможет только кто-то из того же модуля, во-вторых если этот кто-то захочет использать переменную с таким именем (но подразумевая другую), то скорее всего объявит её как my $var, и перл выдаст ошибку. Т.е. тут не такая ситуация, как в C.

> Глобальные переменные - зло. Иногда без них не обойтись, но в 90% случаев их наличие является сигналом к отправке горе-программиста в отпуск на биржу труда.

Т.е. тут такая же ситуация, как и с goto. Понятно.

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

Legioner ★★★★★
() автор топика

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

По хорошему код должен выглядеть так: (with-db-connection (db_init ...) ...), внутри этого блока по умолчанию будет использован соответствующий результат (db_init ...). Но в убогом недоязычке PHP тебе никто не позволит так делать без глобальных переменных.

anonymous
()
Ответ на: комментарий от Legioner

А... Это perl? Тогда тем более можно без всяких глобальных переменных и лишней писанины обойтись, метапрограммирование в перле есть (в зачаточном состоянии, но для описанного выше прикола более чем достаточное).

anonymous
()

возможность шарить переменную между функциями --- это Одна из фич, сильно нравящихся мне в OCaml.

Zenom ★★★
()
Ответ на: комментарий от Zenom

> возможность шарить переменную между функциями --- это Одна из фич, сильно нравящихся мне в OCaml.

Это называется замыканием, и есть почти во всех языках. Даже в си можно сэмулировать замыкания с помощью статических переменных. В общем, надо гуглить по запросу 'closure your_favorite_language'

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.