一个二年级菜鸟对于面向对象的一些感悟

来源:互联网 发布:ddg1000驱逐舰数据 编辑:程序博客网 时间:2024/04/19 17:27

       从C++到Java,我也做了两年面向对象编程了,从最初的课程设计到稍复杂的网站应用,移动端服务器,在做项目上,我一直有个疑惑,用的是面向对象的语言,但是在我的项目中哪里又体现了面向对象呢?面向对象到底有什么好处?今天是时候总结一下了。

       对于OO,我最大的感触是在用jdk或者Java其他类库的时候,只需要查阅api,在某个类中找到满足自己需求的方法,直接调用即可,而不用知道这个方法内部是怎么实现的,实例域具体是怎么表达的。我关注的是能否解决我的问题,而不是深入去了解怎么实现的,这也大大提高了工作效率。在实际编码中,只需要一个“.”就可以解决问题。封装给对象赋予了“黑盒”特征,调用者无法直接看到内部实现的细节,而对象内部可以任意修改,只要满足结果不变,外部访问的路劲不变。这样,外部和内部就完全隔离开来,但又是紧密联系的,按照软件工程的术语来讲就是高内聚,低耦合。当然,在封装之前必不可少的就是抽象了,深入事物本质,提取出他们共同的特征,把这些共同的属性和行为封装为一个类,提高了代码的可重用性。比如:老板某一天想做一个软件,这个软件的目的就是展示各种狗类。用面向对象设计的方法是:抽象出狗类所有共有的特征,颜色、性别、名称等属性,吃饭、睡觉等行为。然后把这些属性和行为封装成一个Dog类,这样创建一只哈士奇只需:new Dog(“哈士奇”),创建一只泰迪只需:new Dog(“泰迪”)。当然用面向过程设计的方法也可以解决问题,并提高代码可重用性,只需写一个创建狗类的函数,把名称,颜色,性别等属性作为参数即可。所以并不需要过多迷恋面向对象,只要能方便我们处理、解决问题就行。但是说真的,在代码可重用和项目维护上,面向过程真的要逊色于面向对象。

       面向对象四大特性,抽象、封装、继承、多态(抽象到底是不是面向对象一大特性?我觉得封装、继承、多态的前提就需要抽象,是必不可少的,所以我一直习惯把它算进去)。那么在一些简单需求的java web项目中,哪里又体现了面向对象呢。在我的印象中,项目只涉及了抽象和封装,而继承和多态并没有用到,也就没有感受到网上都在说的“项目可维护性高”的优点,这都得益于关系数据库的存在。有了关系数据库,很多东西都不需要我们去做。一个基于角色的学生成绩管理系统,存在三种角色:老师、学生、超级管理员。在没有关系数据库的情况下,我们理应设计一个基类,为这个类定义姓名、账号、密码、性别等基本属性,还需要有一个方法返回这个对象拥有的所有权限,并把它默认为“查询成绩”权限。在创建学生类的时候直接继承就行了,创建教师类的时候,只需继承这个基类,加上教师独有的属性,工资、工龄等,并重写权限方法,查询成绩+录入成绩。当某一天,需要新加一种角色的时候,程序员只需再写一个类,为这个类重写权限即可,这种方式对于面向过程语言来说,可维护性已经很高了。但是有了关系数据库,并不需要这么复杂,几张表,几个类就能搞定的事情,就不必用具体的程序去实现了。当需要加一种角色,只要在角色表新增一条记录,给该角色配以相应的权限,这样就不必麻烦程序员再不辞辛苦去创建一个新类了。所以,很多项目,只能算得上是基于对象,而不是面向对象。不管是面向对象还是基于对象,以项目所处的场景而定,方便实用就行。

       我体会到的面向对象另一大好处就是在设计项目的阶段,采用面向对象的方法去思考问题比用面向过程的方法要好很多。他能让你专注于结果,专注于我们要解决什么问题,而忽略掉怎么解决这个细节,这样我们就能有更多的精力去把注意力放在设计中,考虑各种会出现的情况。其实这还挺不容易的,我经常会在设计流程的时候考虑具体怎么去实现,这样设计会不会加大编码难度。把设计和实现分开,看来我还有很长的路要走。

        一些Java web项目,除了需求设计阶段,和接口设计阶段,需要有很强的抽象能力和面向对象思想之外,具体的编码对程序员的面向对象能力要求并不是很高。因为现在的web项目大多都是mvc模式,dao层写增删改查,service层写业务代码,controller层写处理请求,程序员或者说码农只需要按照要求填代码就行,而不用去管什么面向对象。希望在以后的工作中,不要只当一个码农吧!!!

原创粉丝点击