读Thinking in UML(p1-p8)


面向对象 Vs 面向过程

摘抄说的比较好地方:

  1. 当系统已经达到了超越其处理能力的复杂极点,有了对象,就可以通过提升抽象级别来构建更大的、更复杂的系统。这是面向对象的作用。所以面向对象其实是帮我们构造更为复杂的系统来解释越来越复杂的现实世界。所以,比掌握具体的技术更加重要的是掌握认识论所采用的方法和分析过程
  2. 面向过程最大的问题就是,它所描述的世界里面的一切都是紧密练习在一起的,互相影响互相作用。在真实的世界中,过程,本身就是一个可变的因素,如果过程随意变化,那么依赖过程的分析法,必然会随之而变。而对于面向对象理念来说,这个世界是分割开来的,并且只有在特点的场景之下,孤立对象之间进行了某些信息交互才表现出我们所看到的的那样一个过程。
  1. 在面向过程的分析中,如果我们要构成一个复杂的系统,那么就要把所有的因素考虑到,把因素的因果关系都分析清楚,再把过程模拟出来,这个过程太难了(这里我得到的提示是:有时候当我想要做单元测试,把覆盖全部场景等同于找到所有的触发点和因素,模拟过程,这简直是和面向过程分析,是一样的道理。也许会有更加巧妙的方式。)。所以如果我们使用面向对象分析,那么就可以把大的系统拆分出很多小的东西,然后再按照交互的规则,对他们进行分析,就能得到最终复杂的系统。

 

面向对象的特性

  1. 对象有着坚硬的外壳,从外部看来,除了它用来与外界交互的消息通道之外,对象内部就是一个黑匣子,什么也看不到,这称为封装
  2. 对象可以结合在一起形成新的对象,结合后的对象具有前两者特性的总和,这称为聚合
  1. 对象可以繁育,产下的孩子将拥有父辈全部的本领,这称为继承
  2. 每个对象都有多个外貌,在不同情况下可以展现不同的外貌,但本质只有一个,这就是接口
  1. 而多个对象却可能长看相同的脸,但同样的这张脸背后却是不同的对象,它们有着不同的行为,这就是多态
  2. 从宏观角度说,对象是“短视”的,它不知道也无法理解它所处的宏观环境,也不知道它的行为会对整个宏观环境造成怎样的影响。它只知道与它有着联系的身边的一小群伙伴,这称为依赖,并与小伙伴间保持着信息交流的关系,这称为耦合
  1. 同时对象也是“自私”的,即便在伙伴之间,每个对象也仍然顽固地保护著自己的领地,这称为类属性,只允许其他人通过它打开的小小窗口,这称为方法,进行交流,从不允许对方进入它的领地。然而对象也喜欢群居,并且总是“物以类聚,人以群分”。这些群居的对象有着一些相似的性质,它们依靠这些相似的性质来组成一个部落。对象们寻找相似性质并组成部落的过程称为抽象,它们组成的部落称为
  2. 部落里的每个成员既有共同的性质又有自己的个性,我们只有把特有的个性赋给部落成员才能区分它们并使它们活动起来,这称为实例化

分析对象时,不需要动辄就把整个世界拉下水,从头到尾分析一遍,我们只需要关系与它关系的那几个对象。这使得我们在分析对象的时候需要考虑的信息量就大大减少了,自然就简化了我们所面对问题领域的复杂程度。

这让我想起来,当我在分析一个框架的源代码的时候,总是喜欢从数据的源头,或者是触发点开始去熟悉框架应该做的事情,俗称先去了解主体流程,但是这个方案真的是合适的吗?如果按照面向对象的分析方式,先分析出系统或者框架里面的重要组成部分,然后分析他们之间的关系,以及依赖,包括他们是如何配合完成一系列操作的,这种方法,对分析的效率是否会有提升,这个待确定。