登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

重新出发的阿赵

阿赵的博客

 
 
 

日志

 
 

关于面向对象的重要性  

2015-06-11 23:37:46|  分类: Unity教程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
最近我接受了一个游戏项目做维护。
以前我一直也没有感觉别人的代码写得怎样好或者不好。我虽然工作了有十年了,但前四年都是做美工的,真正成为程序员也就6年左右的时间。相信很多人都比我经验丰富,所以我看别人的代码一直都是存着敬畏的心情的。
但最近接手的这个项目,让我看出了不少的问题。这个项目的功能非常的齐全,整体的效果也还过得去,整个项目的客户端是由三位90后的年轻人编写的。本来我感觉还是挺不错的项目,但当发现了原有功能的bug或者需要在原有的基础上新增加功能的时候,我就觉得痛苦无比了,几乎稍微改动都要把原来的代码重写。因为项目的很多地方都没有真正的用到面向对象,而是单纯的临时组装数据来完成了功能。

这里其实存着了几个疑问:
1,为什么要面向对象?功能实现了不就OK了?
2,怎样才算是面向对象?

先来看第一个问题。之前也有人在我的博客留言,说他不觉得使用Unity3D需要使用什么框架,能把功能实现了就好。这个想法从一定的程度上看是没有什么问题的,这个前提是,你做的功能不需要修改、不需要扩展,只需要做一次就完事了。这种情况其实很多的,以前我做虚拟现实的项目时,项目完事了,收完钱就走人了,还管他扩展不扩展的,只需要把功能都实现了就行了。
但这种情况毕竟是不正常的,一个软件的生命力,在于容易管理,容易扩展,工具化,自动化。而我们使用面向对象,其实就是为了实现容易管理和扩展的目的。
再来看第二个问题。怎样才算是面向对象了。面向对象,自己百度一下也能知道,几大特征:抽象、继承、封装、多态。所以很多人会这样理解面向对象:我写的类都是有提取接口的,都是有继承父类的。这样应该算是面向对象了吧?
按我自己的理解,面向对象不是一种规则写法,而是一种思路。
为什么要抽象?那是因为把复杂的问题归纳成简单的几个方法,至于实现,我不管,反正谁来了我都是对外宣称我有这样的功能,具体的实现到时再说。
为什么要继承?因为抽象之后会发现很多共同点,重复的功能就不需要重复编写了,我们只针对特性来编写。
为什么要封装?一个对象作为一个整体,很多东西不需要被外部知道,把他们封装在一起,整个对象的操作,简单明了。
至于多态,我们抽象了共性的东西,作为对象对外的窗口,但不同的对象实现同一个窗口有不同的方法。
所以总的来说,面向对象是为了划分清楚的边界,哪些东西是对象外处理的,哪些东西是对象内部处理的。而边界是相对的,在对象内部继续划分边界,就会出现更小部分的对象,只要保持对象内部的稳定,就可以通过组合多个对象成为一个更大的对象。这就像是原子、分子一层一层组成物体一样的道理。 正是因为这样,面向对象才会是容易维护管理的,容易扩展的。

之前有一个同事问过我这样的问题:抽象是怎样做到的,比如,他写代码都是先写了类,然后发现类有很多可以重用的地方,再提取成接口,原来的类就变成基类,然后再继承,等等。不是说一般开发都需要围绕接口来开展吗?着好像有点矛盾了。
我当时的回答是,其实‘不一定是先有类,再提取出接口的,可以是先有接口。当时同事很不能理解。我觉得这是由于写代码的习惯问题。
很多时候,我们遇到一个功能,可能的习惯都是直接就开始编写代码了。然后遇到问题再修改,再重构。但实际上我觉得遇到新功能或者问题,首先应该做的事情是拿起一支笔,在一个本子上面做分析。按照统一建模语言的理论,其实在实际使用某种语言编写功能之前,应该是有设计阶段的。这个阶段只是弄清楚业务的参与者、边界、业务主体、业务工人等元素,然后归结成“谁做什么”。这个阶段,我们不需要知道是用什么编程语言来实现的,也许根本不需要计算机,用纯人工也能完成功能。当然了,这个阶段也不需要我们知道怎样具体去实现一个功能,只需要知道,我需要在这个范围内实现什么样的几个功能,我需要对外提供什么样的服务让别人使用,就算完成了。然后再下一步,才是讨论使用什么语言来实现,怎样去根据语言的特点去实现。最后才是真正的开始打代码把实现的过程写出来。
针对上面的实现过程,不难发现,其实我们在没有开始写代码之前,我们就已经知道我们需要做什么,需要提供哪一些对外的窗口给别人去用。这些窗口,其实就是抽象出来的接口了。那么,是不是很明显的,是先有接口,再有类?是不是就可以围绕着接口来开展编写了?
说了这么多,其实只是为了吐一下苦水,如果大家都面向对象,起码等别人接手你的东西的时候,你会被骂得少一点吧。反正我自己也估计被骂过不少了,只能是尽力去写得更好。
  评论这张
 
阅读(1734)| 评论(6)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018