Acyclic Relationships – Module relationships must be acyclic.
Levelize Modules – Module relationships should be levelized.
Physical Layers – Module relationships should not violate the conceptual layers.
Container Independence – Modules should be independent of the runtime container.
Independent Deployment – Modules should be independently deployable units.
Published Interface – Make a module’s published interface well known.
External Configuration – Modules should be externally configurable.
Default Implementation – Provide modules with a default implementation.
Module Facade – Create a facade serving as a coarse-grained entry point to to another fine-grained module’s underlying implementation.
Abstract Modules – Depend upon the abstract elements of a module.
Implementation Factory – Use factories to create a module’s implementation classes.
Separate Abstractions – Place abstractions and the classes that implement them in separate modules.
Collocate Exceptions – Exceptions should be close to the classes that throw them.
Levelized Build – Execute the build in accordance with module levelization.
Test Module – Each module should have a corresponding test module that validates it’s behavior and illustrates it’s usage.