`
SunSteven
  • 浏览: 47360 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论
阅读更多
今天走在路上,思考有些程序员对面向对象,面向过程的差异。我把自己考虑的内容,记录下来。
面向过程在执行Main函数的时候,是一大段代码。它也想到进行改进。方面进行复用。所以,在面向过程中,产生了模块的概念。

举一个例子。(面向对象的多态性)

如果有5个算法,需要在5个算法之间进行切换。

在面向过程的方面是,建立一个模块,然后将5个算法函数放入到一个算法模块中。其中每个函数的名字必须不一样。
在面向对象中,建立一个接口,实现5个类,类名不一样,但函数名一样。

A、在无在XML配置化或者IOC注入情况下
   在main函数中,面向过程是Switch选择不同的函数,面向对象时Switch选择不同的对象,执行的同样方面。在测试的时候,基本查不多,因为都要对Main函数进行重新测试。面向对象的好处在于,函数名一样,类名不一样。这样语义可以表现得更加丰富。但本质上没有什么变化。
B、在有在XML配置化或者IOC注入情况下
   面向对象,可以将类名放入到xml中,在main中,进行读入然后进行实例化,然后调用统一的方法。
   IOC注入的时候,将父类放入到main中,然后在xml中,写入子类进行注入(需要注意在main中,要有该类的set方法
 
   在面向过程中,因为面向过程的编译器不支持 将函数名读入,进行动态编译。
产生的差异是软件工程的可维护性,可扩展性的差异。整体软件稳定性的差异。
  因为,如果采用面向对象的设计方式(即编译器是支持面向对象的实例化等特征),那么增加一个算法,只要增加的那个算法进行单元测试,并且xml变化一下。main函数不要进行单元测试。这样比起面向过程的main函数要全部测试一次,代价要小很多,尤其是项目中大量采用类似的方式,回归测试的压力会小很多,并且稳定性会非常好。

  
面向对象具有继承的特征  ,这样可以使得代码量减少。但是面向过程不具备这个特征。最主要的原因是面向对象的编译器支持这种特征。但面向过程的编译器不支持该种特征。

面向对象具有封闭性,在面向过程域的时候,模块无法做到哪些方面是Private,哪些方面是Protect。但面向对象可以具有明确的动作封装性,仅仅暴露Public。面向过程要全部暴露。这个特征也是编译器提供支持的。

面向对象具备状态,每个对象具有一定的语义。面向过程仅仅是动作,没有状态的语义。

比如在Jbpm中的task,他既有动作特征,也具备属性特征。这些内容进行封装之后,就会出现人类认识事物的本质是属性与动作的统一。面向过程的设计,是将动作与属性进行隔离,使得人在认识这个事物的时候,要从数据,控制2个层面深入抽象分析。分析的复杂度大大提高,对于大型程序的构建,复杂性就会出现无法把握的状态。

在面向对象中,对象的一些动作时依赖与属性的,必须要在Client端先设置一些属性,或者先调用几个方面,让对象中的属性状态改变之后,才能调用在方法中引用该属性。这个问题的本质是类责任的划分。在内存空间中,有一个专门的对象空间,他的状态的变化,以及哪些方面依赖于状态的变化,能够很容易的看到。对状态及方法的统一,作为该类的责任。所以会产生UML设计方面的状态图,并且在内存中,有调试工具,可以看到对象之间调用以及调用之前的属性设置。






人的思考过程是面向对象,还是面向过程?

在没有面向对象编译器支持之前,人的思考方式是面向过程中。因为有一个逻辑主线,但复杂度大大加深,并且测试困难,可维护性降低,程序升级困难。

有了这些问题之后,产生了新的设计方法学,及多态,继承,封装。首先让编译器支持这样的特征。编译器有了这些特征之后,人思考问题的方面就可以进行如下调整。

1、仍然有一个逻辑主线,类似Spring启动的时候,有一个顺序执行的过程。
2、重要的是,类的职责的划分,将有一些责任,复合人类语义的方面,进行划分。面向对象的本质上是降低人理解计算机行为的难度,让多态,封装,继承这些计算机能做的工作,交给后台计算机去处理。
3、职责划分明确之后,设计一些接口,在主程序进行调用。在不同的类中进行实现。要看Spring,Struts,Jbpm源码等,就要先了解这个框架执行的功能,然后看设计者将类责任的划分。
4、在具体的某一个类实现中,还是按照面向过程去思考,注意2点不同
第一个点是:类的责任要从面向过程中一整块进行划分为不同的类来进行执行,
第二个点是:一旦碰到未来需要扩展点,就需要按照面向对象的方面进行拆分。拆分结束后,按照面向过程中进行实现。实现过程中,如果发现具体的类如果有继续变化的点,那么就继续按照面向对象的方式进行拆分。



所以在面向对象的设计过程中,要考虑面向过程的逻辑主线,更为重要的是要考虑在主线中有哪些变化的,可以通过接口进行隔离的。

如自己设计一个事情机制。
  逻辑主线是事件源产生事件,(变化点可能多多个事件源,可能产生多个事件种类),事件的注册,事件的通知,事件的执行。这些逻辑概念完全可以在一个类中按照面向过程的方面写出来。但面向变化不够,程序可扩展性大大降低。

采用哪个面向对象的设计方法
设置几个类名词:客户端、事件源、事件对象,事件注册、事件执行
客户端负责创建 事件源,创建事件对象,将事件源与事件对象进行关联(事件源事件对象可采用桥接模式),然后firevent(即调用事件注册者的notify动作),这个类不需要知道如何通知事件的,因为责任不在这个类中。他仅负责顺利的调用这个notify动作就可以了。

事件注册:该类中的notify,通知所有在本类中注册的事件,所以需要具备list集合,add,remove的方法。
事件执行,每个事件执行动作中,要判断事件是否是自己要响应的种类,如是,即执行自己的方法。

  

面向对象中6大设计原则的理解
1、类单一责任原则,在前面全面描述过
2、依赖倒置原则,高,低层全部依赖接口。这样可以实现工厂化并行生产,可规模化提高效率。
3、迪米特法则:朋友越少越好。保证内聚性,便于进行测试。这是类责任划分时候的一个原则,不能划分类责任结束之后,各个类之间都要依赖。这个原则也是判断设计者在类划分原则的时候,是否科学。因为在类划分的时候,每个设计者都会不一样,但那个更好,这个原则就是检验的标准。
4、接口隔离原则,在实现类的时候,如果每个类全部单一责任,类的数量会很多,但可以保证接口单一。这样可以更好的保持封装性。如一个类可能有2个接口,一个是窄接口,一个可能是宽接口。
5、里斯替换原则:所有父类的地方,子类都能进行替换,这个事面向接口编程的一个主要理论依据(面向接口编程,可实现变化点采用注入的方面,保证某个类实现变化后,高层不需要进行任何变化(需要采用XMl的方面,注入)

6、开闭原则,面向修改关闭,面向扩展开放。是应用上面5个原则之后,达到的效果。
还有一些设计模式,修改是不变的,开闭原则
1
2
分享到:
评论
3 楼 feidragon319 2012-03-31  
同文章结合《面向对象的思考过程(原书第2版)》是本不错的书,同样值得借鉴阅读
2 楼 SunSteven 2012-03-31  
面向对象设计者 在设计的时候,不仅仅关注整个过程化的内容。还要关注变化点(以后在需求分析文档中,就要包含一个专门的章节即 业务未来可能变化分析,这个信息非常关键,为以后程序的可扩展性打下基础 )。另外还需要根据类责任的设计,关注对象之间的交互信息。
1 楼 Witwang 2012-03-31  
顶,对面向对象面向过程的困惑又少了一点

相关推荐

    设计模式:可复用面向对象软件的基础--详细书签版

     另外,这也不是一篇高级专题技术论文,而是一本关于设计模式的书,它描述了在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案。设计模式捕获了随时间进化与发展的问题的求解方法,因此它们并不是人们从...

    设计模式可复用面向对象软件的基础

    另外,这也不是一篇高级专题技术论文,而是一本关于设计模式的书,它描述了在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案。设计模式捕获了随时间进化与发展的问题的求解方法,因此它们并不是人们从...

    设计模式可复用面向对象软件的基础 pdf(一文件)

    <br> Rational 软件公司首席科学家 Grady Booch <br>本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好...

    漫谈设计模式:从面向对象开始(带书签扫描版).刘济华.pdf

    本书主要从最基本的设计模式入手,并结合一些J2EE开发过程经常遇见的技术和概念,你将全面理解这10多个设计模式,并在开发过程中,让你真正体会和思考面向对象编程的思想,也只有掌握这些,你才会能成为一位真正的...

    Java 实现的面向对象软件设计模式

    设计模式(Design pattern)是用于面向对象程序设计的、有效提高代码重用效率、有着明确使用场景分类的程序设计规范的总结。使用设计模式的 目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计...

    Java零基础-面向对象和面向过程.md

    内容概要: 本文档详细介绍了Java编程中的面向对象编程(OOP)和面向过程编程(Procedural Programming)两种主要编程范式...推荐深入学习和实践面向对象编程的概念、原则和设计模式,以提升代码的可重用性和可维护性。

    设计模式--可复用的面向对象技术

    设计模式  设计模式(Design pattern)... GoF的“设计模式”是第一次将设计模式提升到理论高度,并将之规范化,本书提出了23种基本设计模式,自此,在可复用面向对象软件的发展过程中,新的大量的设计模式不断出现。

    漫谈设计模式:从面向对象开始.azw3

    《漫谈设计模式:从面向对象开始》主要从最基本的设计模式入手,并结合一些J2EE开发过程经常遇见的技术和概念,你将全面理解这10多个设计模式,并在开发过程中,让你真正体会和思考面向对象编程的思想,也只有掌握...

    JAVA面向过程的程序设计

    1. 面向过程的程序设计 面向过程——面向机器 –其中心思想是用计算机能够理解的逻辑来描述和表达待...•因此可以简单地讲,对象是面向对象的程序设计模式,它由描述状态的属性(变量)和用来实现对象行为的 阅读全文

    漫谈设计模式:从面向对象开始

    本书主要从最基本的设计模式入手,并结合一些J2EE开发过程经常遇见的技术和概念,你将全面理解这10多个设计模式,并在开发过程中,让你真正体会和思考面向对象编程的思想,也只有掌握这些,你才会能成为一位真正的...

    设计模式可复用面向对象软件的基础(中文版)

    另外,这也不是一篇高级专题技术论文,而是一本关于设计模式的书,它描述了在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案。设计模式捕获了随时间进化与发展的问题的求解方法,因此它们并不是人们从...

    面向对象的思维过程

    本文是关于面向对象思维过程系列文章的第一部分,选择这个主题作为书籍或专栏的标题是一个重大的决定,做出这个选择并不简单,因为已经有很多面向对象主题的好书和文章了,包括面向对象分析、面向对象设计、面向对象...

    从模式讲到设计模式再到面向对象设计模式

    从“模式”到“设计模式”,再到“面向对象设计模式”,这是一个从广泛到具体的过程。“设计模式”是一个广泛的概念,它既可以指建筑中的设计模式,也可以指软件开发中的设计模式等。“面向对象设计模式”是可复用...

    设计模式精解-GoF 23种设计模式解析附C++实现源码

    设计模式之于面向对象系统的设计和开发的作用就有如数据结构之于面向过程开发的作用一般,其重要性和必要性自然不需要我赘述。然而学习设计模式的过程却是痛苦的,从阅读设计模式的圣经——GoF的《设计模式:可复用...

    设计模式 GOF 23

    另外,这也不是一篇高级专题技术论文,而是一本关于设计模式的书,它描述了在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案。设计模式捕获了随时间进化与发展的问题的求解方法,因此它们并不是人们从...

    GoF 23种设计模式解析(附C++实现源码)

    设计模式之于面向对象系统的设计和开发的作用就有如数据结构之于面向过程开发的 作用一般,其重要性和必要性自然不需要我赘述。然而学习设计模式的过程却是痛苦的,从 阅读设计模式的圣经——GoF 的《设计模式:可...

    漫谈设计模式

    《漫谈设计模式》主要从最基本的设计模式入手,并结合一些J2EE开发过程经常遇见的技术和概念,你将全面理解这10多个设计模式,并在开发过程中,让你真正体会和思考面向对象编程的思想,也只有掌握这些,你才会能...

Global site tag (gtag.js) - Google Analytics