flex+AS3程式設計規範
Flex+AS3編碼規範
http://www.cnblogs.com/jiahuafu/
1. 縮寫:
盡量避免使用縮寫,使用縮寫時盡量和Flex保持一緻。但要記住一些通用縮寫,如:acc(accessiblility) , auto(automatic), impl(implementation), info(infomation), num(number), min(minimum), max(maximum), nav(navigation), regexp(regularexpression), util(utility)等等。
2. 檔案名:
MXML:各個單詞首字母大寫,如Main.mxml,FlvPlayer.mxml
CSS:小寫字母開頭,其餘大寫,如testStyle.css
3.類名:各個單詞的首字母大寫,如EditTest.as
事件類(FoobarEvent.as)
指令類:TestCommand.as
皮膚類(FooBarBackground, FooBarBorder, FooBarIcon...),
utility類(FooBarUtil,不是FooBarUtils,包是複數,類是單數);
4. 包:
l 小寫字母開頭,後面各個單詞大寫,比如controls, listClasses;包名稱最好是名詞或者動名詞,不要用動詞、介詞、形容詞、副詞之類。當一個包的作用是實作某一功能的時候最好使用動名詞,如bingding, logging, messaging, printing;支援元件FooBar的最好寫作fooBarClasses;
l 包的導入:使用完整的應用名,不要使用星号(*),除非使用了包的絕大 部分
l 包的第一部分使用頂級域(com,org,mil,edu,net,gov等)下一部分是所有者的名稱,再是工程名和子產品,如:cn.com.company.project.module
5.命名空間:
小寫字母、下劃線隔開,檔案名必須與命名空間名稱一緻,如:mx_internal, object_proxy
6. 接口名稱:
字母“I”開始、大寫字母間隔:IList, IFocusManager, IUID
7.常量:
全部大寫字母,下劃線間隔:OFF, DEFAULT_WIDTH,如果常量是一個字元串,那麼常量命名和常量值保持一緻: <public static const FOO_BAR: String = "fooBar">
8.變量名:
l 全局變量以g_ + 類型縮寫開頭,并使用有意義的名稱,如g_intCount,g_numCount,g_strName, Boolean的以is開頭。
l 私有變量使用 下劃線+變量名,如_id,同時生成一個get 方法
public functon get Id():int{ return _id;}
l 臨時變量通常使用一個常用字母,如:i,j,k,m,n。不要使用l(L)避免與1混淆
l Catch中的變量必須使用e
l 變量盡量初始化
9. 方法命名:
小寫字母開始,每個單詞大寫字母間隔,應該使用動詞:measure(), updateDisplayList();無參方法應該實作為getter/setter,而不應該是getFooBar(), setFooBar();當然,如果getFooBar()是一個需要大量計算的慢速度方法的話就應該命名為findFooBar(), calculateFooBar(), determineFooBar()等等,而不是getter;如果子類的某方法覆寫了基類的某方法,但是同時又想繼續公開基類的某方法,那麼這個時候應将基類的方法名前加上“$”作為子類方法名,并且子類的方法名應該标志為final,且除了調用基類方法外不應該做其它的事情:
mx_internal final function $addChild(child:DisplayObject):DisplayObject
{
return super.addChild(child);
}
10. 事件處理器命名:
在後面加上Handler:mouseDownHandler();如果事件處理器是用來處理元件的某一個子元件的事件的話,那麼就應該把子元件的名稱加到最前面,并且用下劃線隔開:textinput_focusInHandler() (textinput的focusin事件的handler);
11.參數命名:
setter值使用value:public function set label(value:String):void;事件參數使用event:protected function mouseDownHandler(event:Event):void
12.屬性名命名:
小寫字母開始,大寫字母間隔:i, width, numChildren;
使用i作為選還變量,n作為循環上界;使用j作為循環變量,m作為循環上界:
var n:int = list.length;
for (var i:int = 0; i < n; i++)
for (var j:int = 0; j < m; j++)
{
...
}
使用p作為loop循環的變量:
for (var p:String in o)
...
如果子類的getter/setter覆寫了基類的getter/setter,但是同時又想繼續公開基類的getter/setter,那麼這個時候應将基類的屬性名前加上“$”作為子類屬性名,并且子類的屬性名應該标志為final,且除了調用基類getter/setter外不應該做其它的事情:
mx_internal final function get $numChildren():int
return super.numChildren;
13.存儲變量命名:
getter/setter屬性foo所存儲的變量應該是_foo(加上下劃線)
14.控件ID:以控件類型縮寫開頭,如按鈕類型的:btnSend,圖檔的:imgFeng等等。每個控件隻要有id則id放在第一位,如<mx:HTML id="htmlBaidu"。
15.聲明:
每行一個申明,分号結束,變量的申明放在開始位置,循環内部變量除外。
16.行、換行、縮進、空格
每行不要操過110個字元,即不要操過可視化的部分,在逗号之後,運算符之前,較進階别代碼處換行, 在後面的行縮進二個制表符(按兩次Tab鍵)
同一父元件之間的子元件之間插入空白行,下一級元件與上一級元件縮進一個制表符
函數之間插入空白行,局部變量和申明之間換行,一段代碼的邏輯之間換行,單行注釋或特殊的多行注釋之前換行
關鍵字與小括号之間空格,方法的形參逗号後面加空格,操作數之間插入空格(一進制操作符之間不要加入),方法名與括号之間、對象名和類型間不插空格。
使用三元操作符要用空格隔開,必要時可以拆分成多行
17.注釋
盡量為每個變量、類、函數、參數等編寫注釋
一般每個文檔前面都需要寫注釋,内容包括主要功能,作者,日期等等,
/***********************
*作者: jiangjingsong
*日期: 2008-10-31
*功能:
*修改記錄:
************************/
函數注釋示例:
*函數名: ChangeName
*作者: 007
*功能: 改變名稱
*參數:ID :名稱id
* name:修該的名稱
*傳回值: 類型(boolean)
* 傳回true表示修改成功
* 傳回false表示修改失敗
如果這個函數所在的文檔有注釋的話,則公用的部分可以可以不寫,當然并不是每個函數都需這麼寫注釋,根據具體情況而定。
變量注釋:
Var intCount:int=0 //計數器的值
18. 表達式相關:
對于通用的操作符(+, -, *, /, &&, ||, <, <=, >, >=, ==, !=)不要使用不必要的圓括号;其它的優先級不容易記住的可以借助圓括号。
19. 強制類型轉換:
不要将Boolean變量和true或false比較;顯式的将int,uint, Number, String轉換為Boolean值,使用if(n !=0 )而不是if (n),使用if (s != null && s != “”)而不是if (s),對于對象引用來說可以隐式轉換為Boolean值,使用if (child)而不是if (child != null),使用if (!child)而不是if (child != null);使用強制類型轉換而不是as操作符,僅僅當強制轉換可能失敗并且你希望失敗的時候值為null而不是抛出異常。使用IUIComponent(child).document而不是(child as UIComponnet).document;
20. 比較:以更容易了解的方式書寫比較表達式: if (n == 3) // "if n is 3"(Yes),if (3 == n) // "if 3 is n"(No);
21. ++和–操作:字首形式和字尾形式效果一樣的時候使用字尾形式,隻有當你想在變量在操作之前使用的時候才使用字首形式;
22. 三元操作符:可以使用三元操作符代替簡單的if/else邏輯,尤其是對null進行判斷的時候;
return item ? item.label : null (Yes)
if (! Item)
return null;
return item.label; (No)
但是不要使用嵌套的三元操作符;
23. new:即使構造的類不帶參數也要使用圓括号:var b:Button = new Button();(yes)var b:Button = new Button;(No);
24. include:使用include而不是已廢棄的#include,和前面一樣,每個聲明語句以分号結束;使用相對路徑而不是絕對路徑;
25. use namespace:避免使用,非公開名字空間引用使用“::”:
Yes:
import mx.core.mx_internal;
// Later, in some method...
mx_internal::doSomething();
No:
use namespace mx_internal;
doSomething();
26. if:當if/else分支隻有一句聲明的時候,要寫上else;
if (flag)
doThing1();
――――――――――――――――――――――――――――――――――――
Yes:
if (flag){
doThing1();
else{
doThing2()}
――――――――――――――――――――――――――――――――――
27.保留字、關鍵字
l undefined盡量避免使用;
l int和uint:整數後面不要加小數點,十六進制用0x開始,後面的字母大寫;
l RGB色通常用六個十六進制數字表示;
l 索引值-1表示“沒有索引項”;
l Number:通常表示可以帶小數,是以即使變量是整數也應該加上一個小數點和一個零,比如alphaFrom = 0.0; alphaTo = 1.0;但是螢幕坐标值不要這樣做;
l 指數計數的時候使用e,比如1.0e12,不要用大寫E;
l String:使用雙引号界定字元,即使字元中間包含引号:字元what’up, “Big Boy”?表示為"What's up, \"Big Boy\"?",而不是’what\’s up “Big Boy”?’;
l Array:使用“[]”,而不是new Array(),比如[1, 2, 3]而不是new Array(1, 2, 3);這裡在一個數組變量的時候容易出問題,比如一個包含一個值3的數組,如果用new Array(3),那麼表示的是建立了一個三個元素的數組[undefined, undefined, undefined],而不是[3];
l Object:使用{},而不是new Object();比如{}, {a: 1, b: 2, c: 3};
l Function:避免使用匿名函數,用類方法或者包方法代替;如果一定要用,那麼聲明傳回值,并且函數體内最後一個語句用分号結尾:function(i:int):void { doIt(i - 1); doIt(i + 1); }
l RegExp:不要使用正規表達式構造函數建立正規表達式,使用var pattern:RegExp = /\d+/g;而不是var pattern:RegExp = new RegExp("\\d+", "g");
l XML和XMLList:直接使用保留字聲明,不要使用構造函數。使用var node:XML = <name first="Jane" last="Doe"/>;而不是var node:XML = new XML("<name first=\"Jane\" last=\"Doe\"/>"); XML屬性值要使用雙引号括起來,不要使用單引号。
l Class:隻有當需要在區分兩個導入類的時候才使用類的全名,
正确做法(Yes:):
import mx.controls.Button;
...
var b:Button = new Button();
錯誤做法(No:):
var b:Button = new mx.controls.Button();
正确做法:
import my.controls.Button;