面向对象&&面向过程
8/10/2016 3:43:59 PM
UML创始人之一Grady Booch在2004年IBM Developer Works Live大会的访谈中讲过一段流传甚广的话:
我对面向对象编程的目标从来就不是复用。相反对我来说,对象提供了一种处理复杂性问题的方式。这个问题可以追溯到亚里士多德:您把这个世界视为过程还是对象?在面向对象兴起运行之前,编程以过程为中心,例如结构化设计方法。然而,系统已经到达了超越其处理能力的复杂性极点。 有了对象,我们能够通过提升抽象级别来构建更大的、更复杂的系统–我认为,这才是面向对象编程运动的真正胜利。
面向过程方法论定义
以数据为中心,以自顶向下方法将复杂数据加工处理逐步分解为简单、独立模块的开发方法。
面向过程方法论设计系统过程:
1. 首先要将现实世界中的所有过程描绘出来,确定其因果关系。
2. 再通过结构化设计方法,将这些过程细化,形成可以控制的、范围较小的部分。
- 通常是找到过程的起点,顺藤摸瓜,分析每一个部分,直到达到过程的终点,这个过程中每一部分都是过程链上不可分割的一环。
- 世界的一切都不是孤立的,它们相互紧密联系到一起,缺一不可,相互影响,互相作用,并形成一个个具有严格因果律的小系统。
- 大的系统由一个个相互关联的小系统组成。每个小系统都有明确的开始和明确的结束,开始和结束之间有着严谨的因果关系。只要我们将这个小系统中的每一个步骤和影响这个小系统的所有因素都分析出来,我们就能完全定义这个系统的行为。
- 计算机通过数据来记录过程的变迁,过程中每一步都会产生、修改或读取一部分数据,一个环节完成后,数据将顺着过程链传递到下一个部分,直到预期的状态。
面向过程总结
1. 把现实世界描绘为数据在信息系统中的流动,在数据流动过程中数据发生转化。
2. 通过自顶向下的方法将复杂的功能分解为独立、简单的子功能。
3. 基本特点:自顶向下、逐步求精、模块化设计、结构化编码
由于数据是如此的重要,数据的正确性和完备性对系统的成功与否至关重要。为了更好的管理数据,不至于让系统运行紊乱,人们通过定义主键、外键等手段将数据之间的关系描绘出来,结构化组织起来,利用关系数据库的三大范式来保证其完备性和一致性。
随着需求越来越复杂,系统越来越大,功能点越来越多,一份数据经常被多个过程共享,经常会出现相矛盾的数据需求,功能结构图并不能以树状结构展示,而是网状结构。
IBM在70年代提出了UC矩阵以试图解决功能点和数据之间的依赖问题。
(1) 首先将功能点和数据分别作为横纵坐标组成一个二维矩阵,在横纵坐标的每个交叉点上标记功能点对数据的要求,即U(use)和C(create)。
(2) 将C尽量放在整个矩阵的对角线上,这样,各个功能点对数据的交叉依赖为最小。
(3)最后再把相邻的功能点分组,由此来获得数据交叉依赖性最小,功能聚合最紧密的子系统。
总之,过程中的每一步都是预设好的,有着严谨的因果关系。可惜绝大部分的系统需求无时无刻不在发生变化,任何需求的变化都会导致牵一发而动全身。
面向对象
面向对象方法论将世界看成一个个相互独立的对象,相互之间并无因果关系,它们平时没有任何联系。只有在某个外部力量的驱动下,对象之间才会依据某种规律相互传递信息。这些交互构成了世界的一个“过程”。在没有外力的情况下,对象保持“静止”状态。
面向对象方法论定义
以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统的方法。
从微观角度看
对象有坚硬的外壳,从外部看,除了用来与外界交互的消息通道处,对象内部就是一个黑匣子,这就是封装;
对象结合成一起形成新的对象,具有了不同的特性,这就是聚合;
对象可以繁育,孩子拥有父辈全部本领,这就是继承;
对象都长着相同的脸,背后却有不同的行为,这就是多态;
从宏观角度看
对象是短视的,它不知道身处整个世界是怎么回事,也不知道它的行为是如何贡献给这个世界的。它只知道与它有着联系的身边的一小群伙伴(依赖关系),并与伙伴保持着信息交流的关系(耦合关系)。
对象是自私的,即使是伙伴之间,也只允许其它对象通过向外公布的窗口(方法)进行交流。
对象或许是没有纪律的,一旦我们确定了一系列的规则,把符合规则要求的对象组织起来形成特定结构,它们就拥有了某些特定的能力。给这个结构一个推动力,它们就能做出规则要求的行为。
面向对象方法论
1. 每个对象只与有限的其它对象有关系,分析对象时,考虑的信息量大大减少,自然减化了面对的复杂程度。
2. 只要符合规则要求,标准零件可以替换,比如可以是A或B工厂生产的,可以是钢的或合金的,这样带来了极大的灵活性和扩展能力。
3. 拥有天然清晰的抽象层次,无论在哪个层次上,只需面对有限复杂的对象和结构,专心了解这个层次上的对象就可以了,低层次的对象更换不会影响高层次的功能。
两种方法论的区别
面向对象方法论:
1. 把世界看作相互独立的小对象。这些对象根据某种规则组织起来,完成一个特定的功能。
2. 分析设计就是对象获取,过程由特定规则组织起来的一组对象表现出来。
3. 数据与过程不分离
先问请有多少部门,多少岗位,再找到每一个岗位的业务代表,问他们类似的问题:你平时做什么?每件事是谁交办的?做完了你需要通知或传达给谁?做这件事你需要填写些什么表格?
面向过程方法论:
世界由紧密联系的数据和过程组成。
分析设计就是过程分析。
数据与过程分离
先问请多少业务流程,画出业务流程图,找出业务流程中每一步骤的参与部门或岗位,弄清楚参与者所做的事情和填写表单的结果,并关心用户是如何把这份表单传给下一个环节的。
面向多项方法论的问题
1. 对象是怎么被抽象出来的?现实世界与对象世界的差别那么大,为什么要这么抽象而不是那么抽象?(Why)
2. 对象世界可以任意组合,可是我们怎么知道某个组合正好满足了现实世界的需求?什么样的组合是好的,什么样的组合是差的?(How)
3. 抛开现实世界,对象世界是如此的难以理解,如果只给一个对象组合,怎么才能理解它表达了怎样的含义呢?(What)
不要怀疑面向对象是否错了,而是现实世界与对象世界之间存在一个鸿沟–抽象。抽象是面向对象的精髓所在。UML代表的面向对象分析设计方法,架起了跨越这道鸿沟的桥梁。
注:此文来自UML老师夏辉课程,我加以总结分享