Software Architecture · Cluster
Modularity
Cohesion, coupling, and information hiding.
- 01 Coupling and Cohesion as Independent Structural Axes Why dependency strength between modules and relatedness inside a module are separate measurements, and how the classic coupling and cohesion scales describe them.
- 02 Information Hiding and the Parnas Decomposition Criterion How designing each module around a decision it conceals confines the cost of change, and what an interface must expose for that concealment to survive.
- 03 Interface Contracts and the Limits of Substitutability What a module boundary promises beyond its signature, why behavioural subtyping is stricter than type compatibility, and which contract clauses callers silently depend on.
- 04 Cycles in Module Dependency Graphs and How to Break Them Why a dependency cycle collapses independent modules into one release unit, how strongly connected components expose the real structure, and which refactorings remove a cycle without adding another.
- 05 Package Encapsulation and the Leak of Internal Types How languages draw the visibility line around a package, which constructs quietly widen it, and why an exported type in a public signature defeats the boundary it was meant to protect.
- 06 Instability, Abstractness, and the Main Sequence Metric How afferent and efferent coupling produce an instability score, why stable packages should be abstract, and where the distance-from-the-main-sequence number misleads.
- 07 Physical Modularity: Compilation Firewalls and Rebuild Cost How declaration-level dependencies turn a header edit into a full rebuild, what a pimpl or interface boundary costs at runtime, and how package compilers avoid the same trap.
- 08 Connascence: Coupling Measured by Strength and Distance A finer taxonomy than fan-in and fan-out: nine kinds of change-propagating relationship, why strength only matters relative to locality, and how to trade one kind for another.
- 09 ABI Boundaries as Module Seams in Dynamic Linking What a shared library promises a separately compiled caller, why adding a data member or a virtual function can break that promise, and how symbol visibility turns a design boundary into a loader-enforced one.
- 10 The Runtime Cost of Indirection at Module Boundaries A cost model for boundary crossings: what inlining loses, what a virtual call and a cache miss actually cost, and when a coarse-grained interface beats a clean one.