面向对象(Object Oriented),如何翻译这个词有很多说法,有人说这个翻译不够准确,应该是“物件导向”更准确,个人认为后者更直白更好理解,以“物件”为导向目标。
1.面向对象(OO)
编写软件是为了解决某一问题,OO思想就是在编程过程中把“问题域”中的内容映射到软件系统中的一个个"物件"上,“物件”作为一个独立的个体,有自己的功能、状态以及与其他“物件”之间的联系,这些个体互相作用最终解决问题。
oo是把“问题域”中的内容经过抽象分析,在软件的世界中创造与之对应的对象,这样在思考问题的解决时,更符合人对世界的认识思维模式,毕竟人在现实世界中碰到的问题、思考的问题形成的思维模式更易于理解并具有普遍性。而这些好处,对于软件的开发的可维护性、可扩展性以及可复用性等都是有极大的好处的。
2.面向对象和面向过程
与面向对象对应的是“面向过程(Procedure Oriented)”,它是以过程为中心,分析出解决问题需要的步骤,然后这些步骤一步一步实现,使用的时候一个一个依次调用。这种解决问题的思维模式和我们上学时解数学方程式的方式差不多。我们在学写程序的时候,最开始学的一般也是这种方式,所以对与这种方式应该也不陌生,它也影响了我们在coidng过程中的实现,或者说潜意识的实现。
面向对象和面向过程按发展的时间顺序来看,面向过程在前,面向对象是软件行业发展的一定程度时慢慢兴起的,这是的软件系统所涉及的内容更加多,解决的问题更加复杂,实现的方案更加庞大,这些问题驱使着更加适合的编程思想的出现。我们不能说面向对象的变成就比面向过程的思想好,因为它们在解决不同的问题时,有各自的优势,对于系统级的应用以及需要性能和实时性的模块中,对于那些对系统掌控能力比较强的程序员来说面向过程的编程思想更适合。很多时候,面向对象的编程思想设计实现的代码中包含面向过程的思想。
3.OOA、OOD和OOP
面向对象(OO)更详细的可以分为OOA,OOD,OOP。采用面向对象进行分析的方式称为OOA,采用面向对象进行设计的方式称为OOD,采用面向对象进行编码的方式称为OOP。面向过程(OP)和面向对象(OO)本质的区别在于分析方式的不同,最终导致了编码方式的不同。我们在拿到一个软件需求时,肯定要先分析需求,然后概要设计、详细设计,最后编码。这和我们习惯的人类基本行为方式的是一样的:先想做什么,再想如何去做,最后才是做事情。
4.面向对象的四个基本特征
面向对象的四个基本特征 抽象、封装、继承、多态。
抽象就是把事物的信息细节进行提炼、抽象,找到事物的本质和重要属性,以求简化、概括所观察到的现实世界,并为人们所用。抽象包括两个方面,一是过程抽象,二是数据抽象。过程抽象是指任何一个明确定义功能的操作都可被使用者看作单个的实体看待,尽管这个操作实际上可能由一系列更低级的操作来完成。数据抽象定义了数据类型和施加于该类型对象上的操作,并限定了对象的值只能通过使用这些操作修改和观察。抽象是软件开发的基础。
封装是将数据以及加在这些数据上的操作组织在一起,成为有独立意义的对象或构件。这些构件隐藏了外部无法直接访问的一些数据,并提供一定的访问接口来进行操作这些数据。信息隐藏是用户对封装性的认识,封装则为信息隐藏提供支持。封装保证了模块具有较好的独立行、自治性,使得程序维护修改较为容易。
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。这也是对事物进行抽象分析之后得出的结果。对象的一个新类可以从现有的类中派生,这个过程称为类的继承,新类可以从它所派生的类那里继承方法和实例变量,并且可以修改或增加新的变量、方法使之更适合特殊的需求。继承性很好地解决了软件的可重用性问题。
多态是指对同一操作或消息不同的对象能做出不同的响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。其中会涉及的两个概念覆盖和重载,是多态性的表现形式。覆盖,是指子类重新定义父类的虚函数的做法。重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
面向对象的编程思想能够使得人们在编写程序、设计软件的过程中有迹可循,以更加熟悉和普遍的思维模式,更高效地编写出更具有可维护性、可扩展性、可复用性的程序软件,这也是每一个程序员现阶段编程必须具备的基本素质,也是成为更加优秀程序员的必备的知识。