Я думаю, что ваша концептуальная проблема заключается в том, что вы думаете об интерфейсе как о ядре приложения, а модель данных - как о чем-то, что вам нужно где-то найти.
Это назад. Модель данных является ядром программы, а все остальное прививается в модель данных. Модель должна инкапсулировать все логические операции, которые могут быть выполнены с данными. Интерфейс, GUI или другой, просто отправляет сообщения в модель данных, запрашивающие определенные действия.
Исходя из этой концепции, легко заметить, что универсальная доступность модели данных не является небрежным дизайном. Поскольку модель содержит всю логику для изменения данных, вы можете иметь произвольно большое количество интерфейсов, обращающихся к ней, без запутывания данных или усложнения кода, поскольку модель изменяет данные только в соответствии со своими внутренними правилами.
Лучший способ обеспечить универсальный доступ - создать класс, создающий одиночный код, а затем поместить заголовок для класса в заголовки префикса приложения. Таким образом, любой объект в приложении может получить доступ к модели данных.
Edit01:
Позвольте мне прояснить важное различие между голой глобальной переменной и глобально доступной моделью инкапсулированных классов.
Исторически мы рассматривали глобальные переменные как плохой дизайн, потому что они были просто необработанными переменными. Любая часть кода может изменить их по желанию. Эта нагота привела к очевидным проблемам: вам приходилось постоянно защищаться от какого-то случайного фрагмента кода, который изменял глобальный код и затем выводил приложение из строя.
Однако в глобальном классе на основе класса глобальная переменная инкапсулирована и защищена логикой, реализованной инкапсулирующим классом. Эта инкапсуляция означает, что, хотя любой случайный фрагмент кода может пытаться изменить глобальную переменную внутри класса, он может сделать это только в том случае, если инкапсулирующий класс разрешает изменение. Автоматическая проверка уменьшает сложность кода, поскольку вся логика проверки находится в одном классе, а не распространяется по всему приложению в любом случайном месте, где можно манипулировать данными.
Вместо создания слабого места, как в случае открытой глобальной переменной, вы создаете строгую и универсальную проверку данных и управление ими. Если вы обнаружите проблему с управлением данными, вам нужно будет исправить ее только в одном месте. Если у вас есть правильно настроенная модель данных, остальная часть приложения становится смехотворно легкой для написания.