The recommended practice in creating complex software is to adopt a modular design. Functionality is decomposed into modules or classes, each doing something specific and exposing their services via well-defined interfaces. This implies that one module will often depend on other modules or componen…