首页 > 代码库 > 浅谈面向对象

浅谈面向对象

    这段时间天天被米老师洗脑式的上课,讲的都是一个中心,面向对象!


    但是,面向对象到底是怎么回事儿呢?我们看一下维基百科里是怎么说的:


    面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。


    那么,他与传统的设计有什么不同呢?同样,在维基百科里给出我们答案:


    面向对象程序设计可以看作一种在程序中包含各种独立而又互相调用的对象的思想,这与传统的思想刚好相反:传统的程序设计主张将程序看作一系列函数的集合,或者直接就是一系列对电脑下达的指令。面向对象程序设计中的每一个对象都应该能够接受数据、处理数据并将数据传达给其它对象,因此它们都可以被看作一个小型的“机器”,即对象。


    我觉得这里有一个非常重要的一句话,就是“面向对象程序设计中的每一个对象都应该能够接受数据、处理数据并将数据传达给其它对象”,我觉得,如果我们做的项目里的任何一个对象不能够满足这一个,就无法称之为面向对象。


    举个我们最常用的例子:当我们写程序的时候,我们要写一个学生考试的功能,做过考试系统的人都知道,学生考试涉及到这几个问题,首先,是随机抽题还是固定题型,其实,是当场判卷还是考完后判卷,还有答案是否乱序等等,现在,如果我们现在用面向对象的设计思路应该怎么走?首先,把抽题封装成一个对象叫抽题类,在把判断是否判分封装成一个对象叫判分类,把答案是否乱序封装起来叫乱序类,之后我们会怎么做?我觉的想到这里还是很容易的,关键是,怎么向下进行?说一下我最初的想法:


    一开始的想法就是:不需要写一个考试的方法,实现抽题类.随机抽题,判分类.当场判分,乱序类.不乱序,最后返回给用户。很合理啊,而且如果用户需要改变抽题方式,只需要拓展抽题类就可以了。但是,我们有没有想过,即使这样,我们仍然需要修改客户端,也就是我考试类里的代码,那么,在进一步,我们可以用反射啊,把需要调用的写在配置文件里,让反射直接调用就可以了啊。但是,如果我们需要在加一项呢?比如,我们需要加一项如果分数不合适重取试卷?或者其他的,不管怎么样,我们都无法对考试类进行一个很好的封装。


    或者我们可以在仔细看一下,如果我们不用反射直接调用的话,我觉得更像一个面向过程的开发,因为考试类依赖于那三个类,我们没有办法在没有那三个类的情况下独立开发考试类!我们做的只是把一个类里的代码分成几份而已。


    下面,我们说一下经过了这些天激烈的斗争之后,现在如果在设计我们可能回是这样的:


    首先,我需要开发四个对象:抽题类,判分类,乱序类,考试类,总所周知,去除那些乱七八糟的东西,我们考试类其实就是拿到试卷,显示,所以考试类里现在东西很少了。那么,具体他们是怎么关联的,交给容器。


    所以,其次,我们的容器才是至关重要的,我们需要做的是,把这样写好的相互都不知道谁是谁的对象,扔到容器里,由容器决定他们之间的关系,而用户,直接和容器打交道即可。所以,如果有容器,我们开发者只需要开发一个个的独立的颗粒,说句通俗易懂的话,如果你开发一个颗粒里面要调用其他的颗粒,只要有这个过程,都不是纯粹的面向对象,具体怎么调用,让容器去决定。


    举个例子:我们小时候经常会遇到站队的情况,我们现在就可以把需要站队的人看成一个个对象,彼此之间没有关系,并没有说小A后面一定要关联小B,小C一定要和小D在一起,而我们老师通常会说,按大小个排列,大个在前小个在后,我们很自然的就知道这样排列,或者又来了另一个老师,那个老师说,男生一列女生一列,我们也就自动的按照男生女生去排列,我们的排列顺序,并不取决于我们,而取决是谁调用我们,也就是取决于我们放在哪个容器里,容器决定谁在我们前面,谁在我们后面。所以,作为开发者,我们只需要关心如果实现一个小A,或者小B,至于他们的关系,我们需要看看放在什么样的容器里面,这样,我们在开发过程中,就减少了对象之间的耦合,同时,在使用过程中,大大提高了复用,因为不论哪一种对象,我们这些对象都可以使用,试想一个,如果小A和小B时连体儿(也就是我们经常在代码里写的相互调用关系),如果小A、B能在从高到矮的队列中使用,那么从矮到高的队列中必然不能用,也就失去了复用的价值。


 

    这是这些天我的理解,而至于容器是如何管理这些对象的,因为没有实践,所以就不具体细说,这里就浅谈一下这些天对面向对象的一种理解,对与不对,欢迎指正!