[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Несколько вопросов вразброс



26.06.2012 23:26, Dmitrii Kashin пишет:
> "Артём Н." <artiom14@yandex.ru> writes:
> 
>> Глобальные переменные сильно увеличивают связность и вероятность появления
>> ошибок, в результате их случайного переопределения, например.
> Не надо переобределять глобальные переменные в теле программы.
> Один раз установили при старте сценария - и больше не трогаете.
Ну так, это не переменные, а константы.

> Если поведение функций зависит исключительно от этих переменных - Вы тем
> самым обеспечите их чистоту. Чем не вариант?
Не очень хорошо, что "интерфейс" функции "разбит" на две части.

>> К тому же, функция их использующая, не совсем рентабельна: её не
>> всегда возможно вызвать без лишних движений из самой себя или из
>> внешней функции, если та пользуется теми же переменными (например,
>> придётся использовать стек или локальные переменные для сохранения
>> глобальных перед вызовом).
>> Для констант, хотя, это не актуально..? O.o
>> Но, тем не менее, получается, что "интерфейс" функции не сосредоточен
>> в одном месте, а в какой-то степени "разбросан", что не есть хорошо (и
>> естественно, связность между функцией и внешним окружением
>> повышается).
> Не понял ничего. Снизойдите.
o.O Что непонятного? Если про переменные говорить?
1. Есть функция, которая вызывает другую функцию. В обеих используется одна и та
же переменная (не для связи между ними). Если внутренняя функция её
переопределяет, внешняя должна сохранять. В общем случае (к башу неприменимо)
ещё с многопоточностью проблемы будут. Вообще-то, это везде написано... Надо
объяснять? Для констант неприменимо.
2. Глобальная переменная может быть случайно переопределена где угодно. Кстати,
даже непреднамеренно (ну eval какой-нибудь неправильно использовал или что ещё).
Поиск ошибки затянется. В случае с readonly - проблема отпадает.
3. Ещё раз про интерфейс. Касается и констант. Он разбит на две части. Это
значит, что одна переменная может влиять на несколько функций сразу, что может
привести к побочным эффектам и трудноуловимым ошибкам (в общем случае). Когда, с
параметром функции всё понятно (если функция "чистая", т.е. без побочных
эффектов): изменил, сдохла, - проблема в ней или вызываемых с этими параметрами.
Здесь: изменил, сдохла, проблема может быть в нескольких функциях, использующих
переменную, или в их взаимодействии. Это первое.
Второе из первого. Не сразу очевидно какая функция, какую переменную использует.
Без глобальных констант, если есть иерархия вызовов, понятно какая функция, что
использует ещё на верхнем уровне. В случае использования глобальных констант -
непонятно. Значит, нужно использовать поиск (например, разбирая скрипт), чтобы
найти какая переменная в какой функции используется. Понимание усложняется.
Но в bash нет именованных параметров у функций. При их наличии, такого вопроса,
скорее всего, не возникло бы.


Reply to: