Flex 編碼指南

一、介紹:
該文檔旨在爲使用Adobe Flex 和 ActionScript 3 編寫應用程序建立編碼指南。

要創建通俗易懂的編碼規範,因爲在軟件開發的生命週期中,大部分時間都是在維護。這樣,
易於理解的代碼片段變得很重要,因爲不總是最初的開發者去維護代碼。通俗地說就是,讓開
發者能快速理解別人的代碼。除此之外,程序或組件也可以方便地部署或銷售給第三方。

制訂編碼規範的前提 :通用性   易理解性

該文檔中創建的實例是基於DClick 的工作方法,Java 編碼約定和Adobe Flex SDK 中的約定。


二、文件:
2.1 文件擴展名  

MXML 代碼:.mxml  

ActionScript 代碼:.as  

CSS 代碼:.css
2.2 文件名不能包含空格、標點和特殊符號  

ActionScript   類和接口使用開頭字母大寫的駝峯式命名例:ExampleClassName  

接口總是以一個大寫字母I開頭例:IExampleInterface  

包含(includes)使用開頭字母小寫的駝峯式命名;  

命名空間使用開頭字母小寫的駝峯式命名例:myNamespace  

MXML    總是使用開頭字母大寫的駝峯式命名  

CSS    總是使用開頭字母小寫的駝峯式命名
2.3 編碼
所有文件都必須使用UTF-8 編碼

三、ActionScript 3.0:
3.1 文件結構
ActionScript 文件必須包含以下組成部分:

   1   開篇註釋
   2   定義包
   3   聲明命名空間

         一個文件要定義命名空間,如果存在命名空間,這是最後部分 空間,這麼做就行了
   4 Import 描述 按字母順序排序;
         1. flash 包 如果導入命名空間,
         2. mx 包 同名的包要先於類
        3. com.adobe 包
        4. 公司組件
        5. 第三方包,按字母順序排序
         6. 屬於該文件的工程包

    使用完整的引用名,不要使用星號(*),除非使用了包的絕大部分。
    推薦使用:importmx.core.Application
    避免使用:importmx.core.*
5   use 聲明(命名空間) 按字母順序排序
6   元數據
    1. Event
    2. Style
    3. Effect
    4. 其他元數據,按字母順序排序
7   定義包和接口
8   靜態變量(static)
     1. public
        a) const
        b) 其他publicstatic
     2. internal
     3. protected
     4. private
      5. 自定義命名空間(按字母順序排序)
9   沒有使用getter 和setter 的變量
     1. public
     2. internal
     3. protected
     4. private
     5. 自定義命名空間(按字母順序排序)
10   構造函數
11用getter和setter處理的變量和方法本身,還有相關的變量, 相關規則參考文檔中
例: 關於變量的部分
private var_enabled:Boolean=true;
private var enabledChanged:Boolean = false;
public function getenabled():Boolean{
return_enabled;
}
public function setenabled(value:Boolean):void{
_enabled = value;
enabledChanged = true;

12方法 將實現相關功能方法組織在一起,而不是按作用域
3.2 樣式
3.2.1 行與換行
如果一段描述不能放在一行中,依據下列規則將其拆分成多行:從逗號後換行; 最好在較高級別代碼處換行;    換行後與上一行對齊;    如果上一條規則不適用,加入兩個縮進

推薦使用:
//第一行:在 implements 操作符之前換行
//第二行:在逗號後面換行
//第二、三行:兩個縮進
public classButton extends UIComponent
implements IDataRenderer, IDropInListItemRenderer,
           IFocusManagerComponent
避免使用:
public classButton extends UIComponent
implements IDataRenderer, IDropInListItemRenderer,
IFocusManagerComponent
推薦使用:
//在高級別代碼處換行,例如右小括號
//不要在括號內換行
variable1 = variable2 + (variable3 * variable4 – variable5)
- variable6 / variable7;
避免使用:
variable1 = variable2 + (variable3 * variable4
- variable5) – variable6 / variable7;
三元操作符換行示例:
b = (expression) ? expression
                           : gamma;//對齊!
c = (expression)
     ? beta
     : gamma;
3.2.2 聲明       每行只有一個聲明。
正確的:
var a:int = 10;
var b:int = 20;
錯誤的:
var a:int = 10, b:int = 20;

儘量對變量進行初始化,如果一些變量的初始值在方法調用中付給則不需要初始化。即使是默認值也要初始化。
正確的:
public var isAdmin:Boolean = false;
錯誤的:
public var isAdmin:Boolean; //Boolean 型變量的默認值是false

變量的聲明放在代碼塊開始的位置,除非是在循環中。
public function getMetadata():void{
varvalue:int = 123;//方法代碼塊開始

if (condition){
var value:int = 456;//if 開始

}
for (var i:int = 0; I < valor; i++){//在for 循環中

}
}

不要使用之前代碼塊中用過的變量名,即使是不同的作用域。
3.2.3 括號
樣式規則: 
不要在方法名和括號之間插入空格,也不要在括號和參數間插空格;    不要在對象名和類型間插空格;    左大括號放在新的一行並與方法定義行對齊;    右大括號獨佔一行並與跟成對的左大括號對齊;    方法間用一空行隔開;
3.2.4 聲明
簡單的
簡單聲明每行只能有一個,並以分號作爲結束。
正確的:
i++;
setModel();
錯誤的:
i++; resetModel();

複合的
複合聲明(其中要使用大括號的,例如if, while, switch)必須遵守以下原則:    聲明內的代碼要縮進一級;    左大括號在聲明下方獨佔一行,與聲明對齊,右大括號同樣佔一行,與左大括號對齊;    在所有聲明中都使用大括號,即使聲明只有一行;

返回(return)
返回無需使用小括號,除非你想使代碼更容易理解:
return;
return getFinalImage();
return (phase ? phase : initPhase);

條件語句 if, elseif, else
if (condition)
{
simpleStatement;
}

if (condition)
{
statements;
}
else
{
statements;
}

if (condition)
{
statements;
}
elseif (condition)
{
statements;
}
else
{
statements;
}

條件語句 switch, case
Switch 聲明適用下面的樣式:
switch (condition)
{
case ABC:
{
statements;
//continue,withoutbreak
}
case DEF:
{
statements;
break;
}
case JKL:
case XYZ:
{
statements;
break;
}
default:
{
statements;
break;
}
}

Break 規則:    在default 代碼塊中也要使用break。通常這是多餘的,但他能增強代碼的可讀性;    如果一段代碼塊中不需要break,在 break 的位置上寫上註釋;    如果聲明中包含return 則不需要使用break。

循環 for
for (initialization; condition; update)
{
statements;
}
for (initialization; condition; update);

循環 for..in
for (var iterator:type in someObject)
{
statements;
}

循環 foreach..in
foreach (var iterator:Type in someObject)
{
statements;
}

循環 while
while (condition)
{
statements;
}

循環 do..while
do
{
statements;
}
while (condition);

錯誤處理 try..catch..finally
try
{
statements;
}
catch (e:Type)
{
statements;
}

也可以有finally 聲明:
try
{
statements;
}
catch (e:Type)
{
statements;
}
finally
{
statements;
}

With
with (this)
{
alpha = 0.5;
}
3.2.5 換行與空格
換行(這裏指一空行)
換行能使代碼看上去更清晰,更有邏輯。
下列情況需要換行:    函數之間;    方法的局部變量和聲明之間;    代碼塊前;    單行註釋前面或一段特殊功能代碼的多行註釋前面;    將一段代碼的邏輯之間分開,使代碼更清晰。

空格
在關鍵字和小括號之間插入空格,但不要在方法和他的小括號中插入空格。
while (true)
{
getSomething();
}

在方法的形參列表中,逗號後面要有空格:
addSomthing(data1, data2, data3)

所有操作符(兩個操作數之間的,例如+,-,=,==)與其操作數之間要用空格分隔,但不要
分割一元操作符(例如++,–)。
a += (5 + b) / c;
while (basint < f)
{
i++;
}

三元操作符要用空格分開,有必要的話可以拆分成多行:
a = (expression) ? expression : expression;

for 表達式中要用空格分開:
for (expr1; expr2; expr3)
3.3 註釋
3.3.1 文檔註釋
文檔註釋是指在每個類、接口、變量、方法以及元標籤等定義前面放置的一段註釋,文檔註釋
的作用是,讓那些將要使用這些定義的人能更好的瞭解定義的作用,而無需去研究代碼。

文檔註釋的語法和格式參考 ASDoc(在 Flex SDK 中也可以找到),地址是:
http://labs.adobe.com/wiki/index.php/ASDoc:Creating_ASDoc_Comments

例如:
/**
*The Button control is a commonly used rectangular button.
*Button controls look like they can be pressed.
*
*@mxml
*
*…
*
*@includeExample examples/ButtonExample.mxml
*/
public class Button extends UIComponent
3.3.2 執行註釋
執行註釋用來對一些不易理解的特殊代碼進行說明,使用//進行註釋,不管是多行還是單行。

如果註釋獨佔一行,要將註釋放在相關代碼之前:
// 確定沒有可見列
if (!visibleColumns || visibleColumns.length == 0)
如果不是太長,註釋可以和代碼放在同一行:
colNum = 0; // 補償可見初始列的偏移量
不要翻譯代碼:
colNum = 0; // 把列數設爲0

四、MXML
4.1 文件結構
MXML 文件必須包括以下組成部分:

1 XML 文件頭 總是在文件頭中定義編碼,並
<?xml version=”1.0” encoding=”UTF-8” ?>
且總是使用UTF-8 編碼
2 根標籤 必須包含文件中使用到的所有命名空間
3   元標籤
   1. Event
   2. Style
   3. Effect
   4. 其他元標籤,按字母順序排列
4 定義樣式 儘量使用外部樣式文件
5 定義腳本 只能存在一個腳本塊
6   非可視組件
7   可視組件
4.2 樣式
4.2.1 行與換行
在一組可視組件之間插入空白行可使代碼更清晰

在同一個父組件的子組件之間(也包括他們的子組件)插入空白行,如果這個子組件擁有至少
一個子組件:

<mx:series>
<mx:ColumnSeries yField=”prev” displayName=”Forecast”>
<mx:stroke>
<mx:Stroke color=”0xB35A00″ />
</mx:stroke>
<mx:fill>
<mx:LinearGradient angle=”0″>
<mx:entries>
<mx:GradientEntry… />
<mx:GradientEntry… />
</mx:entries>
</mx:LinearGradient>
</mx:fill>
</mx:ColumnSeries>


<comp:ColumnSeriesComponent />
</mx:series>

也就是說,如果一個組件之有一個子組件則不需要插入空白行。下面的LinearGradient 就
只有一個子組件 entries.

<mx:LinearGradient angle=”0″>
<mx:entries>
<mx:GradientEntry… />
<mx:GradientEntry… />
</mx:entries>
</mx:LinearGradient>

同樣,像entries 這樣子組件都在一行的也不用插入空白行
<mx:entries>
<mx:GradientEntry… />
<mx:GradientEntry… />
</mx:entries>
4.2.2 Nstling components(雛鳥組件?)
子組件必須依據其父組件進行縮進排版。

<mx:TabNavigator>
<mx:Container>
<mx:Button />
</mx:Container>
</mx:TabNavigator>
4.2.3 屬性
按下列順序排序:    屬性    如果有id 的話,永遠放在第一位;    記住,width,height 和styleName 是屬性而不是樣式;    事件(Events)    效果(Effects)    樣式(Style)

如果有id,永遠放在第一位。
<mx:ViewTack id=”mainModules” width=”75%” height=”75%” />

標籤屬性如果放在多行要進行縮進。
<mx:Label
width=”100%” height=”100%” truncateToFit=”true”
text=”Herecomesalongenoughtextthat…” />

如果標籤的聲明有多行,處在第一行的永遠只有id 一個屬性,其他屬性按上面的順序放在其
他行中。
<mx:ViewStack id=”mainModules”
height=”75%” width=”75%”
paddingTop=”10″ paddingLeft=”10″ paddingRight=”10″>

<mx:ViewStack
height=”75%” width=”75%”
paddingTop=”10″ paddingLeft=”10″ paddingRight=”10″>

同一類的屬性放在一行,下面的例子中第二行定義了屬性,第三行定義事件,第四行定義樣式,
最後一行是效果。
<mx:Panel
title=”VBoxContainerExample” status=”Somestatus”
hide=”doSomething()” creationComplete=”doSomething()”
paddingTop=”10″ paddingLeft=”10″ paddingRight=”10″
resizeEffect=”Resize”/>

在同類屬性需要放入多行的情況下,視乎情況將更爲相近的屬性放入同一行,下例中第四、五
行均爲樣式,第五行定義了一些 padding:
<mx:Panel id=”pnLoginInfo”
title=”VBoxContainerExample” height=”75%” width=”75%”
resize=”resizeHandler(event)”
titleStyleName=”titleLogin” headerHeight=”25″
paddingTop=”10″ paddingLeft=”10″ paddingRight=”10″ />
4.2.4 腳本
腳本代碼塊的樣式:
<mx:Script>
<![CDATA[
code;
]]>
</mx:Script>
4.3 註釋
4.3.1 文檔註釋
ASDoc 工具不支持MXML 文件中的文檔註釋,但還是鼓勵這樣去做,如果MXML 文件是一個可
重用的自定義組件(不只是簡單的視圖)。這樣,文件中就包含了一個與 ActionScript 注
釋方法相同的腳本代碼塊。
<mx:Script>
<![CDATA[
/**
*Document ation comment inside a MXML component
*Uses the same format as the AS comment
*/
]]>
</mx:Script>
4.3.2 執行註釋
使用執行註釋描述那些目的不太清晰的界面元素
<!—這裏是註釋–>
或使用多行
<!–
多行註釋

–>


五、樣式
5.1 一般規則    縮進使用製表符,佔4 空格位,需要在IDE 中進行設置;    單行代碼不超過100 個字符;


注:使用Eclipse 配以1280 分辨率,如果編碼窗口占70%(其他30%用於導航),每行大
約可以顯示103個字符,A4大小紙張一行大約80個字符。


六、命名
6.1 一般規則    縮寫:應儘量避免使用縮寫,除非是那些縮寫形式更常用於它的全稱的縮寫(例如URL,
HTML 等)。工程名可以是用縮寫,如果他就是叫那個名字。    只使用AscII 字符,不包括重音符號(`)、空格、標點和特殊字符;    不要使用 FlexSDK 中預留的關鍵字命名(像 mx 包中的 Application、DataGrid
等),也不要使用 FlashPlayer 中預留的關鍵字(像 Flash 包中的 IOError、
Bitmap 等)    既然在MXML 中編寫代碼與在 ActionScript 中一樣容易,在MXML 中的命名規則也
和ActionScript中是一樣的(舉例來說,一個MXML就像一個ActionScript類,
其內部的組件和變量等同於屬性)    主程序文件命名爲Main.mxml    不要在組件名稱中使用索引,以免在用ASDoc 工具生成文檔時產生衝突。
6.2 語言
編碼本身必須使用英語,除了涉及到商業領域的動詞和名詞(特殊專業領域的軟件是爲了解決
問題,也就是說,現實世界和系統是相關聯的)

因此,推薦使用下面的命名:
DEFAULT_CATEGORIA
addNotaFiscal()
getProdutosByCategoria()
changeState()
UsuarioVO
screens/Reports.mxml

不推薦下列命名:
popularCombo()
mudarEstado()
UsuarioObjetoDeTransferencia
6.3 包
包的命名必須使用 lowerCamelCase(駝峯式命名),第一個單詞的開頭字母小寫,其他單
詞的開頭字母大寫

包名的第一部分使用頂級域(com, org, mil, edu, net 或gov)或者使用兩個單詞,國
家標識加頂級域,參考文檔ISO3166(br.com, ar.edu, cn.org 等)

下一部分是所有者(公司或客戶)的名稱,接下來是工程名和模塊:
cn.com.company.project.module
6.4 類
類名推薦使用名詞,也可以使用形容詞。總是使用UpperCamelCase(開頭字母大寫的駝峯
式命名)形式
6.5 接口
接口的命名規則和類的是一樣的,只是開頭加上一個大寫字母I
6.6 方法
方法必須使用動詞開頭,並使用lowerCamelCase(開頭字母小寫的駝峯式命名)形式,如
果方法被一個事件調用,結尾加上Handler
6.7 變量
變量使用 lowerCamelCase 形式命名,並且使用有意義的名稱,如果變量使用 getter 和
setter 方法讀/寫值,開頭應加上下劃線(_)

變量不必使用前綴,在ActionScript 中給對象一個通俗易懂的名字比對象類型更重要。盡
管如此,Boolean 型變量應以can、is 和has 開頭。

臨時變量(例如在循環中)通常使用一個字母,最常用的字母是 i, j, k, m, n, c, d。
不要使用 l。

catch 中的變量必須使用e,不管錯誤類型爲何(如果他是個類)
6.8 常量
常量全部使用大寫字母,單詞間用下劃線分割(_)
6.9 命名空間
命名空間全部使用小寫字母,單詞間用下劃線分割(_)
文件名必須與命名空間名稱一致。

七、一般習慣    在註釋中使用FIXME 關鍵字來標識某些需 TODO 標識某
時需要改良的代碼,這可以使用Flex Builder 2 Task 插件;    將需要重複調用的值在使用指派給一個變量,這對提高性能相當有用(在簡單的
中不需要)
正確的:
var maxPhase:int = reallySlowMethod();
for (var i:Number = 0; I < maxPhase; i++)
{
statements;
}
正確的:
var months:Array = ['Jan', 'Fev', 'Mar'];
// 獲取數組長度是相當快的
// 這樣做同時還增強了代碼的可讀性
for (var i:Number = 0; I < months.length; i++)
{
trace (months[i]);
}
錯誤的:
for (var i:Number = 0; I < reallySlowMethod(); i++)
{
statements;
}    儘量使用鬆耦合的組件,組件之間的關連越少,其重複利用的可能越大;    在Boolean 判斷中,將速度快的放前面。
正確的:
if (isAdmin && slowMethod(item))
錯誤的:
if (slowMethod(item) && isAdmin)    如果可用,儘量使用常量    如果可用,儘量使用更精確的類型    建議在簡單的事件處理中使用匿名函數


八、附錄:預留關鍵字
下表中列出了ActionScript 3 中的預留關鍵字:

as break case catch
class const continue default
delete do else extends
false finally for function
if implements import in
instanceof interface internal is
native new null package
private protected public return
super switch this throw
to true try typeof
use var void while
with     

還有些語法關鍵字,在某

each get set namespace
include dynamic final native
override static   

還有些爲未來版本預留的關鍵字也應儘量避免使用:

abstract boolean byte cast
char debugger double enum
export float goto intrinsic
long prototype short synchronized
throws to transient type
virtual volatile

文章來自: flex技術(www.flexjs.cn)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章