Когда речь заходит об абстракциях и инкапсуляциях, то обычно у нас в голове появляется образ класса, с разделением его интерфейса и реализации. Однако мы значительно реже используем тот же самый подход для более крупных строительных блоков, таких как модули (пакеты в Java или сборки в .NET). У сборки, также как и у класса, есть открытый интерфейс (абстракция) состоящий из набора открытых типов и закрытая часть (реализация), представленная в виде внутренних (internal) типов.
Все мы знаем, что нам следует значительно больше внимания уделять открытой части сущностей (интерфейсам в ОО понимании), поскольку изменения в этой части влияют на существенно большее количество других сущностей. Однако когда речь заходит о модулях (пакетах или сборках), то помимо разделения на открытую/закрытую части очень важно понимать, как и где эти модули используются.