Flex/AIR/AS3/Etc2009.10.15 03:21

이글은 널곰님의 블로그에 올라와 있는걸 제가 코딩할때 참고하기 위해 제 나름데로 정리한 내용입니다.
원본글을 보시려면 널곰님 블로그에 방문해 주세요.

[출처] - http://blog.naver.com/surfwon/30049410362
[영문 원본] - http://opensource.adobe.com/wiki/display/flexsdk/Coding+Conventions

2. 언어사용법 (Language Uasge)

컴파일 옵션 (Compilation options)

컴파일 옵션은 -strict와 -show-actionscript-warnings는 on으로 해둡니다.
(flex-config.xml 파일에 기본값들이 설정되어 있습니다.)


프라퍼티-기반 API (roperty-based APIs)

프라퍼티-기반API가 메소드-기반API 보다 유리합니다. (MXML 프로그래밍에서 보다 적합하기에)


타입 (데이터형) 선언 (Type declarations)

모든 상수(constrant), 변수(vqriable), 함수 파라메터(argment), 반환값(return value)에는 타입 선언 해야 합니다. 비록 "타입 없음(no Type)"일 셩우에도 *라고 선언해 둡니다.

올바른 예

var value:*;


나쁜 예

var value;

타입은 가능한 엄밀하게 지정
루프의 인덱스 번호는 Number형이 아닌 int형으로 (ex. for(var i:int=0; i < n; i++))
다른 예로서 mouseDownHandler의 인수는 event:Event 보다는 event:MiuseEvent로 선언
음의 수가 되지 않는 경우에도 integers(정수)형의 int를 사용
unit는 RGB의 색지정, 비트 마스크, 그 외 수치가 아닌 값(non-numeric)만 사용합니다.

값이 undefined 이 될 수 있는 경우에만 타입 지정 *를 사용하도록 합니다. 대부분의 경에에서는 * 보다는 Object를 사용하도록 하여 “object doesn't exist(오브젝트가 존재하지 않음)”하는 경우 null을 사용합니다.

Array선언시 배열형을 나타낸다.

올바른 예

var a:Array /* of String */ = []

나쁜 예

var a:Array = []

다른 올바른 예

function f(a:Array/* of Number */):Array /* of Object */
{
...

}

나쁜 예

function f(a:Array):Array


리터럴 (Literals)


undefined

가능한 사용은 삼가합시다.


int와 unit 리터럴

정수형(int)에는 소수점을 사용하지 않도록 합니다.

올바른 예

2

나쁜 예

2.

16진수에는 소문자 x와 대문자 A-Z를 사용합니다.

올바른 예

0xFEDCBA

나쁜 예

0Xfedcba

RGB 값은 항상 6자리의 16진수로 기술합니다.

올바른 예

private const BLACK:uint = 0x000000;

나쁜 예

private const BLACK:uint = 0;

인덱스에서 사용시 -1 값은 "no index"를 의미합니다.


Number 리터럴 (Number literals)

Number형을 사용할때는 명시적으로 소수점을 씁니다. 0의 경우에도 소수점을 지정하도록 합니다.

올바른 예

alphaFrom = 0.0;
alphaTo= 1.0;

나쁜 예

alphaFrom = 0;
alphaTo= 1;

그러나, 픽셀 좌표에서는 이를 하지 마십시오. (약간에 모순이 존재)

나쁜 예

var xOffset:Number = 3;

나쁜 예

var xOffset:Number = 3.0;

지수를 표기할 때는 E가 아닌 소문자 e로 합니다.

올바른 예

1.0e12

나쁜 예

1.0E12

Number 값이 지정되지 않음(not set)의 기본 값은 NaN입니다.


String 리터럴 (String literals)

문자열을 (') 따옴표나 (") 겹따옴표를 사용하여 묶습니다. 만약 문자열에 (")문자가 포함될 경우 문자열로 하려면 다음과 같이 합니다.

올바른 예

"What's up, \"Big Boy\"?"

나쁜 예

'What\'s up, "Big Boy"?'

Use \u, not \U, for unicode escape sequences.


Array 리터럴 (Array literals)

new Array() 보다는 Array 리터럴을 사용합니다.

올바른 예

[]

나쁜 예

new Array()

다른 올바른 예

[1, 2, 3]

나쁜 예

new Array(1, 2, 3)

Array constructor (new Array()) 는 요소수를 특정해 생성할 때에만 사용하도록 합니다.
ex) new Array(3) 이것은 [undefined, undefined, undefined] 하는 의미로, [3] 과 다른 것에 주의해 주세요.


Object 리터럴 (Object literals)
new Object() 보다는 Object 리터럴을 사용합니다.

올바른예

{}

나쁜 예

new Object()

다른 올바른 예

o = {a:1, b:2, c:3};

나쁜 예

o = new Object();
o.a = 1;
o.b = 2;
o.c = 3;

다른 올바른 예

o = {}
o.a = 1;
o.b = 2;
o.c = 3;


Function 리터럴 (Function literals)

익명의 함수(anonymous functions) 정의를 위한 function 리터럴 사용을 피해야 합니다. 대신에 클래스 메소드나 패키지 함수를 사용합니다. function 표기에는 반드시 리턴값 타입을 선언하고, function 블록 안의 문자의 마지막은 세미콜론(;)으로 끝냅시다.

올바른 예

function(i:int):void { doIt(i - 1); doIt(i + 1); }

나쁜 예

function(i:int) { doIt(i - 1); doIt(i + 1) }


RegExp 리터럴 (RegExp literals)

String을 사용하여 RegExp 인스턴스를 생성하는 것보다 리터럴 표기를 사용합니다.

올바른 예

var pattern:RegExp = /\d+/g;

나쁜 예

var pattern:RegExp = new RegExp("\\d+","g");


XML and XMLList literals

String으로 XML 인스턴스를 생성하는 것보다, 다음과 같이 리터럴 표기를 사용합니다.

올바른 예

var node:XML = <name first="jane" last="Doe"/>;

나쁜 예

vat node:XML = new XML("<name first=\"jane\" last=\"Doe\"/>");

XML의 속성(attribute)값에는 '(single-quotes) 보다는 "(double-quotes)를 사용합니다.

올바른 예

var node:XML = <name first="jane" last="Doe"/>;

나쁜 예

var node:XML = <name first='jane' last='Doe'/>;


Class 리터럴
같은 이름을 가진 클래스를 두 개를 임포트 할 경우 이를 명확히 하고자 할 경우 완전히 갖춘 클래스 리터럴을 사용합니다.

올바른 예

import mx.controls.Button;

var b:Button = new Button();

나쁜 예

import mx.controls.Button;

var b:Button = new mx.controls.Button();

예외의 경우 (같은 이름을 가진 두개의 클래스를 임포트 할 경우 완전한 클래스 리터럴을 사용)

import mx.controls.Button
import my.controls.Button

vat b:Button = new mx.controls.Button();


표현식 (Expressions)


() 소괄호(Parentheses)

+, -, *, /, &&, ||, <, <=, >, >=, ==, and != 와 같은 일반 연산자를 사용할 때에는 불필요한 소괄호를 사용하지 않도록 합니다.

올바른 예

var e:Number = a * b / (c + d);

나쁜 예

var e:Number = (a * b) / (c + d);

다른 올바른 예

var e:Boolean  = a && b || c == d;

나쁜 예

var e:Boolean = ((a && b) || (c == d));

다른 연산자에 대한 우선순위 규칙은 꼭 기억하고, 그러할 경우 괄호는 더 도움이 될 수 있습니다.


Coercion

Boolean값을 true나 false와 비교하는 불필요한 것은 하지 마십시오. 둘 중의 한 값(true 또는 false) 밖에 되지 않기 때문입니다.

올바른 예

if (flag)

나쁜 예

if (flag == true)

올바른 예

var flag:Boolean = a && b;

나쁜 예

var flag:Boolean = (a && b) != 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)

Prefer the use of a cast to the use of the as operator. Use the as operator only if the coercion might fail and you want the expression to evaluate to null instead of throwing an exception.

올바른 예

IUIComponent(child).document

나쁜 예

(child as IUIComponent).document


Comparison

자연스럽게 읽을 수 있는 차례로 비교문을 씁니다.

올바른 예

if (n == 3) // "만약 n 이 3 이면"

나쁜 예

if (3 == n) // "만약 3 이 n 이면"


++와 -- 연산자

In cases where the postfix and prefix forms are equivalent, use the postfix form. Use the prefix form only when you need to use the value before it is incremented.
(접두사 형태(++i)나 접미사 형태(i++)중 아무거나 사용해도 상관없다면 접미사 형태를 사용해라. 접미사 형태는 오직 값이 먼저 증가될 필요가 있을 경우에만 사용해라.)

올바른 예

for (var i:int = 0; i < n; i++)

나쁜 예

for (var i:int = 0; i < n; ++i)


3항 연산자

단순한 if/else 기술 (특히 null 체크)시에는, 3항 연산자를 사용합니다.

올바른 예

return item ? item.label : null;

나쁜 예

if (!item)
return null;
return item.label;

그렇지만, 중첩되는 복잡한 if/else 논리때는 3항 연산자는 사용하지 않도록 합니다.

올바른 예

if (a < b)
return -1;
else if (a > b)
return 1;
return 0;

나쁜 예

return a < b ? -1 : (a > b ? 1 : 0);


new 연산자

constructor에 인수를 건네주지 않는 경우에서도 class 선언의 뒤에는 ()를 씁니다.

올바른 예

var b:Button = new Button();

나쁜 예

var b:Button = new Button();


명령문(Statements)

명령문은 세미콜론으로 끝냅니다. ActionScript 3의 세미콜론 옵션 기능(optional-semicolon)에 의지하지 않도록 합니다.

올바른 예

a = 1;
b = 2;
c = 3;

나쁜 예

a = 1
b = 2
c = 3


include 선언문

#include 는 아니고 include 라고 씁니다. 또, 다른 명령문과 같게 마지막에 세미콜론을 씁니다.

올바른 예

include "../core/ComponentVerison.as";

나쁜 예

#include "../core/ComponentVersion.as"

절대 경로가 아니고 상대 경로로 지정합니다.


import 선언문

클래스나 인터페이스나 패키지 레벨의 함수를 임포트 할 때는 *(와일드 카드 지정)가 아닌 제대로 지정하여 임포트 합니다.

올바른 예

import mx.controls.Button;
import flash.utils.getTimer;

나쁜 예

import mx.core.*;


use namespace 선언

use namespace의 사용은 피하는 대신 :: 문장구조법을 사용합니다.
Avoid them; use :: syntax instead on each reference to something in a non-open namespace.

올바른 예

import mx.core.mx_internal;

// Later, in some method...
mx_internal::doSomething();

나쁜 예

import mx.core.mx_internal;
use namespace mx_internal;

// Later, in some method...
doSomething();


if 문

if/else문 내의 명령이 한 개 밖에 없는 경우는 {} 블록으로 둘러싸지 않도록 합니다.

올바른 예

if (flag)
doThing1();

나쁜 예

if (flag)
{
doThing1();
}

다른 예

if (flag)
doThing1();
else
doThing2();

나쁜 예

if (flag)
{
doThing1();
}
else
{
doThing2();
}

다만, 명령문이 여러개 있는 요소가 있다면 모두 {}로 둘러 싸도록 합니다.

올바른 예

if (flag)
{
doThing1();
}
else
{
doThing2();
doThing3();
}

나쁜 예

if (flag)
doThing1();
else
{
doThing2();
doThing3();
}

When doing multiple error checks, use sequential if statements that test for failure and return early. The successful execution flow is then down the page, with the succesful return at the end of the method. Do not use nested tests for success, which make the execution flow drift across the page.

올바른 예

if (!condition1)
    return false;
...
if (!condition2)
    return false;
...
if (!condition2)
    return false;
...
return true;

나쁜 예

if (condition1)
{
    ...
    if (condition2)
    {
        ...
        if (condition3)
        {
            ...
            return true;
        }
    }
}
return false;


for문

for 루프내의 명령이 1개 밖에 없어도, 항상 {}로 둘러 싸도록 합니다.

올바른 예

for (var i:int = 0; i < 3; i++)
{
   doSomething(i);
}

나쁜 예

for (var i:int = 0; i < 3; i++)
    doSomething(i);

for 루프의 상한값을 로컬 변수로서 사전에 보관 유지하게 합니다. 이것에 의해서 루프가 돌 때마다 변수의 평가를 다시 하지 않게 할 수 있습니다. (물론 비교 평가는 반복 실행되지 않으면)

올바른 예

var n:int = a.length;
for (var i:int = 0; i < n; i++)
{
    ...
}

나쁜 예

for (var i:int = 0; i < a.length; i++)
{
    ...
}

그것(인덱스변수)이 다른곳에서 사용되지 않는한 for 문장의 ()안에서는 var 선언합니다.

올바른 예

for (var i:int = 0; i < 3; i++)

나쁜 예

var i:int;
for (i = 0; i < 3; i++)
{
   ...
}


while 문

while 루프는 비록 내용이 1행이었다고 해도 {}블록으로 둘러싸도록 합니다.

올바른 예

while (i < n)
{
   doSomething(i);
}

나쁜 예

while (i < n)
    doSomething(i);


do문

do 루프는 비록 내용이 1행이었다고 해도 {}블록으로 둘러 싸도록 합니다.

올바른 예

do
{
   doSomething(i);
}
while (i < n);

나쁜 예

do
    doSomething(i);
while (i < n);


switch 문

case clause (와)과 default clause (은)는 모두 블록으로 둘러 싸도록 합니다. 각 블록내에 break 혹은 return 을 기술 하도록 합니다. 리턴을 사용할 때는 return 후에 break (을)를 두지 않도록 합니다.
Make the body of each case clause, and of the default clause, be a block. Put the break or return statement within the block, not after it. If you are returning, don't put a break after the return. Treat the default clause similarly to the case clauses; break or return from it rather than falling through the bottom of the switch.

올바른 예

switch (n)
{
    case 0:
    {
        foo();
        break;
    }

    case 1:
    {
        bar();
        return;
    }

    case 2:
    {
        baz();
        return;
    }

    default:
    {
        blech();
        break;
    }
}

나쁜 예

switch (n)
{
    case 0:
        foo();
        break;

    case 1:
    {
        bar();
    }
    break;

    case 2:
        baz();
        return;
        break;

    default:
        blech();
}


return 문

return을 사용하는 경우는 불필요하게 ()괄호호 둘러싸지 않게 해주세요.

올바른 예

return n + 1;

나쁜 예

return (n + 1);

메소드의 도중에 리턴하는 것은 OK입니다.



Declarations


1행의 명령문 아에서 복수의 정수나 변수를 선언하지 않도록 합니다.

올바른 예

var a:int = 1;
var b:int = 2;

나쁜 예

var a:int = 1, b:int = 2


override 키워드

액세스 접근제한자의 앞에 쓰도록 합니다.

올바른 예

override protected method measure():void

나쁜 예

protected override method measure():void


접근 제한자 (Access specifiers)

지정할 수 있는 개소에서는 반드시 액세스 지정자를 기술하도록 합니다. 아무것도 기술하지 않았던 때에는 접근 제한자 internal 취급이 됩니다만, 이보완 기능에는 의지하지 않도록 합니다.

API를 public이나 protected로 할 때는, 정말로 그렇게 해야 하는가를 잘 생각합니다.
Before making an API public or protected, think hard about whether it is really needs to be. Public and protected APIs must be documented. They must also be supported for several releases before being formally deprecated


static 키워드

접근 제한자의 뒤에 쓰도록 합니다.

올바른 예

public static const MOVE:String = &quot;move&quot;

나쁜 예

static public const MOVE:String = &quot;move&quot;;


final 키워드

액세스 지정자의 뒤에 쓰도록 합니다.

올바른 예

public final class BoxDirection

나쁜 예

final public class BoxDirection

Declare all “enum classes” to be final.
Also declare “base” properties and methods (those starting with $) to be final.


상수 (Constants)

상수는 모두 static으로 합니다. 인스턴스화했더니 어차피 같은 값이 들어오니까.

올바른 예

public static const ALL:String = "all";

나쁜 예

public const ALL:String = "all";


변수 (Variables)

변수에 초기치를 갖게해 두고 싶을 때는, constructor 내가 아니고, 선언시에 해 두도록 하겠습니다.

올바른 예

private var counter:int = 1;

나쁜 예

private var counter:int;
...
public function MyClass()
{
    super();
    ...
    counter = 1;
}


로컬 변수 (Local Variables)

로컬 변수는 사용하기 직전에 선언하도록 합니다. 함수의 첫머리에서 정리해 선언해 두는 것은 그만둡시다.

올바른 예

private function f(i:int, j:int):int
{
    var a:int = g(i - 1) + g(i + 1);
    var b:int = g(a - 1) + g(a + 1);
    var c:int  = g(b - 1) + g(b + 1);

    return (a * b * c) / (a + b + c);
}

나쁜 예

private function f(i:int, j:int):int
{
    var a:int;
    var b:int;
    var c:int;

    a = g(i - 1) + g(i + 1);
    b = g(a - 1) + g(a + 1);
    c = g(b - 1) + g(b + 1);

    return (a * b * c) / (a + b + c);
}

동명의 로컬 변수의 선언은 한 함수내에 대해 1개입니다. 그렇다고 하는 것도 ActionScript 3 그럼 블록내의 로컬 스코프는 없기 때문입니다. (?)
Declare local variables only one per function. ActionScript 3 doesn't have block-scoped locals.

올바른 예

var a:int;
if (flag)
{
    a = 1;
    ...
}
else
{
    a = 2;
    ...
}

나쁜 예

var a:int;
if (flag)
{
    a = 1;
    ...
}
else
{
    a = 2;
    ...
}

다른 올바른 예

var i:int;
for (i = 0; i &lt; n; i++)
{
    ...
}

for (i = 0; i &lt; n; i++)
{
    ...
}

나쁜 예

for (var i:int = 0; i &lt; n; i++)
{
    ...
}

for (var i:int = 0; i &lt; n; i++)
{
    ...
}


클래스 (Classes)

Object 형태를 확장시킨 클래스의 경우는, extends Object의 기술은 생략 할 수 있습니다.

클래스 내에 "bare statements" 만이 loadResources(). 등의 정적 클래스 초기화 메소드의 호출이 되도록 합니다.


생성자 (Constructors)

클래스에 인스턴스 멤버가 있는 경우는 생성자(constructor)를 기술하고, 비록 다른 용도가 없다고 해도 명시적으로 super()를 호출하도록 합니다.
생성자 함수에 인수를 건네주어 인스턴스 변수를 설정하는 경우는, 인스턴스 변수와 같은 이름을 붙여 사용합니다.

올바른 예

public function MyClass(foo:int, bar:int)
{
    this.foo = foo;
    this.bar = bar;
}

나쁜 예

public function MyClass(fooVal:int, barVal:int)
{
    foo = fooVal;
    bar = barVal;
}

생성자 내에서 인스턴스 변수의 값을 설정하는 것이 아니라, 인스턴스 변수의 선언시에 끝마쳐 두도록 하겠습니다. 예외로서 상속된 인스턴스 변수를 리셋하고 싶을 때는 생성자(constructor) 내에서 설정해도 좋습니다.


인터페이스 (Interfaces)

TBD (To Be Determined : '차후 결정될 예정, 아직 미정'이라는 뜻입니다.)


네임스페이스 (Namespaces)

TBD


프롭퍼티 포함 (Implementing properties)

TBD


메타데이타 (Metadata)

TBD


패키지 (Packages)


패키지 문 안에 한개 public API (일반적으로 클래스, 경우에 따라서는 네임스페이스)만을 배치합니다.

Helper classes

bare statements
저작자 표시 비영리 변경 금지
신고
Posted by 코멧'★

티스토리 툴바