Мастер Ломастер писал(а):проповедовать тщательность разработки ПО тоже как бы не очень разумно, но вы же проповедуете

Отнюдь. Я всего лишь интересуюсь, как эту проблему решают другие. Потому что вопросов у меня пока гораздо больше, чем ответов. Особенно это касается "малого" программирования, где эти ответы сильнее запаздывают.
Мастер Ломастер писал(а):вот только делать это путем настойчивого вдалбливания в головы вреда глобальных переменных - не самый продуктивынй путь.
Зачем вдалбливать? Все, что внедряется насильно, встречает сопротивление. Просто показать проблемы от глобализации объектов, возможные альтернативы и их плюсы и минусы. Кто-то оценит и воспользуется, кто-то будет стоять на своем. В обоих случаях мой личный гешефт тождественно равен нулю.
Мастер Ломастер писал(а):что касается помощи в моем примере, то прежде надо определиться с самим понятием глобальности переменной. я его понимаю так: глобальный - это видимый вне контектса своего основного применения.
Согласен. Даже акцентируем: видимый в большей степени, чем это реально необходимо. Хотя это несколько субъективно. Объективнее будет сказать: видимый без ограничения в пределах всего приложения.
Мастер Ломастер писал(а):то есть static-переменная в модуле все-таки глобальная переменная этого модуля.
Тут не согласен. Сочетание "глобальная переменная этого модуля" противоречиво: или переменная глобальна, или это действительно переменная модуля с ограниченной видимостью. static-переменная в модуле именно потому там и находится, что она
должна быть видна именно в пределах. Она полностью скрыта от остальной части кода. Статические переменные примерно эквивалентны закрытым членам класса в объектно-ориентированных языках, их нельзя отнести к глобально видимым объектам.
Мастер Ломастер писал(а):если же считать такую переменную уже не глобальной (что
формально правильно), то проблемы нет и в паскале:
Код: Выделить всё
unit my_integral;
interface
function Integral(Sample : real): real;
implementation
var
Sum : real;
function Integral(Sample : real): real;
begin
Sum := Sum + Sample;
Integral := Sum;
end;
begin
Sum := 0;
end;
однако, суживать понятие глобальности - это типа совать голову в песок, т.е.
делать вид, что проблемы нет.
Но ее в данном случае действительно нет. Переменная имеет ограниченную видимость ровно в тех пределах, в которых она
обязана быть видимой для функционирования этого модуля. Ее можно инициализировать нулем, в ней можно накапливать результат. Возможно, для конкретного применения интерфейс лучше было бы разбить на две отдельные функции, одна из которых добавляет значение к сумме, а другая выдает накопленный результат, но это второстепенные детали, не имеющие отношения к проблеме глобальности.
Самое главное - никакой "посторонний" модуль не может изменить значение нашего интегратора непредсказуемым для нас образом. Например, описав локальную переменную Summ, а присвоив значение глобальной Sum, о существовании которой он и не подозревал, но которая пострадает из-за своей глобальной видимости.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle