
Up to this point in our journey through simple object-oriented design, our discussions have primarily focused on simplicity, consistency, abstractions, and extension points. We discussed how to apply these ideas from small methods to a set of classes. However, as we venture into large, multifaceted systems, our scope must broaden. We must consider not just classes within a single component but also how different components that perform entirely different business operations interact and integrate.
Think of a large-scale business system that takes care of an e-commerce shop. The billing system, which handles charging customers, is complex and most likely developed by one dedicated team. The same is true for the delivery system, which ensures that goods get to their buyers, and for the inventory system, which controls whether items are still available or if the shop has to restock them. Although these systems are different from each other, they must collaborate. The delivery system must consult with the inventory system before delivering goods. Billing must notify delivery that the invoice was paid and the goods can be delivered.