系统设计的核心要素
在面向对象软件设计的语境中,其核心究竟为何?我们所探讨的,是基于Java或C#等面向对象语言的软件系统设计,软件系统设计的核心问题是什么呢?关键在于如何使系统既易于维护又具备较好的复用性,实现软件的可维护性和可复用性,正是我们设计系统的终极目标。
要达到这一目标,绝非易事,一个成功的软件系统必然具备可扩展性、灵活性、以及可插入性这三个关键特质,如何获得这些特质呢?答案就在于深化软件的可维护性和复用性,这似乎是一个循环,但却是设计的基石。
要实现软件系统的设计目标,基础在于以设计原则和设计模式为指导,如在《Java与模式》一书中提及的“支持可维护性的复用”概念,其核心含义是在保持甚至提升系统可维护性的同时,实现系统的复用,这背后的支撑,正是我们之前提及的设计原则和模式。
设计原则具体有哪些?它们与设计模式之间又有什么联系呢?在面向对象设计中,存在六个主要的设计原则(这些原则大多与复用相关,但并非全部):
1、开闭原则 - 允许软件实体(如类、模块等)在不修改原有代码的情况下被扩展。
2、里氏代换原则 - 子类必须能够替换其基类,且替换后软件单位的行为不会发生改变。
3、依赖倒转原则 - 高层模块不应直接依赖于低层模块,它们应该依赖于抽象。
4、接口隔离原则 - 客户端不应该被强制依赖于它们不使用的接口。
5、组合/聚合复用原则 - 优先使用组合或聚合的方式复用代码或对象,而不是继承。
6、迪米特法则 - 一个类应该只有一个单一的功能或责任。
如何在实际设计中遵循这些原则呢?答案就是运用设计模式,设计模式可以看作是为了遵循设计原则而制定的一些指导性方法或解决方案,它们大致可以分为三类:创建型模式、结构型模式和行为型模式。
再谈及特质的保证,一个具备可扩展性、灵活性和可插入性的软件系统是如何实现的呢?
1、可扩展性主要依靠开闭原则、里氏代换原则、依赖倒转原则以及组合/聚合复用原则,遵循这些原则,系统自然能够达到可扩展的目标。
2、灵活性则可以通过开闭原则、迪米特法则和接口隔离原则来确保。
3、而对于可插入性,开闭原则、里氏代换原则、组合/聚合复用原则以及依赖倒转原则共同作用,使得系统具备这一特性。
当我们的软件系统拥有了上述三个特质,那么我们在软件设计的可维护性和可复用性方面的目标也就得以实现,可以想象,一个优秀的软件系统,从最初的设计阶段就严格遵循了这些设计原则和模式,为日后的维护和复用打下了坚实的基础。