优雅OOP(1) - 封装

2009.10.20

       谈到 OOP 即 Object Oriented Programming 面向对象编程,初学者似乎都有很多疑惑。本篇文章旨在用尽量少的术语和代码以及尽量多的通俗语言带你领略面向对象编程的美妙和优雅。

       面向对象的思想是从20世纪80年代产生的。多数书籍都指出了面向对象编程使得代码重用率提高,开发大型软件更加容易等但却忽略了最重要的一点。那就是面向对象的思想。面向对象的思维方式使得程序设计和我们真实客观世界的运作方式紧密的联系起来,程序设计变得更符合我们对客观世界的认识,更加有趣。往往面向对象的教材过多的强调了语法和具体实现,只是学会了面向对象语法而编写出来的程序只不过是披着面向对象的外衣,有趣的是很多教材中的例子正是这种程序...

       本文后面的部分将通过带你了解面向对象的三大基石(封装,继承和复合,多态)向你展示面向对象编程的魅力。使你对面向对象的思想有大致的了解。当然,你需要先明确面向对象编程中的一些概念,比如,对象,类,属性,方法等等。

      这里只说下对象,Object,对象可以说是某个类的实例。大陆的计算机类书都将Object翻译为对象,这样的翻译很是不妥,对象这个词对我们来说已经很抽象了。其实说白了Object就是物体,一点也不神秘...

三大基石之一 封装

1.什么是封装?

      封装(encapsulation)又叫隐藏实现(Hiding the implementation)。就是只公开代码单元的对外接口,而隐藏其具体实现。

      比如你的手机,手机的键盘,屏幕,听筒等,就是其对外接口。你只需要知道如何按键就可以使用手机,而不需要了解手机内部的电路是如何工作的。封装机制就像手机一样只将对外接口暴露,而不需要用户去了解其内部实现。细心观察,现实中很多东西都具有这样的特点。

2.如何实现封装?
     
      在程序设计里,封装往往是通过访问控制实现的。C++,Java,AS3中都有 Public, Protected, Private 等访问控制符。通过用Public将信息暴露,Private,Protected将信息隐藏,来实现封装。

      一个优秀的OOP程序员会尽量不对外公开代码,即最喜欢用Private关键字。因为在OOP中,对代码访问控制得越严格,日后你对代码修改的自由就越大。

                                       --摘自《AS3殿堂之路》。这一点会在下面给出更详细的解释。

 

3.为什么要封装?封装带来的好处。

  a.封装使得对代码的修改更加安全和容易。将代码分成了一个个相对独立的单元。

      只要电话的外部接口(键盘,屏幕,使用方法等)不发生改变,那么不管电话内部电路,技术如何改进,你都不需要重新学习就可以使用新一代的电话。同样,只要汽车的方向盘,刹车等外部接口不变,那么,不论如何改造它的发动机,你也一样会驾驶这类汽车。

      封装使得只要不改变某种东西的外部接口,即可随意改造其内部构造,但使用它们的方法不变。对于一个代码单元来说,通常指一个类(Class),会经常调试修改它的代码,也可能程序的很多部分都用到了这个类,甚至,这个类的代码要提供给第三方使用。封装所带来的好处是:明确的指出了那些属性和方法是外部可以访问的。这样当你需要调整这个类的代码时,只要保证公有(Public:)属性不变,公有方法的参数和返回值类型不变,那么你就可以尽情的修改这个类,而不会影响到程序的其他部分,或者是使用到这个类的其他程序。这就是为什么刚刚说的“在OOP中,对代码访问控制得越严格,日后你对代码修改的自由就越大”。

  b.封装使整个软件开发复杂度大大降低。

      正如前面所说,你不用了解汽车或手机的内部结构和原理就可以使用它们。同样,如果你想用别人编好,调试成功的代码时,封装使得你只需要了解这些代码对外公开的部分(公有方法和属性),就能很好的使用这些代码,这些类(class),而不必关心其内部逻辑是如何实现的。你能很容易学会使用别人写好的代码,这就让软件协同开发的难度大大降低。

  c.封装还避免了命名冲突的问题。

      电话上的按键和电视遥控器上的按键肯定用处不同。但它们都可以叫做按键,为什么你没有弄混呢?很显然一个属于电话类一个属于遥控器类。不同的类中可以有相同名称的方法和属性,但不会混淆。

      说到命名和软件协作需要注意下规范的命名,规范命名使得别人和你自己都能更好更容易的读懂你写的代码。

本文地址:http://imyuao.com/entries/blog/posh_oop1
三大基石之二 - 继承与复合
三大基石之三 - 多态

Go Back

Comment