При разработке большого проекта возникают следующие задачи:
В этом разделе описывается мой подход к решению этих задач.
Единый стиль для всего проекта поддерживается при помощи шаблонов, реализующих функции и внешний вид стандартных элементов.
Имеется "корневой" DLL, в котором находятся минимальный набор файлов, глобальных переменных и процедур, общих для всей системы. Все эти ресурсы "корневого" DLL экспортируются. "Корневой" DLL имеет свой Dictionary, в котором описаны общие для всего проекта файлы. Общих файлов, и переменных должно быть как можно меньше и они должны быть простыми. Доступ к общим файлам лучше "завернуть" в процедуры-методы типа GetCompany_Name(Company_ID), GetTow_Price(Tow_ID). Это позволяет скрыть от других модулей подробности реализации общих файлов (то есть не описывать общие файлы в других модулях системы).
Каждая "подсистема" реализована в виде отдельного DLL, внутри которого скрыты все файлы, переменные и процедуры, реализующие функции данной подсистемы. Такие DLL экспортируют только минимально необходимый набор процедур, которые обычно вызываются из главного меню системы (справочники, ведомости документов и т.п.). Каждый такой DLL имеет свой Dictionary, в котором описаны как специфические для этой подсистемы файлы, так и общие для всего проекта файлы, которые используются в данной подсистеме. Нужно стремиться к тому, чтобы "общих" файлов (и глобальных переменных) было как можно меньше: это делает подсистему более независимой от изменений.
Имеется один EXE-файл, который реализует только общий frame и главное меню системы. Этот модуль может вообще не иметь доступа к файлам. Его задача просто вызывать процедуры, экспортируемые DLL-ми подсистем.
Я оставляю в каждом "подсистемном" DLL-е только одну экспортируемую процедуру (диспетчер), которой в качестве параметра передаю имя вызываемой процедуры. Процедура-диспетчер представляет из себя одну case-структуру, которая анализирует передаваемое имя и вызывает соответствующую внутреннюю процедуру. Это позволяет добавлять в подсистему новые процедуры не изменяя ее внешний интерфейс, и, следовательно, не перекомпилируя весь проект.