原文出自于:http://www.cnblogs.com/chenlong/archive/2009/10/20/1586952.html
什么是面向对象
刚接触编程的时候,多数人本能的反映可能是面向过程(OP)的,而不是面向对象(OO)的。这种现象其实是很正常的,改变思维方式是需要一个过程的,我大体归纳了一下其形成的原因:
1、直接原因
你还没有养成面向对象分析问题和解决问题的习惯。建立面向对象的思维方式需要一定时间的训练和揣摩才能形成,所以你可以在学习或具体项目中刻意地强化这种意识。一般情况下,经过一段时间之后,你会觉得这是自然而然的事情,只有心中OO,眼中自然OO了。
2、历史原因
我们从小接受的培训都是采用面向过程(OP)的方式分析问题和解决问题,尤其是数学,多数是强调按部就班的解决问题,计算机软件的发展一直就与数学是很有渊源,所以,顺理成章的,把面向过程(OP)的方式带入到软件开发也是很自然的事情。
什么是面向对象,或者谈谈你对面向对象的理解,这恐怕是软件开发人员,尤其是程序员和设计师应聘的时候,面试官常最挂在嘴边的问题吧。面向对象对应的英文是Object-Oriented,把Object-Oriented翻译成“面向对象”,我一直觉得这个译法不太确切,因为多数人第一次看到“面向对象”这四个字,都很难从字面上理解它到底是什么意思。后来,我又查阅了一些有关的资料,发现港澳台的计算机书籍中是把它翻译成了“物件导向”,这个译法,我感觉不错,于我心颇有些戚戚焉。“物件导向”比较准确地反映了面向对象认识和解决问题都是要围绕对象展开的。
所以,面向对象的思维方式认为:软件系统是一组交互的对象的集合。一组相关的对象组合为一个子系统,一组子系统继续组合为更复杂的子系统,直至组合成整个系统。
面向对象方式的出发点是尽可能模拟人类习惯的思维方式,将“问题域”中涉及的内容抽象为“对象”,使软件开发的方法与过程尽可能接近人类认识世界解决问题的方法与过程。面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
面向过程认识和解决问题的思维,可以称为“流程论”,重点放在处理过程的步骤,流程是整个系统的核心。
面向对象认识和解决问题的思维,可以称为“组装论”,重心放在对象的抽象和提取上,然后将对象组装为整体。
所以OO和OP从思维方式来讲,出发点还是完全不同的。
OO认为:软件系统是一组交互的对象的集合。因为人类对现实世界是非常熟悉的,所以OO就是通过抽象的方式,把问题域映射到现实世界,尽量模拟现实世界的万事万物。通过这种方式,就可以运用现实世界中解决问题的方法与过程,来解决软件领域内的问题。有人说:OO眼里一切皆对象,这句话还是很有道理的。
示例请参考原文:http://www.cnblogs.com/chenlong/archive/2009/10/20/1586952.html
软件工程思想的出现是为了解决软件危机,而软件危机出现的原因并不是写不出程序了,而是写出来的程序无法修改、无法稳定运行!因为社会在进步,软件的需求也在不断的发展,这就要求我们的程序也能够随着需求的变化而变化,而传统的方法是无法解决这些问题的。面向对象技术的出现就是为了解决变化的问题,使软件能够适应变化。而为了这个变化,就需要程序建立更合理、稳定的结构;程序也就不可避免的变得更加复杂;不过这种复杂性却是很合理的,因为我们的现实世界本身就具有这种复杂性,面向对象在实现功能的时候,还在模拟着这个现实世界。面向对象的软件开发就是在应对软件危机过程中逐渐发展来的,面向对象思想让软件更容易扩展和维护。在搞软件开发时,编码不是最重要的,分析、设计才是最重要的,所以好的思想或架构是提高软件质量的一个保证。
自己的感悟:想起当时在联创实习时,当时要由3G前台组1.0转变成2.0,其实就是将相同的业务用不同的思想去体现,刚开始进小组时用的是1.0,面向过程式的解决问题,随着需求的变化,在主业务中删删改改,当时很多老同事说1.0的代码很难维护了,确实是,看那代码都头疼,将所有功能杂在一起,改了这,不知道会不会影响那。当时项目组就决定采用组件的思想,将相同的模块抽取出来,然后用各个组件去组装成一个完整的业务,现在才理解了项目经理当时说2.0才是真正的面向对象。确实后来在接到一个需求后,很多时候只需要改动组件就可以实现了,比方说:用户检验就是一个组件,这个在所有手机开户类流程中都有,把这个提取出来看作一个对象,就达到了很好的复用及扩展
坚持当你看到生活中每一个实体的时候都抽象出它的类,并把与它交互的一切都抽象出方法,最重要的是要有一种大局观,不要去纠结于任何一个细节,OO的思维中,重点是要把握“能做什么”而不是“怎么做”,能做什么是类/对象所具有的属性(方法),怎么做是方法的实现过程,这个在具体coding的时候解决吧,你可以写好一个让你一眼就能看出功能的方法名,然后就不管它,等搞定整体框架的设计之后,再把一个个方法填满吧
参考资料:
1.http://zhidao.baidu.com/question/259534836.html
2.http://articles.e-works.net.cn/414/Article31939.htm //Java初学者入门经典:面向对象的思维方法
3.http://www.uml.org.cn/mxdx/200906151.asp //面向对象的思维过程
4.http://knix.blog.163.com/blog/static/295750352010518103852763/ //从打印素数问题看面向对象的思维方式