web前端开发修炼之道-面向对象编程

     好吧,又是很久没写东西了!

     前两天问一个技术人说面向对象是什么,他打趣说就是面对着我对象(男朋友)。。。囧了一下!呵呵,今天恰好看到《编写高质量代码》的面向对象编程。记录之!

     首先给一个电话本的例子:

    //定义电话本1

    var phonebook = [

      {name:"adang",tel:"1111111"},

      {name:"ht",tel:"222222"},

      ……

      ];

      //定义电话本2

      var phonebook2 = [

      {name:"ad",tel:"111155"},

      {name:"he",tel:"2222222255"},

      ……

      ];

      //查询电话

function getTel(oPhonebook,oName){

var tel = "";

for(var i = 0;i<oPhonebook.length;i++){

       if(oPhonebook[i].name == oName){

                   tel = oPhonebook[i].tel;

                   break;

           }

}

}

//添加记录

……

//删除记录

……

//从电话本中查询“niaoren”的电话

var str = getTel(phonebook,"niaoren");

alert(str);

//在电话本中添加niaoren的电话

……

//在电话本中删除niaoren的电话

……

//在电话本2中查询niaoren的记录

……

这种编程方式把程序分为“数据”和"处理函数"两部分,程序以“处理函数”为核心,如果要执行什么函数,就将“数据”传给相应的“处理函数”,返回我们需要的结果,这种编程方式就是面向过程编程

面向过程的的思路很好上手,但是它存在三方面的问题:

1.数据和处理函数没有直接的关联,在执行操作的时候,我们不但要选择相应的处理函数,还要自己准备处理函数需要的数据,也就是说我们在执行操作是要同时关注处理函数和数据。

2.数据和处理函数都暴露在同一作用域内,没有私有和公有的概念,整个程序中所有的数据和处理函数都可以相互访问,在开发阶段也许开发速度会很快,但是到了开发后期和维护阶段,由于整个程序耦合的非常紧,任何一个处理函数和数据都有可能关联到其他的地方,容易牵一发而动全身,从而加大了修改难度。

3.面向过程的思维方式是典型的计算机思维方式--输入数据飞处理器,处理器内部执行运算,处理器返回结果。而实际生活中,我们的思路却不是这样的--实际生活中所有的东西都是有状态有动作的。这用面向对象过程思维来描述书很难做到的。因为面向过程的思维方式是在描述一个个“动作”,有动作的起点(初始数据),有动作的过程(初始数据传给处理函数进行执行),有动作的终点(处理函数返回处理结果),而客观世界存在的却是一个个“物件”,物件有状态有动作,物件本身只是一个客观的存在,没有起点没有终点。能用面向过程思维描述的只能是物件的动作。

接下来,我们说面向对象编程

什么是面向对象编程呢?面向对象编程就是逃开计算机思维,使生活中的思维进行编程的编程方式。面向过程的思维就是描述一个个“动作”,而面相对象思维映射到程序中--如果你使用的编程语言支持面向对象,在程序中我们管“物件”叫做“对象”,对象由两部分组成:“属性”和“行为”,对应客观世界中的物件的“状态”和“动作”。用面向过程的方式来描述给大家。

面相过程方式编程

var name = "adang";

var state = "awake";

var say = function(oName){

       alert("I'm" + oName);

}

var sleep = function(oState){

      oState = "asleep"

}

say(name);

sleep(state);

首先调用对象adang,然后调用函数说出描述出adang说,adang睡觉。

属性本质其实是变量,也就是面向过程中的数据,而行为的本质其实是函数,也就是面向过程中处理的函数。不用的是,面向对象讲数据和处理函数定义到了对象的内部,作为这个对象的属性和行为存在,在对象外部,属性和行为可以用对象的属性和对象的行为来调用,从而让程序有了按真实世界的思维方式经行描述的能力。在对象内部,对象的属性和行为通过this关键字(或者其他的关键字)关联起来,例如say这个行为在调用name属性的时候就可以使用this.name来调用自己对象的属性。

面向过程编程所有的数据和处理函数都是公有的,整个编程的思维就是定义数据,定义处理函数,然后将数据传给处理函数进行处理,处理函数之间也可以相互调用,数据和处理函数紧密耦合。面相对象编程的思维过程是定义一个个对象,对象有自己的属性和行为,因为属性和行为都是从属于对象的,于是有了“对象内”和“对象外”的概念,整个程序可以是由一堆对象组成,对象与对象之间可能有会通信,为了实现这种通信,对象会将自己的部分属性和行为设计成公有,暴露出来成为通信的借口。对象和对象之间的通信都是建立在接口的基础上的。当然我们可以将对象所有的属性和行为都设为公有的,全部都作为接口,但接口越多,会让对象之间耦合的越紧密,增加维护的难度。所以一般情况下我们都会尽量将对象的属性和方法设为私有,只要将必要的属性设为公有。但对象的公有属性和公有行为越少,整个程序的扩展性就会越差,所以我们在设计公有和私有的时候需要权衡一下。在不影响扩展性的前提下,尽量将属性和行为设为私有。(未完待续)

转载于:https://www.cnblogs.com/beixiaosmail/archive/2012/02/02/2336175.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值