<p>Preface xvii<br>Acknowledgments xxv<br><strong>Chapter 0: Motivation 1</strong><br>0.1 The Goal: Faster, Better, Cheaper! 3<br>0.2 Application vs. Library Software 5<br>0.3 Collaborative vs. Reusable Software 14<br>0.4 Hierarchically Reusable Software 20<br>0.5 Malleable vs. Stable Software 29<br>0.6 The Key Role of Physical Design 44<br>0.7 Physically Uniform Software: The Component 46<br>0.8 Quantifying Hierarchical Reuse: An Analogy 57<br>0.9 Software Capital 86<br>0.10 Growing the Investment 98<br>0.11 The Need for Vigilance 110<br>0.12 Summary 114<br><strong>Chapter 1: Compilers, Linkers, and Components 123</strong><br>1.1 Knowledge Is Power: The Devil Is in the Details 125<br>1.2 Compiling and Linking C++ 129<br>1.3 Declarations, Definitions, and Linkage 153<br>1.4 Header Files 190<br>1.5 Include Directives and Include Guards 201<br>1.6 From .h /.cpp Pairs to Components 209<br>1.7 Notation and Terminology 216<br>1.8 The Depends-On Relation 237<br>1.9 Implied Dependency 243<br>1.10 Level Numbers 251<br>1.11 Extracting Actual Dependencies 256<br>1.12 Summary 259<br><strong>Chapter 2: Packaging and Design Rules 269</strong><br>2.1 The Big Picture 270<br>2.2 Physical Aggregation 275<br>2.3 Logical/Physical Coherence 294<br>2.4 Logical and Physical Name Cohesion 297<br>2.5 Component Source-Code Organization 333<br>2.6 Component Design Rules 342<br>2.7 Component-Private Classes and Subordinate Components 370<br>2.8 The Package 384<br>2.9 The Package Group 402<br>2.10 Naming Packages and Package Groups 422<br>2.11 Subpackages 427<br>2.12 Legacy, Open-Source, and Third-Party Software 431<br>2.13 Applications 433<br>2.14 The Hierarchical Testability Requirement 437<br>2.15 From Development to Deployment 459<br>2.16 Metadata 469<br>2.17 Summary 481<br><strong>Chapter 3: Physical Design and Factoring 495</strong><br>3.1 Thinking Physically 497<br>3.2 Avoiding Poor Physical Modularity 517<br>3.3 Grouping Things Physically That Belong Together Logically 555<br>3.4 Avoiding Cyclic Link-Time Dependencies 592<br>3.5 Levelization Techniques 602<br>3.6 Avoiding Excessive Link-Time Dependencies 704<br>3.7 Lateral vs. Layered Architectures 722<br>3.8 Avoiding Inappropriate Link-Time Dependencies 739<br>3.9 Ensuring Physical Interoperability 753<br>3.10 Avoiding Unnecessary Compile-Time Dependencies 773<br>3.11 Architectural Insulation Techniques 790<br>3.12 Designing with Components 835<br>3.13 Summary 908<br>Conclusion 923<br><strong>Appendix: Quick Reference 925</strong><br>Bibliography 933<br>Index 941</p>