软件的首要技术使命是管理复杂度。当没人知道对一处代码的改动会对其他代码带来什么影响时,项目也就快停止进展了。
在软件架构层次上,可以通过把整个系统分解为多个子系统来降低问题的复杂度。人类更易于理解许多项简单的信息,而不是一项复杂的信息。所有软件设计的目标都是把复杂问题分解成简单的部分。子系统之间的相互依赖越少,你就越容易在同一时间里专注问题的一小部分。精心设计的对象关系使关注点相互分离,从而使你能在每个时刻只专注于一件事情。在更高汇聚的层次上,包提供了相同的好处。
保持子程序的短小精悍也能帮助你减少思考的负担。从问题的领域着手,而不是从底层实现细节入手去编写程序,在最抽象的层次上工作,也能减少人的脑力负担。
如果所有的子系统都能同其他子系统通信,你就完全失去了把它们分开所带来的好处。应该通过限制子系统之间的通信来让每个子系统更有存在意义。
抽象是一种能让你在关注某一概念的同时可以放心地忽略其中一些细节的能力——在不同的层次处理不同的细节。以复杂度的观点看,抽象的好处就在于它使你能忽略无关的细节。
封装填补了抽象留下的空白。抽象是说:”可以让你从高层的细节来看待一个对象。“而封装则说:”除此之外,你不能看到对象的任何其他细节层次。“封装帮你管理复杂度的方法是不让你看到那些复杂度。
继承的好处在于它能很好地辅佐抽象的概念。抽象是从不同的细节层次来看对象的。继承能简化编程的工作。
信息隐藏是结构化程序设计与面相对象设计的基础之一,是软件开发中一个开拓性的概念。信息隐藏是软件的首要技术使命中格外重要的一种启发式方法,因此它强调的就是隐藏复杂度,这一点无论是从它的名称还是其实施细节上都能看得很清楚。
信息隐藏中所说的秘密主要分为两大类:
- 隐藏复杂度,这样你就不用再去应付它,除非你要特别关注的时候。
- 隐藏变化源,这样当变化发生时,其影响就能被限制在局部范围内。
按照信息隐藏的原则来思考,能够激发和促进某些设计决策的形成,而仅仅按照对象原则思考却不会。其差异很有启发性。
在设计的所有层面上,都可以通过询问该隐藏些什么来促成好的设计决策。这一问题可以在构建层面上协助你用具名常量来取代字面量,可以在类的内部生成好的子程序和参数名称,还有助于指导在系统层上做出有关类和子系统分解以及交互设计的决策。
请养成问”我该隐藏些什么?“的习惯,你会惊奇地发现,有很多棘手的设计难题都会在你面前化解。
抽象数据类型(ADT,Abstract Data Type)是指一些数据以及这些数据所进行的操作的集合。这些操作既向程序的其余部分描述了这些数据是怎么样的,也允许程序的其余部分改变这些数据。
对于人的理解力来说,7是一个神奇的数字。心理学研究发现,通常人类很难同时记住超过7个单位的信息。