[转][Lii]自定义命名空间施用技巧之——提高代码可读性与易用性

[转][Lii]自定义命名空间使用技巧之——提高代码可读性与易用性
http://uh.9ria.com/link.php?url=http://bbs.9ria.com%2Fviewthread.php%3Ftid%3D63573


自定义命名空间使用技巧之——提高代码可读性与易用性


  平时我们在写AS3的时候很少使用到自定义命名空间,我们的代码也确实可以完全避免使用自定义命名空间就可以完成所有功能。但是既然AS3有这个东西那么肯定有它能够胜任的工作,那么自定义命名空间到底能为我们带来些什么呢?今天我整理了一些自己的自定义命名空间使用技巧,希望能给大家带来帮助,希望能给大家一些启发。第一个技巧就是通过自定义命名空间来提高代码的可读性和易用性。

一:私有变量与封装变量
  平时我们学习写代码的时候所使用的命名空间基本就是以public、private、protected这三种为主,而在变量命名的技巧上则遵循驼峰命名法。但是碰到要封装的变量则会起一个和get/set差不多的变量名来表明他们之间的关系。比如一下代码:
private var _x:Number;
public function get x():Number{
        return this._x;
}
public function set x(value:Number):void{
        this._x = value;
}
private var _y:Number;
public function get y():Number{
        return this._y;
}
public function set y(value:Number):void{
        this._y = value;
}


那么在FlashBuilder中大纲显示的时候就发现排序的时候private的属性和public的属性被分隔开了如下图:

[转][Lii]自定义命名空间施用技巧之——提高代码可读性与易用性

那么要是属性一都的话就会出现下面这种混乱情况:

[转][Lii]自定义命名空间施用技巧之——提高代码可读性与易用性

在代码编写的时候寻找代码有时就会带来一些不便。

那么采用自定义命名空间的解决方案就是采用下面这种定义:
private namespace _;
_ var x:Number;
public function get x():Number{
        return _::x;
}
public function set x(value:Number):void{
        _::x = value;
}
_ var y:Number;
public function get y():Number{
        return _::y;
}
public function set y(value:Number):void{
        _::y = value;
}


  其实就是把原来我们用来代表private变量的”_”定义成一个private的namespace。这样用这个命名空间定义变量既保持原有的private属性又能和public变量同名,在方便起名记忆的同时,在大纲里的排序也改变了如下图:

[转][Lii]自定义命名空间施用技巧之——提高代码可读性与易用性

我们会发现由于变量名相同,这些变量就自然而然的被连续的排列在一起,这样找变量的时候就方便了很多。

二、事件函数区分与定义
  写AS3自然会非常频繁的和事件机制打交道,那么在习惯了使用private、public命名空间使用的时候,事件回调函数的定义我以前基本都是用private function。而命名方面基本就是loader的名字后面加事件,比如:
private var xmlLoader:URLLoader = new URLLoader;
xmlLoader.addEventListener(Event.COMPLETE,xmlLoader_complete);
xmlLoader.addEventListener(IOErrorEvent.IO_ERROR,xmlLoader_ioError);

private function xmlLoader_complete(e:Event):void{
        //代码
}
private function xmlLoader_ioError (e:Event):void{
        //代码
}


那么一个类里类似代码一多大纲里就会出现非常混乱的局面,代码提示也会列出一大堆东西。
那么在运用自定义命名空间来写可以写成这样:
private namespace loader;
private namespace event;
private namespace ioErrorEvent;

loader var xml:URLLoader = new URLLoader;
loader::xml.addEventListener(Event.COMPLETE,event::xml_complete);
loader::xml.addEventListener(IOErrorEvent.IO_ERROR, ioErrorEvent::xml_ioError);

event function xmlLoader_complete(e:Event):void{
        //代码
}
ioErrorEvent function xml_ioError(e: IOErrorEvent):void{
        //代码
}


  基本就是以类型来定义一个命名空间,这样就可以很方便的区分函数的作用。在代码折叠函数的时候很容易区分函数,从而达到快速人肉寻找的目的。

  到这里可能有人会问,要是每次用都要去声明自定义命名空间那多累啊,每个类里都要多写一堆命名空间声明多麻烦。其实,我们可以用AS3的include功能来解决这个问题,我们可以建一个文件比如NS.as,所有的命名空间声明都写在这个里面。然后放到类库的任意位置,那么要使用他只需要include “xx/xx/NS.as”;就可以使用所有其中的命名空间了。

三、减少代码提示的范围
  平时我们使用public、private、protected命名空间的时候只要一用代码提示就会把以上的三种命名空间下的变量全部毫无保留的全部显示出来,长长的一串,要是机器性能不够好那就有的好卡几下了。那么如果我们合理的定义好自定义命名空间的话就可以按类别来显示我们需要的变量和函数。比如以下是我个人使用的一些定义规范:

命名空间也可以分public和private以及protected。
public的命名空间直接以字母开头,private的命名空间则以“_”开头,protected命名空间则以$开头。 “_”命名空间表示private var,”$”命名空间表示private function。
那么在一起就是这样:
public namespace event;
private namespace _event;
protected namespace $event;
private namespace _;
private namespace $;


  这样写代码也好看代码也好都有非常明确的指向性。而且在你输入命名空间的::的时候代码提示也只会给出这个命名空间下的变量以及函数,不会出现长长的那一串了。我个人使用下来发现在一些复杂的代码量比较大的项目中可以提升编写效率,因为类别分的比较清晰很少会因为找代码而头疼,在替换代码的时候由于有命名空间前缀也不容易替换错误。

  最后,这些自定义命名空间的使用技巧属于个人在代码生活中的一些总结,目的主要是为了提高自己的代码编写效率以及当代码长时间被搁置后重新浏览时方便阅读。可能并不适合所有人,主要是想起个抛砖引玉的作用,让大家更多的了解一下命名空间的可能性。其实写代码也并不是枯燥乏味的,在字里行间我们也可以发挥自己的想像力让自己的代码与众不同。最后谢谢大家阅读。

顺便补充一句。FLEX3以及之前版本对命名空间的代码提示什么的支持的不是很好。但是FB4里得到了很好的改善,要是能在大纲里显示命名空间简称那基本就是完美了。所以要应用上述方案的朋友最好使用FB4,其他的编辑器我还没试过,本人是FLEX派...