我所理解的面向对象思想

来源:互联网 发布:武力收复台湾 知乎 编辑:程序博客网 时间:2024/05/21 05:39

学习OO这门课程已经半学期有余,收获还是不少的。虽然用JAVA也写了不少代码了,但对于面向对象的思想却不敢说已经全部掌握。说到底,为什么我还是找不到对象……啊呸,面向对象的编程思想到底是个什么东西呢?

什么是面向对象思想

这里我斗胆引用了度娘对于这一概念的论述:

“从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以问题域(现实世界)中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的对象,作为系统的基本构成单位(而不是用一些与现实世界中的事物相关比较远,并且没有对应关系的其它概念来构造系统)。这可以使系统直接地映射问题域,保持问题域中事物及其相互关系的本来面貌。”

       这段话初看上去很晕,但是其中涉及到了面向对象思想的一个重要的关键词:抽象。那么什么是抽象呢?抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。举例来说,在你的面前有一条狗,你如何去描述这条狗呢?对不同的人来说描述的方法不尽相同:如果你是个画家,那么你可能会把这条狗给画下来;如果你是个生物学家,那么你可能会把这条狗的学名给说出来;如果你本身十分怕狗,那么以上这些对于你来说都没有意义,你只会关心这条狗咬不咬人。产生这种差别的主要原因在于不同人对于同一个对象的关注点不同,对于我们不关注的东西我们可以选择性地忽略掉,然后集中注意力在我们关心的信息上。这在编程中的体现就是把现实世界中的某一类东西提取出来,用程序代码表示。抽象出来一般叫做类或者接口。对于上面那个怕狗的人来说,天底下所有的狗也许都能用这个类来表示:

class Dog{

   privateboolean bite;

   publicDog(boolean bite){

     this.bite=bite;

   }

   publicboolean ifBite(Person p){

     returnbite;

   }

}

       说完抽象,我们来谈谈封装。封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口。以上面这个Dog类为例,bite这个布尔值是狗的一种属性,在这里我们假设这条狗对于所有的人都一视同仁,要么咬,要么不咬,那么bite这个值是不会随外界环境的变化而变化的,同时我们假设这条狗从表面上看你是看不出它到底咬不咬人的,所以我们不能直接获得这个bite的属性,得通过其他途径来获得。小平爷爷告诉我们:时间是检验真理的唯一标准,所以我们将一个人扔到这条狗面前,观察它有没有咬他。如果咬了那么我们就可以断定这条狗就是咬人的,然后我们就可以准备跑路了。以上这一系列动作都被ifBite()这个方法所概括,我们不需要知道这个咬不咬人的结果究竟是哪里来的,即类的内部实现机制是隐藏的。我们要做的只是扔个人给它,至于它怎么判定究竟是咬还是不咬就和我们没有关系了,这就是封装。

       假如你本身很怕狗,但是偏偏不巧的是你家里就养了一只狗。而且这只狗咬不咬人还会看人,至少家里人是不会咬的。那么上述的抽象模型就显得不够用了。我们需要一个更加详尽的Dog模型,但我们很懒,又不希望上面写的这些代码白费,此时就需要继承派上用场了。

class MyDog extends Dog{

   privateString name;

   privatePerson[] family;

   publicMyDog(String name,Person[] family,

booleanbite){

     super(bite);

     this.name=name;

     this.family=family;

   }

   publicboolean ifBite(Person p){

     if(!super.ifBite(p)){

        returnfalse;

     }

     for(inti=0;i<family.length;++i){

        if(family[i]==p)

          returnfalse;

     }

     returntrue;

   }

   publicString getName(){

     returnname;

   }

}

在上面的代码中,我们可以给我们的狗取名字。在构造具体的Dog对象的时候,我们可以传入一个Person的数组代表这条狗的家人,用来判断到底咬不咬。我们重载了ifBite()方法,对于不同的人这条狗终于能够做出不同的反应了。

最后我们来谈谈多态。在多态出现之前,如果一个两个函数表示的是相同或相似的意义,区别仅仅是传入的参数的话,由于函数命名的限制,我们只能将其中一个命名为method_1,另一个命名为method_2或者其他类似的命名。这种命名方法很不直观,不能突出方法本身的意义。在有了多态之后,我们可以大胆地将相似的方法采用同样的命名,而他们之间可以通过不同的参数列表来进行区分,这样就达成了我们的目的:解决了方法同名的问题,同时使方法含义更为直观。

面向对象思想有什么好处

“不要打架,不要打架,OO好处都有啥,谁说对了就给他。”前面都介绍了那么多OO思想了,那么OO思想究竟有什么好处呢?

要介绍OO思想的好处,我们需要另一种程序设计方法来做对照。在面向对象程序设计方法之前普遍采用的是面向过程的程序设计方法。它的主要思想是将一个复杂问题根据功能等分成一个个子问题,然后再接着细分,直到分解成具体的语句。这样做有一个较大的缺点:数据和函数是分开的。如果我们对数据结构进行了修改,那么所有相关的函数都要进行修改。如果该函数在多个地方被调用,那么这些地方也都要做相应的修改。这样做十分容易遗漏一些地方,导致不必要的BUG,效率也不高。

而面向对象程序设计则将数据和方法绑定在一个类中,类的封装保证了用户不会直接接触到类的数据域以及具体实现。这意味着如果我们要对底层的数据结构或者方法实现进行修改时,只要该类的接口不改变,那么其他使用该类的程序就不用做修改。这从本质上提高了程序的可扩展性和可复用性。

同时,采用OO思想写出的程序条理更为清晰。只要我们一开始能够做出一个好的规划,那么在接下来的编程中我们在每一个时刻只需关注整个代码中很小的一个局部的实现。这也为多人合作的Coding模式提供了方便。

如何实践面向对象思想

         多看优质的项目,学习别人好的代码风格。同时自己也要勤于操练,程序这种东西,不自己写写肯定是不能很好掌握的。在码代码之前要仔细分析需求,从中挖掘出类与类之间的关系。那么问题来了,挖掘机技术哪家强?

0 0
原创粉丝点击