Enforcing component boundaries
Conventions are good to have, but if that’s all there is, someone will break them, and the architecture will erode. We need to enforce the conventions of the component architecture.
The nice thing about the component architecture is that we can apply a relatively simple fitness function to make sure that no accidental dependencies have crept into our component architecture:
No classes that are outside of an “internal” package should access a class inside of that “internal” package.
If we put all the internals of a component into a package called “internal” (or a package marked as “internal” in some other way), we just have to check that no class in that package is called from outside of that package. For JVM-based projects, we can codify this fitness function with ArchUnit:3
3 ArchUnit rule to validate that no code accesses code within a certain package: https://github.com...