系统设计是软件工程中的关键步骤,它涉及到将复杂的系统分解为可管理的子系统或模块。这个过程称为“系统分解”。在《Object-Oriented Software Engineering: Using UML, Patterns, and Java》这本书中,作者深入探讨了如何进行有效的系统分解。
系统分解与分析阶段寻找对象的过程类似,都是一个迭代的过程,需要不断调整和完善。最初的子系统分解应该基于功能需求来确定。这意味着,当分析功能需求时,可以识别出哪些对象或组件紧密相关,并将它们归入同一个子系统。
书中提到了几种指导原则或启发式方法来组织对象进入子系统:
1. 将在同一个用例中出现的对象分配到相同的子系统内。这样可以确保相关功能的聚合,便于理解和维护。
2. 为跨子系统传递数据的对象创建一个专用子系统。这有助于管理数据流,降低复杂性。
3. 最小化跨越子系统边界的关联数量,以减少子系统间的耦合度,提高系统的灵活性和可扩展性。
4. 同一子系统内的所有对象应具有功能上的相关性,确保子系统内部的逻辑一致性。
5. 使用外观(Facade)设计模式封装子系统。外观模式提供了一个简单的接口,用于与子系统交互,降低了客户端代码与子系统内部结构的直接依赖。
书中还给出了一个实际案例——MyTrip路线规划和执行系统的分析模型。通过UML图表(如图6-27所示),我们可以看到系统被初步分解为“Routing Subsystem”(路由子系统),“Planning Subsystem”(规划子系统)和“Trip Route Assistant Planning Service”(旅行路线助手规划服务)。这样的分解有助于清晰地组织和定义各个组件的职责。
此外,书中还以设计房屋布局为例,来类比系统设计中的优化问题。类似地,系统设计也需要考虑各种因素,如最小化通信成本、最大化效率和利用资源(比如图6-28中的子系统分解)。在这个例子中,考虑了房间的数量、空间布局、路径最优化以及充分利用自然光等因素,同样,系统设计中也要权衡性能、可扩展性和可用性等多方面的要求。
通过使用UML(统一建模语言)、设计模式和Java等工具和技术,系统设计师能够更有效地将复杂系统分解为可操作的部分,从而简化设计、增强可读性和可维护性。在设计过程中,采用启发式方法和模式可以帮助我们做出明智的决策,同时保持系统的整体性和一致性。