Even though we try not to, we all make mistakes. Except for Randy. I worked with him for a while. He was never wrong.
Anyway, if you do find mistakes on this website, or in the book, please do let me know.
Kirk Knoernschild is a software developer who has filled most roles on the software development team. In 2002, Mr. Knoernschild wrote the book "Java Design: Objects, UML, and Process," published by Addison-Wesley and was a contributing author to "No Fluff Just Stuff 2006 Anthology." Kirk is an open source contributor, has written numerous articles, and is a frequent conference speaker. He has trained and mentored thousands of software professionals on topics including Java/J2EE, modeling, software architecture and design, component-based development, service-oriented architecture, and software process. You can visit his website.
For the full description, implementation variations, consequences, and detailed sample, see Page 150 in Java Application Architecture.
If changing the contents of a module, M2, may impact the contents of another module, M1, we can say that M1 has a Physical Dependency on M2. [JOUP02]

For the full description, implementation variations, consequences, and detailed sample, see Page 150 in Java Application Architecture.
For the full description, implementation variations, consequences, and detailed sample, see Page 150 in Java Application Architecture.
Unfortunately, while logical, these general statements do not always apply.
For the full description, implementation variations, consequences, and detailed sample, see Page 150 in Java Application Architecture.

For the full description, implementation variations, consequences, and detailed sample, see Page 150 in Java Application Architecture.

For the full description, implementation variations, consequences, and detailed sample, see Page 150 in Java Application Architecture.

For the full description, implementation variations, consequences, and detailed sample, see Page 150 in Java Application Architecture.
Modules with excessive runtime container dependencies are heavyweight modules that cannot execute outside the confines of the runtime container. Lightweight modules with no container dependencies have significant advantages.

For the full description, implementation variations, consequences, and detailed sample, see Page 150 in Java Application Architecture.
For a module to be independently deployable, it cannot have any outgoing dependencies on any other module.
For the full description, implementation variations, consequences, and detailed sample, see Page 150 in Java Application Architecture.

For the full description, implementation variations, consequences, and detailed sample, see Page 150 in Java Application Architecture.

For the full description, implementation variations, consequences, and detailed sample, see Page 150 in Java Application Architecture.

For the full description, implementation variations, consequences, and detailed sample, see Page 150 in Java Application Architecture.

For the full description, implementation variations, consequences, and detailed sample, see Page 150 in Java Application Architecture.
Modules heavily depended upon have many incoming dependencies. In other words, you may have many modules that all depend on a single module. On one hand, this is a good thing because you've managed to maximize reuse. But reuse has it's challenges. If the modules you're reusing heavily require a change, the ramifications of that change can ripple throughout all dependent modules. Changing a heavily reused module can be quite a maintenance headache. Abstract Modules helps you deal with this dilemma.

For the full description, implementation variations, consequences, and detailed sample, see Page 150 in Java Application Architecture.
If a class depending on an abstraction must be changed when creating a new implementation of the abstraction, the design is flawed.

For the full description, implementation variations, consequences, and detailed sample, see Page 150 in Java Application Architecture.
You create an abstract class or interface to help reduce coupling between classes. This offers the ability to create new implementations of the abstraction without impacting clients dependent on that abstraction. In this sense, abstract coupling allows you to add new classes to your system without modifying existing classes, and it does so by reducing the dependency relationship between classes.

For the full description, implementation variations, consequences, and detailed sample, see Page 150 in Java Application Architecture.
Sadly, dealing with exceptions in enterprise software systems is often an afterthought. But allocation of exceptions to modules has significant implications on the modularity, and more specifically the dependencies between modules, within our software system. Placing the exception close to a class that catches it will often cause a cyclic dependency between the module containing the class that throws the exception and the module containing the class that catches the exception. Exceptions should always be placed in a module closer to the class that throws the exception than a module closer to the class that catches the exception.

For the full description, implementation variations, consequences, and detailed sample, see Page 150 in Java Application Architecture.
An automated and repeatable build is a critical aspect to most successful development projects. First and foremost, an automated and repeatable build forces you to integrate early and integrate often, so you’re guaranteed to always have a system that works. But there are some rules you should follow to implement a Levelized Build.

For the full description, implementation variations, consequences, and detailed sample, see Page 150 in Java Application Architecture.
Writing tests is one of the most important activities you should perform as a developer. Create a robust suite of tests has significant advantages, both long and short term. Short term, tests help you verify that the code you write does as you intend. Creating tests also helps you design your system. Since classes should be independently testable, a natural by-product of test driven development is that your classes will exhibit lower degrees of coupling. Testing classes independently is valuable, but it's also valuable to test the integration aspect of multiple classes or modules.
