首先给出我自己的简单理解
编程的目的就是为了实现一项功能,而一项功能的实现少不了一些彼此关联的步骤。这些关联的步骤广义上说就是一种过程,所以说无论是面向对象,还是面向过程,终归到最后都是实现一个功能,实现一个过程。只不过当用面向过程实现这个过程时,过程被分解为一个一个的功能,这些过程最终通过一些功能间的相互合作完成此过程。而当使用面向对象来实现这个过程时,过程被分解为一个个对象,这个过程最终通过对象简的相互合作完成。
两种编程方式至此看区别不大,无非一个使用功能,一个使用对象。
例如 发邮件 ,面向过程可能会划分为 1,填邮件头 2,填充内容 3,发送。
面向对象却不这么划分,但是它同样需要完成上述功能,要不最终过程(发送邮件)将无法完成。
面向对象划分方法为:一个邮件对象 提供如下功能:发送邮件 获取邮件头 获取邮件内容..甚至,面向对象提供的发送邮件的功能的实现 依然是 1,填邮件头 2,填充内容 3,发送。
重复了面向过程的方法,而且面向对象的实现更加复杂。
而且面向过程也能提供面向对象所提供的服务,只不过需要多写一些功能函数。
但是,问题在于,当过程(业务)发生变化时,例如发送邮件的过程,有些邮件我需要扫面敏感词,有些邮件我不扫面敏感词,对于这种要求,面向过程的处理方法就是写一个扫面敏感词的功能,重新组合最终的实现过程。而对于面向对象,也是建立一个扫描敏感词的方法,然后重新装配过程。
两者看上去没有什么区别,但是对于大的过程,比较复杂的过程,面向对象的优势才能突显。所以说在比较小的应用上,面向过程的优势更加明显。
从本质上来说 ,面向对象就是将面向过程中用到的函数封装起来,把一定得某些功能封装给能代表这些功能的对象。
这一封装的好处,就是当实现的业务逻辑相当复杂时,面向过程可能得 管理千万个函数,而面向对象可能只有上千个对象,而且这些对象是明白定义的。这样当新的需求变化时,面向过程需要同时与上千万个函数打交道,而面向对象只需与上千个对象打交道。
同时通过类似spring的技术,对象间的管理和配置变得更加容易。
对于类似javascript这样的技术,编程时的感觉更像是面向过程,但是从广义上来看,却又不是,因为javascript对功能进行了封装。
所以说 面向对象与过程的本质区别在于是否封装。
一旦程序使用了封装特性,由此所带来的一些好处也日益突显:继承,多态。。。
面向对象的类如何去找?怎么定义?
这也就是一个对封装的把握,怎么去把握封装,怎么把握每个封装个体之间的关系?是依赖,泛化,继承?
依赖又分为是组合,聚合,还是就是简单的依赖。。
对这些关系的把握,恰恰就是确定一些系统的临界点,完成更大封装的前提。由 小封装与小封装之间的交互,组成大的封装,大的封装与大封装之间的交互,最终组成整个系统。
要实现系统的健壮,可持续就应该在定义这些封装上面下一番苦功夫。通过一些外部的配置可以将某些封装弱化 ,例如依赖,通过spring的注入,可以弱化依赖,从而在依赖上达到更加健壮的目的。
对象与对象之间的各种关系,譬如依赖,泛化,继承,从另外一个角度来说也是一种面向过程,因为当一个对象依赖另外一个对象才能提供自己的服务时,实际上已经说明他提供的服务需要 一定的过程,这个过程就是指具体在什么地方调用依赖的类的功能来帮助自己提供服务。简单的说是广义上的面向对象。
编程的目的就是为了实现一项功能,而一项功能的实现少不了一些彼此关联的步骤。这些关联的步骤广义上说就是一种过程,所以说无论是面向对象,还是面向过程,终归到最后都是实现一个功能,实现一个过程。只不过当用面向过程实现这个过程时,过程被分解为一个一个的功能,这些过程最终通过一些功能间的相互合作完成此过程。而当使用面向对象来实现这个过程时,过程被分解为一个个对象,这个过程最终通过对象简的相互合作完成。
两种编程方式至此看区别不大,无非一个使用功能,一个使用对象。
例如 发邮件 ,面向过程可能会划分为 1,填邮件头 2,填充内容 3,发送。
面向对象却不这么划分,但是它同样需要完成上述功能,要不最终过程(发送邮件)将无法完成。
面向对象划分方法为:一个邮件对象 提供如下功能:发送邮件 获取邮件头 获取邮件内容..甚至,面向对象提供的发送邮件的功能的实现 依然是 1,填邮件头 2,填充内容 3,发送。
重复了面向过程的方法,而且面向对象的实现更加复杂。
而且面向过程也能提供面向对象所提供的服务,只不过需要多写一些功能函数。
但是,问题在于,当过程(业务)发生变化时,例如发送邮件的过程,有些邮件我需要扫面敏感词,有些邮件我不扫面敏感词,对于这种要求,面向过程的处理方法就是写一个扫面敏感词的功能,重新组合最终的实现过程。而对于面向对象,也是建立一个扫描敏感词的方法,然后重新装配过程。
两者看上去没有什么区别,但是对于大的过程,比较复杂的过程,面向对象的优势才能突显。所以说在比较小的应用上,面向过程的优势更加明显。
从本质上来说 ,面向对象就是将面向过程中用到的函数封装起来,把一定得某些功能封装给能代表这些功能的对象。
这一封装的好处,就是当实现的业务逻辑相当复杂时,面向过程可能得 管理千万个函数,而面向对象可能只有上千个对象,而且这些对象是明白定义的。这样当新的需求变化时,面向过程需要同时与上千万个函数打交道,而面向对象只需与上千个对象打交道。
同时通过类似spring的技术,对象间的管理和配置变得更加容易。
对于类似javascript这样的技术,编程时的感觉更像是面向过程,但是从广义上来看,却又不是,因为javascript对功能进行了封装。
所以说 面向对象与过程的本质区别在于是否封装。
一旦程序使用了封装特性,由此所带来的一些好处也日益突显:继承,多态。。。
面向对象的类如何去找?怎么定义?
这也就是一个对封装的把握,怎么去把握封装,怎么把握每个封装个体之间的关系?是依赖,泛化,继承?
依赖又分为是组合,聚合,还是就是简单的依赖。。
对这些关系的把握,恰恰就是确定一些系统的临界点,完成更大封装的前提。由 小封装与小封装之间的交互,组成大的封装,大的封装与大封装之间的交互,最终组成整个系统。
要实现系统的健壮,可持续就应该在定义这些封装上面下一番苦功夫。通过一些外部的配置可以将某些封装弱化 ,例如依赖,通过spring的注入,可以弱化依赖,从而在依赖上达到更加健壮的目的。
对象与对象之间的各种关系,譬如依赖,泛化,继承,从另外一个角度来说也是一种面向过程,因为当一个对象依赖另外一个对象才能提供自己的服务时,实际上已经说明他提供的服务需要 一定的过程,这个过程就是指具体在什么地方调用依赖的类的功能来帮助自己提供服务。简单的说是广义上的面向对象。