Note: 《面向对象分析与设计》第三版是一本好书,作者对面向对象的理解可以说是入木三分,好多观点都是经典。对编程思想有很好的帮助,再复习一下部分概念做个笔记。本文所有段落都出自此书前几章节,照书手打可能存在错别字。

####为什么要面向对象

人类渴望得到精神上的宁静、美学上的成就、家庭的安全、正义和自由。这一切都不能通过工业化的生产效率来直接满足。但是,生产效率让人们得到充足的物质享受,而不至于与匮乏苦苦斗争。这为精神、美学和家庭事务赢得了时间,也使得社会能够将一些特殊的技能赋予司法机构以及维护权利的机构。

“爱因斯坦认为自然界必定存在着简单的解释,因为上帝不是反复无常或随心所欲的。软件工程师没有这样的信仰来提供安慰。许多必须控制的复杂性是随心所欲的复杂性。”

“软件的复杂性是一个基本特征,而不是偶然如此”,这种固有的复杂性有4个原因:问题域的复杂性、管理开发过程的困难性、通过软件可能实现的灵活性,以及刻画离散系统行为的问题。

既然数学工具和我们的智能都不能够对大型离散系统的完整行为进行建模,对于系统的正确性,我们必须满足于可接受的信心级别。

对象模型原则:

抽象、封装、模式化、层次结构、类型、并发、持久

复杂系统的5个属性:

  1. 层次结构:复杂系统的架构师它所有的组件一件这些组件的层次结构的函数;
  2. 相对本原:对于一个观察者来说很基础的东西对另一个观察者可能具有很高的抽象层次;
  3. 分类关注:复杂系统“几乎是可分解的”。组件内部作用和组件间作用的差异让我们在系统的不同部分之间实现“分离关注”。能够以相对隔离的方式来研究每一个部分;
  4. 共同模式:许多复杂系统都是以一种“经济”的表达方式来实现的。层次结构通常是由少数不同类型的子系统按照不同的组合和安排方式构成的。复杂系统具有共同模式,可能涉及小组件的复用;
  5. 稳定的的中间形式:复杂系统趋向于随时间的演变,“如果存在稳定的中间形式,从简单到复杂系统的演变将更快”。

面相对象设计方法利用类和对象作为基本构建块,指导开发者探索基于对象和面向对象编程语言的表现力。只利用算法分解在处理大量复杂性情况时是有局限的,所以我们必须转向面向对象分解。

对象统一了算法抽象和数据抽象的思想。

面相对象的三个要点:

  1. 利用对象作为面向对象编程的基本逻辑构件块,而不是算法;
  2. 每一个对象都是某个类的实例;
  3. 类与类之间可以通过集成关系联系在一起。

如果不满足以上三点之一,就不是一个面向对象的程序,那只用利用抽象数据类型在编程。

面向对象编程方法的重点是正确有效地使用特定语言机制;设计方法的重点是正确有效地构建车复杂系统结构。 面相对象设计:面向对象分解过程和一种表示法,这种表示法用于展现被设计系统的逻辑模型和物理模型,静态模型和动态模型。

面向对象的设计导致了面向对象分解;面向对象的设计之用了不同的表示方法来表达系统的逻辑设计(类和对象的结构)和物理设计(模块和处理结构)的不同模型,以及系统的静态和动态特征。

面向对象分解的支持是面向对象设计与结构化设计的不同之处,前者利用类和对象抽象来构建逻辑系统结构,后者则利用算法抽象。

面向对象分析是利用从问题域的词汇表中找到的类和对象来分解需求”。

对象模型的四个主要要素:抽象、封装、模块化、层次结构;三个次要要素:类型、并发、持久。

  • 抽象:“描述了一个对象的基本特征,可以将这个对象于所有其他类型的对象区分开来,因此提供了清晰定义的概念边界,它与观察者的视角有关”。

对于给定的问题域决定一组正确的抽象,就是面向对象设计的核心问题。

  • 封装:“是一个过程,它分割构成抽象的结构和行为的元素。封装的作用是分离抽象的概念接口以及其实现” 抽象问题域,封装解决方案、外部试图、内部试图,明智的封装使可能改变的设计决策局部化。隐藏是为了防止事故,而不是防止欺骗。

  • 模块化:“是一个系统属性,这个系统被分解为一组高内聚,低耦合的模块”。

  • 抽象、封装、模块化的原则是相辅相成的。一个对象围绕单一的抽象提供了一个明确的边界,封装和模块化都围绕这种抽象提供屏障。

  • 聚合提出了所有权的问题
  • 类型是关于一个对象的类的强制规定,这样一来,不同的类型的对象不能够互换使用,或者至少它们的呼唤使用受到了非常严格的限制。

  • 持久是对象的一种属性,利用这种属性,对象跨越时间和空间而存在。

Comments