Behavioral relationships between software components

Building software systems from reusable software components has been a goal of software engineers for nearly three decades. Despite progress, the realization of this goal remains surprisingly elusive. Expensive hardware systems such as aircraft, communication networks, and factory assembly lines are designed so that various subsystems (both hardware and software) can be removed and replaced in order to change the performance and functionality of the overall system. In a similar manner, it should be possible to change the behavior of a component-based software system in useful and predictable ways by removing and replacing entire components. In order to perform component-level maintenance, an engineer must understand not only the structural relationships but also the behavioral relationships among the component to be replaced, the system, and the replacement component. These behavioral relationships need to be clearly documented and available to engineers developing and maintaining component-based systems. This dissertation presents a small set of precisely defined relationships that concisely express behavioral relationships between software components. These relationships may be used to provide implementers and maintainers with useful information about how components can and should be composed when integrated into component-based systems. Furthermore, these relationships encourage strict adherence to the well-established software engineering principles of modularity, information hiding, polymorphism, and extendibility. The relationships described are language-independent and may be encoded in a variety of ways using modern programming languages. The dissertation describes how interface-only components, templates, inheritance, and other language mechanisms may be used to encode these relationships. Specific examples are provided in RESOLVE/Ada95, a component-based software engineering discipline that uses Ada as an implementation language.