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

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

3. 파일 구성 (File Organization)

저작권 표기


프레임워크의 모든 .as 파일의 상단에 저작권 표기를 포함합니다. 아래의 예는 2008년 오픈 소스 저작권 정보의 서식을 나타냅니다.

////////////////////////////////////////////////////////////////////////////////
//
//  ADOBE SYSTEMS INCORPORATED
//  Copyright 2008 Adobe Systems Incorporated
//  All Rights Reserved.
//
//  NOTICE: Adobe permits you to use, modify, and distribute this file
//  in accordance with the terms of the license agreement accompanying it.
//
////////////////////////////////////////////////////////////////////////////////


폭이 80 문자인 점에 주의해 주세요.


package문


후일 발표 예정


import문

 
후일 발표 예정


use namespace문

 
후일 발표 예정


클래스 메타데이타 (Class metadata)

 
클래스의 메타데이타는 섹션으로 분류하며, Events, Styles, Effects, Excluded APIs, Other Metadata의 순서로 기술합니다.

각 섹션의 전에는 2차 섹션 헤더를 배치합니다. 2차 섹션 헤더의 폭은 40문자. 그리고, "//"라고 섹션명의 사이에는 스페이스가 2개 들어가 있는 것에 주의해 주세요.

각 섹션내에서는 메타데이타의 name="..."의 부분을 기준에 알파벳순서에 늘어놓습니다. Other Metadata(그 외의 메타데이타)섹션에서는 메타데이타의 태그 이름을 기준에 알파벳 순서에 늘어놓습니다.

//--------------------------------------
//  Events
//--------------------------------------
/
**
*  ASDoc comment.
*/
[Event

/**
*  ASDoc comment.
*/
[Event

//--------------------------------------
//  Styles
//--------------------------------------

/**
*  ASDoc comment.
*/
[Style

/**
*  ASDoc comment.
*/
[Style]

//--------------------------------------
//  Effects
//--------------------------------------

/**
*  ASDoc comment.
*/
[Effect

/**
*  ASDoc comment.
*/
[Effect]

//--------------------------------------
//  Excluded APIs
//--------------------------------------

[Exclude(name="horizontalAlign", kind="style")]
[Exclude(name="verticalAlign", kind="style")]

//--------------------------------------
//  Other metadata
//--------------------------------------

[DefaultBindingProperty(source="text", destination="text")]
[IconFile("Text.png")]


클래스 선언

 
후일 발표 예정


Version.as 대한 include문

 
클래스에는 상대 패스를 사용하고, core/Version.as를 인클루드 하도록 합니다. 이 파일에는 static const VERSION:String의 선언이 포함되어 있습니다.

include "../core/Version.as";


Implementation notes

 
후일 발표 예정


클래스 초기화 (Class intialization)

 
후일 발표 예정


클래스 상수 (Class constant)

 
정적 상수(static const) 선언을 여기에 배치합니다.

ActionScript 3 는 Array형 또는 Object형의 상수를 허가하지 않습니다. 이런한 케이스에서는 static const는 아니고 static var를 상수처럼 선언합니다. 다만 이 경우 개념상은 상수이기 위하여 이 섹션에 기술하도록 합니다.


클래스 믹스 인 (Class mix-ins)

 
메소드로서 선언되는 것이 아니라 믹스-인 되는 함수(Function) 형태의 정적 변수(static variable)는 모두 선언하도록 합니다.


클래스 자원 (Class resources)

 
후일 발표 예정


클래스 프라퍼티 (Class properties)

 
static getter 및 static setter는 여기서 선언하도록 합니다. 이러한 선언은 프라퍼티명을 기준을 알파벳순서로 늘어놓습니다. 각 프라퍼티간에는 프라퍼티명이 들어간 이차적인 separator를 배치합니다. getter를 기술하고 나서 setter를 기술하도록 합니다.


클래스 메소드

 
static function 선언을 여기에 배치합니다.



생성자 (Constructor)

 
후일 발표 예정


오버라이드 (overridden Propertirs)

 
non-static getter 및 setter의 오버라이드(override)를 여기에 배치합니다. 이러한 선언은 프라퍼티명 기준을 알파벳 순서데로 늘어놓습니다. 각 프라퍼티간에는 파라퍼티명이 들어간 이차적인 separator를 배치합니다. getter를 기술하고 나서 setter를 기술하도록 합니다.


프라퍼티 (Properties)

  
새로운 비 static의 getter 및 setter를 여기에 배치합니다. 이러한 선언은 프라퍼티명을 기준으로 알파벳순서로 늘어놓습니다. 각 프라퍼티간에는 파라퍼티명이 들어간 이차적인 separator를 배치합니다. getter를 기술하고 나서 setter를 기술하도록 합니다.


오버라이드 (override) 된 메소드(Overridden Methods)

  
비 static 함수의 오버라이드(override)를 여기에 배치합니다.



메소드 (Methods)

  
새로운 비 static 함수를 여기에 배치합니다.


 오버라이드 (override) 된 이벤트 핸들러 (Overridden event handlers)

 
이벤트 핸들러의 오버라이드(override)를 여기에 배치합니다.


이벤트 핸들러 (Event handlers)


새로운 이벤트 핸들러를 여기에 배치합니다.


패키지 외의 헬퍼 클래스 (Out-of-package helper classes)

  
후일 발표 예정


종합

저작권 표기
package문
import문
use namespace문
클래스 메타데이타 (Class metadata)
클래스 선언
Version.as 대한 include 문
Implementation notes
클래스 초기화 (Class initialization)
클래스 상수 (Class constant)
클래스 믹스 인 (Class mix-ins)
클래스 자원 (Class resources)
클래스 변수 (Class variables)
클래스 프라퍼티 (Class properties)
클래스 메소드
생성자 (Constructor)
변수(Variables)
오버라이드 (override)된 프라퍼티 (Overridden Properties)
프라퍼티 (Properties)
오버라이드 (override)된 메소드 (Overridden Methods)
메소드 (Methods)
오버라이드 (override)된 이벤트 핸들러 (Overridden event handlers)
이벤트 핸들러 (Event handlers)
패키지 외의 헬퍼 클래스 (Out-of-package helper classes)


4. 기술 서식 (Formatting)


행 너비 (Line width)


코드는 한 라인에 문자는 80 글자로 합니다. 이렇게 했을때 아래와 같은 이득이 따릅니다.
  • 개발자가 작은 화면을 사용하고 있는 경우, 긴 행을 읽을 때에 수평 스크롤 할 필요가 없습니다.
  • 비교 유틸리티를 사용할 때, 파일의 두 개 버전을 옆으로 늘여 놓아 나타낼 수 있습니다.
  • 프로젝터를 사용해 그룹에 프리젠테이션 할 때, 스크롤 아닌 font size를 크게 하는 것으로 대응할 수 있습니다.
  • 인쇄시 짤리거나 쓸데 없는 개행 없이 원시 코드를 인쇄할 수 있습니다.

들여쓰기 (Indentation)

 
스페이스 4문자의 들여쓰기로 사용합니다. 텍스트 문자 폅집기의 설정을 조정하여 탭은 아이고 스페이스가 삽입되도록 합니다. 이 규칙을 지키는 것으로, 다른 인덴트 설정이 이용된 프로그램(8 문자 들여쓰기인 메모장등)에서도 코드의 자체를 어지럽히는 일 없이 표시할 수 있게 됩니다.



섹션 구분자 (Section separators, 단락 구분)

 
클래스내의 주요 섹션 구분자는 다음과 같이 합니다.

    //--------------------------------------------------------------------------
    //
    //  Overridden methods
    //
    //--------------------------------------------------------------------------

구분자 자체를 4 컬럼부터 80컬럼까지 늘리고, 텍스트는 8문자까지 들여쓰기 합니다.

클래스내의 2차 섹션 구분자(프라퍼티간 등)는 다음의 체재로 합니다.

    //----------------------------------
    //  visible
    //----------------------------------


구분자 자체를 4문자로부터 40문자까지 늘려 텍스트를 8문자까지 들여쓰기 합니다.

구분자의 앞뒤 공백 행은 각각 1행씩 배치합니다.


선언의 분리

 
상수, 변수 및 함수 선언 사이에는 세로 방향의 구분자로서 공백행을 1행씩 배치합니다.

/**
*  @private
*  Holds something.
*/
var a:Number;

/**
*  @private
*/
var b:Number


메타데이타 (MetaData)

 
후일 발표 예정

올바른 예

Inspectable[a="1", b="2"]

나쁜 예

Inspectable[a=1 b=2]


배열 인덱스 (Array indexing)

 
좌측의 [ 묶음의 직후 및 우측의 ] 의 직전에는 스페이스가 들어갈 수 없습니다.

올바른 예

a[0]

나쁜 예

a[ 0 ]


, 콤마 (Commas)

 
콤마의 뒤에는 스페이스를 한 개 기입합니다. 이 규칙은 일련의 파라메터, Array 리터럴 및 Object 리터럴에 적용됩니다.


Array 리터럴 (Array literals)

 
좌측의 [ 묶음의 직후에 스페이스를 1개, 우측의 ] 묶음의 직전에도 스페이스를 1개, 그리고 각 콤마의 직후(직전이 아닙니다)에 스페이스 1개를 각각 배치합니다.

올바른 예

[ 1, 2, 3 ]

나쁜 예

[1, 2, 3]
 
[1,2,3]

공 배열 (empty array)는 특수한 케이스입니다.

올바른 예

[]

나쁜 예

[ ]

복수의 행이 필요한 긴 배열의 초기화시에는 정렬된 [] 묶음을 사용합니다.

static var numberNames:Array /* of String */ =
[
    "zero",
    "one",
    "two",
    "three",
    "four",
    "five",
    "six",
    "seven",
    "eight",
    "nine"
];


Object 리터럴(Object literals)

 
좌측의 { 괄호의 직후에 스페이스를 1개, 우측의 { 괄호의 직전에도 스페이스를 1개, 그리고 프라퍼티명과 그 값을 나누는 : 콜론의 직후에 스페이스를 1개 배치하도록 합니다.

올바른 예

{ a: 1, b: 2, c: 3 }

나쁜 예

{a: 1, b: 2, c: 3}

{a:1, b:2, c:3}

{a:1,b:2,c:3}

빈 오브젝트(empty object)는 예외입니다.

올바른 예

{}

나쁜 예

{ }

복수의 행이 필요한 긴 오브젝트의 초기화시에는 정렬된 {} 괄호를 사용합니다.

private static var TextStyleMap:Object =
{
    color: true,
    fontFamily: true,
    fontSize: true,
    fontStyle: true,
    fontWeight: true,
    leading: true,
    marginLeft: true,
    marginRight: true,
    textAlign: true,
    textDecoration: true,
    textIndent: true
};


함수 리터럴 (Function literals)

 
후일 발표 예정

var f:Function;

f = function():void
{
    doSomething();
};


형태 선언

 
변수, 인수 또는 함수와 이러한 형태의 사이에 있는 콜론의 직전 밑 직후에는 스페이스를 들어갈 수 있습니다.

올바른 예

var n:Number;

나쁜 예

var n : Number;

var n: Number;

다른 올바른 예

function f(n:Number):void

나쁜 예

function f(n : Number) : void

function f(n: Number): void


연산자와 대입

 
대입 연산자의 전후에는 스페이스를 1개 넣습니다.

올바른 예

a = 1;

나쁜 예

a=1;

Infix 연산자의 전후에는  스페이스를 1개 넣습니다.

올바른 예

a + b * c

나쁜 예

a+b*c

비교 연산자의 전후에는 스페이스를 1개 넣습니다.

올바른 예

a == b

나쁜 예

a==b

Prefix연산자와 그 작용 대상의 사이에는 스페이스가 들어갈 수 없습니다.

올바른 예

!o

나쁜 예

! o

Postfix 연산자와 그 작용 대상의 사이에는 스페이스가 들어갈 수 없습니다.

올바른 예

i++

나쁜 예

i ++


스테이트먼트(Statement)

 
모든 스테이트먼트에 breakpoint를 설치할 수 있도록, 각 스테이트먼트를 새로운 행으로 개시하도록(듯이) 합니다.

올바른 예

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

나쁜 예

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

스테이트먼트 블록의 괄호를 정렬하도록 합니다.

올바른 예

function f():void
{
    var n:int = numChildren;
    for (var i:int = 0; i < n; i++)
    {
        if ()
        {
            x = horizontalGap * i;
            y = verticalGap * i;
        }
    }
}

나쁜 예

function f():void {
    var n:int = numChildren;
    for (var i:int = 0; i < n; i++) {
        if () {
            x = horizontalGap * i;
            y = verticalGap * i;
        }
    }
}


정수 및 변수의 선언

 
후일 발표 예정


함수의 선언


후일 발표 예정

올바른 예

f(a, b)

나쁜 예

f(a,b)

f( a, b )

파라메터를 열거할 때에 행의 즉시가 발생하는 경우, 좌측의 괄호와 정렬하듯이 즉시 후의 행을 들여쓰기 합니다. 스페이스에 여유가 있는 경우는 복수의 파라메터를 1행에 기술하고 그 외의 경우에는 1행에 대해 1개의 파라메터를 기술합니다. 1개의 파라메터마저 기술하는 스페이스가 없는 경우는, 2행째에 최초의 파라메터를 배치하여 다음 행의 인덴트를 함수명보다 전의 위치까지 이동합니다.

public function foo(parameter1:Number, parameter2:String,
                    parameter3:Boolean):void

public function foo(parameter1:Number,
  parameter2:String,
                    parameter3:Boolean):void

public function aVeryLongFunctionName(
    parameter1:Number, parameter2:String,
    parameter3:Boolean):void


함수의 호출 (Function Calls)


후일 발표 예정

올바른 예

f(a, b)

나쁜 예

f(a,b)

f( a, b )


if 문


if키워드와 좌측의 괄호의 사이에는 스페이스를 1개 넣습니다. 좌측의 괄호의 직후, 및 우측의 괄호의 직전에는 스페이스가 들어갈 수 없습니다.

올바른 예

if (a < b)

나쁜 예

if(a < b)

if( a < b )

if ( a < b )


for 문


for 키워드와 좌측의 괄호의 사이에는 스페이스를 1개 넣습니다. 좌측의 괄호의 직후 및 우측의 괄호의 직전에는 스페이스가 들어갈 수 없습니다.

올바른 예

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

나쁜 예

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

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

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

 for 구로 다음 행으로 내려 써야 할 경우가 발생할 때에는, 좌측의 괄호와 정렬하듯이 다음 행을 들여쓰기 합니다.

for (var aLongLoopVariableName:int = aLongInitialExpression;
     aLongLoopVariableName < aLongUpperLimit;
     aLongLoopVariableName++)


switch문


switch 키워드와 좌측의 괄호의 사이에는 스페이스를 1개 넣습니다. 좌측의 괄호의 직후, 및 우측의 괄호의 직전에는 스페이스가 들어갈 수 없습니다.

올바른 예

switch (n)

나쁜 예

switch(n)

switch( n )

switch ( n )

Follow the switch keyword with a single space before the left parenthesis. Don't put any spaces after the left parenthesis or before the right parenthesis.

올바른 예

switch (n)
{
    case 1:
    {
        a = foo();
        break;
    }

    case 2:
    {   a = bar();
        break;
    }

    default:
    {
        a = blech();
        break;
    }
}

나쁜 예

switch(n)

switch( n )

switch ( n )


class 선언 및 interface 선언


괄호를 항상 대응 시키도록 합니다.

단독의 행의 주위에 괄호는 불필요합니다.

1행에 대해 1개의 스테이트먼트를 기술합니다.



5. ASDoc


프라퍼티에 대한 코멘트를 붙여라


프라퍼티에 있는 한벌의 get/set 함수 가운데, 최초의 것에만 코멘트를 붙이도록 합니다. 프라퍼티의 정의 방법 밑 코멘트 기술 체재는 이하와 같습니다.

/**
*  @private
*  The backing variable for the property.
*/
private var _someProp:Foo;

/**
*  Place all comments for the property with the getter which is defined first.
*  Comments should cover both get and set behavior as appropriate.
*/
public function get someProp():Foo
{
  ...
}

/**
*  @private
*/
public function set someProp(value:Foo):void
{
  ...
}

ASDoc의 코멘트는 메타데이타 태그 뿐만이 아니라, 클래스내의 다른 생성자에도 적용됩니다. 코멘트가 대상이 되는 모두에 있어서 적절하도록 주의해 주세요. 프라퍼티를 Bindable로서 태그화하는 경우는, 프라퍼티 코멘트를 get 함수보다 전 한편 Bindable 메타데이타 태그보다 뒤의 위치에 배치합니다.

올바른 예

[Bindable("somePropChanged")]

/**
*  Comments for someProp
*/
public function get someProp():Foo

나쁜 예

/**
* Comments for someProp
*/
[Bindable("somePropChanged")]

public function get someProp():Foo

저작자 표시 비영리
신고
Posted by 코멧'★
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 코멧'★

티스토리 툴바