Первый пункт: глобалы не почти , как плохие (сами по себе), как утверждают многие (большинство?) Программисты.На самом деле, сами по себе они совсем не плохие.В первую очередь они являются симптомом других проблем, в первую очередь: 1) логически разделенных фрагментов кода, которые были излишне перемешаны, и 2) кода, который имеет ненужные зависимости данных.
В вашем случае это звучит подобно тому, как уже устранены (или, по крайней мере, сведены к минимуму) реальные проблемы (будучи инвариантами, а не переменными, сам по себе один главный источник проблем устраняется).Вы уже заявили, что не можете устранить зависимости данных, и вы, очевидно, не смешали код до такой степени, что у вас есть как минимум два различных набора инвариантов.Не видя код, который может быть более детализированным, чем на самом деле, и, возможно, при более тщательном рассмотрении, некоторые из этих зависимостей могут быть полностью устранены.
Если вы можете уменьшить или устранить зависимости, это стоит того -но устранение глобалов само по себе редко бывает полезным или полезным.На самом деле, я бы сказал, что в течение последнего десятилетия я видел меньше проблем, вызванных глобалами, чем людьми, которые на самом деле не понимали своих проблем, пытаясь устранить то, что было (или должно было) быть прекрасно в качестве глобалов..
Учитывая, что они предназначены для инвариантов, вы, вероятно, должны сделать, это принудительно применить это явно.Например, есть фабричный класс (или функция), который создает инвариантный класс.Инвариантный класс делает фабрику своим другом, но это может изменить только только члены инвариантного класса.Класс фабрики, в свою очередь, имеет (например) статический bool
и выполняет assert
, если вы пытаетесь запустить его более одного раза.Это дает (разумный уровень) гарантии того, что инварианты действительно инвариантны (да, reinterpret_cast
позволит вам изменить данные в любом случае, но не случайно).
Единственный реальный вопрос, который у меня возникнетесть ли реальная точка в разделении ваших инвариантов на два «куска», если все вычисления действительно зависят от обоих.Если есть четкое, логичное разделение между ними, это здорово (даже если они привыкнут друг к другу).Однако если у вас есть один блок данных, попытка разбить его на части может быть контрпродуктивной.
Итог: глобальные переменные - это (в худшем случае) симптом, а не болезнь.Настаивать на том, что вы собираетесь понизить температуру пациента до 98,6 градусов, может быть контрпродуктивно, особенно если пациент - животное, чья нормальная температура тела на самом деле составляет 102 градуса.