The first six bullets in "modularization" are all about cyclic dependencies. I think it'd be useful to spell out what a cyclic dependency is, and what the difference between a public and a private cyclic dependency is - before you talk about them, rather than at the end in 'definitions'. If we had this I think maybe some of the bullets could be consolidated.
This bullet
In the namespace hierarchy, it's also acceptable for classes in (transitive) parent namespaces and (transitive) child namespaces to depend on each other internally (but never publicly)
... suggests that that something in a parent namespace might depend on something in a child namespace, which I guess is not what you meant. Maybe something like
In the namespace hierarchy, classes lower in the hierarchy may depend on classes higher up, but not the other way around, and not on classes in other namespaces at the same level. Examples:
- a class in
Namespace/SubNamespaceA
can depend on a class inNamespace
- a class in
Namespace
should know nothing about classes inNamespace/SubNamespaceA
- a class in
Namespace/SubNamespaceA
should know nothing about classes inNamespace/SubNamespaceB
I'm not really sure what you mean by "never publicly" ... do you mean that a class in Namespace/SubNamespaceA
shouldn't directly inherit from a class in Namespace
, but composition is ok?