In Chapter 3, we discussed modules as a collection of related code. However, architects typically think in terms of components, the physical manifestation of a module.
Developers physically package modules in different ways, sometimes depending on their development platform. We call physical packaging of modules components. Most languages support physical packaging as well:
jar files in Java,
dll in .NET,
gem in Ruby, and so on. In this chapter, we discuss architectural considerations around components, ranging from scope to discovery.
Developers find it useful to further subdivide the concept of component based on a wide host of factors, a few of which appear in Figure 8-1.
Components offer a language specific mechanism to group artifacts together, often nesting them to create stratification. As shown in Figure 8-1, the simplest component wraps code at a higher level of modularity than classes (or functions in non object-oriented languages). This simple wrapper is often called a library, which tends to run in the same memory address as the calling code and communicate via language function call mechanisms. Libraries are usually compile time dependencies (with notable exceptions like dynamic link libraries (DLLs) that were the bane of Windows users for many years).
Components also ...