Skip to content

Latest commit

 

History

History
629 lines (482 loc) · 23.8 KB

README_ko.md

File metadata and controls

629 lines (482 loc) · 23.8 KB

커피스크립트 스타일 가이드

이 가이드는 CoffeeScript 프로그래밍 언어에 대한 모범 사례와 코딩 관례 모음집입니다.

이 가이드는 커뮤니티 중심으로 만들어진 것입니다. 참여는 대환영입니다.

이 문서는 작업 중이니 주의해주세요: 기술된 것보다는 기술할 게 많으며, 가이드라인의 어떤 항목은 커뮤니티에 의해 가이드라인으로 간주되지 않을 수도 있습니다.(이 경우, 가이드라인은 적절하게 수정되거나 제거될 것 입니다.)

영감을 얻은 곳들

이 가이드의 내용은 몇가지 가이드와 자료들에서 강한 영감을 받았습니다. 특히:

목차

## 코드 레이아웃 ### 탭? 스페이스?

한 번 들여쓸 때에는 두 칸스페이스(공백) 만을 사용하세요. 절대로 탭(tab)과 스페이스를 섞어서 쓰지 마세요.

### 한 줄의 최대 길이

한 줄에 쓸 수 있는 최대 문자개수는 79개입니다.

### 빈 줄

top-level 함수와 클래스를 정의한 것 사이는 빈 줄을 하나 띄워서 구분해 주세요.

클래스 안에서 메서드를 정의할 때에는, 중간에 빈 줄을 하나 띄워서 구분해 주세요.

가독성을 높이기 위해 필요한 경우에는, 메서드나 함수를 정의하는 본문 안에서는 빈줄 하나를 써 주세요. (예를 들면, 논리적인 덩어리를 명확하게 구분하기 위해 필요할때)

### 줄끝의 공백

어떤 줄에도 끝에 공백을 넣지 마세요.

### 인코딩

UTF-8 이 기본 소스 파일 인코딩입니다.

## 모듈 불러오기

모듈(CommonJS나, AMD등등)을 사용하신다면, require구문은 다른 줄과 독립되게 적어주세요.

require 'lib/setup'
Backbone = require 'backbone'

이 구문은 다음과 같은 순서로 묶여져야 합니다:

  1. _(표준 라이브러리가 있다면)_표준 라이브러리
  2. 외부 라이브러리
  3. _(이 앱이나 라이브러리에만 있는)_내부 라이브러리
## 표현식, 구문에서의 공백

다음과 같은 상황에 공백사용을 피해주세요:

  • 소중대 괄호를 열고 닫을 때

       ($ 'body') # Yes
       ( $ 'body' ) # No
  • 쉼표 바로 전에

       console.log x, y # Yes
       console.log x , y # No

추가 권장사항:

  • 다음 연산자들은 항상 앞뒤로 한 칸의 공백을 두세요.

    • 대입: =

      • 주의하세요. 함수 선언부의 인자의 기본값에도 적용됩니다.

        test: (param = null) -> # Yes
        test: (param=null) -> # No
- 확장 대입: `+=`, `-=` 등등.
- 비교: `==`, `<`, `>`, `<=`, `>=`, `unless` 등등.
- 산술 연산: `+`, `-`, `*`, `/` 등등.

- _(한칸 이상의 공백을 이 연산자들에 사용하지 마세요)_

    ```coffeescript
       # Yes
       x = 1
       y = 1
       fooBar = 3

       # No
       x      = 1
       y      = 1
       fooBar = 3
    ```
## 주석달기

기존의 주석이 기술하는 코드를 수정하는 경우에는, 새로운 코드를 반영하도록 기존의 주석도 수정해주세요. (이상적으로는, 주석을 달 필요가 없게 코드를 개선해서, 주석을 아예 제거하세요.)

첫번째 단어가 소문자로 시작하는 식별자(identifier)인 경우를 제외하고는, 주석의 첫번째 문자는 대문자로 써주세요.

주석이 짧다면, 끝에 있는 마침표(.)는 생략해도 됩니다.

### 블록 주석

블록 주석은 주석다음에오는 코드 블럭에 적용됩니다.

블록 주석의 각 줄은 #와 한칸의 공백으로 시작하고, 설명하려는 코드와 같은 깊이의 들여쓰기를 사용해야 합니다.

블록 주석안의 문장은 #를 포함하는 한 줄로 구분합니다.

# 이것은 블록 주석입니다. 이게 진짜 블록 주석이었다면,
# 실제 코드의 진행과정을 설명했을꺼에요.
#
# 이것은 블록 주석의 두 번째 문단입니다. 이 문단이
# 주석 문자 하나가 있는 줄로 위의 문단과 나누어 졌다는
# 점에 주목하세요.

  init()
  start()
  stop()
### 한 줄 주석

한 줄 주석은 주석이 설명할 구문의 바로 위에 위치합니다. 한줄 주석이 충분히 짧다면 구문과 같은 줄에 둘수도 있습니다.(구문 끝에서 공백 한칸은 띄어주세요.)

모든 한 줄 주석은 #와 한칸의 공백으로 시작해야 합니다.

한 줄 주석은 제한적으로 써야합니다, 왜냐면 한 줄 주석의 존재는 보통 코드 스멜의 징조 거든요.

뻔히 명시되있는 곳에 한줄 주석을 달지 마세요:

  # No
  x = x + 1 # Increment x

하지만, 한줄 주석은 특정 시나리오에서는 유용합니다:

  # Yes
  x = x + 1 # Compensate for border
## 이름짓기 규칙

모든 변수와 함수와 오브젝트의 속성은 camelCase(소문자로 시작하는)를 사용하세요.

모든 클래스에는 CamelCase(대문자로 시작하는)를 사용하세요.(이런 식을 또한 PascalCase, CamelCaps, CapWords라고 부르기도 합니다, 다른 대안들참조.)

( 공식적인커피스크립트의 컨밴션은 camelcase(카멜케이스) 입니다. 왜냐하면 자바스크립트하고 같이 쓰기 쉽거든요. 이 결정에 대해 좀더 자세히 알고 싶으면, 여기를 보세요.)

For constants, use all uppercase with underscores: 상수는 대문자와 언더바를 함께 씁니다:

CONSTANT_LIKE_THIS

"private" 함수와 변수는 언더바로 시작해야 합니다:

_privateMethod: ->
## 함수

(이런 가이드라인들도 클래스 함수에 적용됩니다.)

인자를 받는 변수를 선언 할때는, 항상 괄호를 닫고 한칸을 띄우셔야 합니다.

foo = (arg1, arg2) -> # Yes
foo = (arg1, arg2)-> # No

함수가 인자를 받지 않으면 괄호를 사용하지 마세요:

bar = -> # Yes
bar = () -> # No

함수를 콜할 때 연쇄적으로 호출해서 한 줄에 적기에 적합하지 않은 경우, 각 콜을 다른 줄에 적고 각줄은 한 단계(공백을 쓰신다면 공백 두 칸)들여쓰기를 하시고 .으로 시작해주세요.

[1..3]
  .map((x) -> x * x)
  .concat([10..12])
  .filter((x) -> x < 11)
  .reduce((x, y) -> x + y)

함수를 콜할때, 가독성을 생각해가며 괄호를 넣거나 빼세요. “가독성”이 주관적일 수도 있다는 걸 유념하세요, 밑의 예제들은 커뮤니티에서 최적이라고 생각하는 방식으로 괄호가 포함되거나 생략되어 있습니다:

baz 12

brush.ellipse x: 10, y: 20 # Braces can also be omitted or included for readability

foo(4).bar(8)

obj.value(10, 20) / obj.value(20, 10)

print inspect value

new Tag(new Value(a, b), new Arg(c))

가끔 (그룹 함수의 파라메터에 사용하는 대신에)그룹 함수에 사용하는 괄호를 볼지도 모르겠네요. 이런 방식의 예입니다.(앞으로 “함수 그룹화 스타일”이라 할께요.)

($ '#selektor').addClass 'klass'

(foo 4).bar 8

이렇게 적을수도 있습니다:

$('#selektor').addClass 'klass'

foo(4).bar 8

함수 호출이 그룹화 되어있는 경우, 어떤 이는 처음 콜에 대해서만 함수 그룹화 스타일을 사용하는 것이 좋습니다.

($ '#selektor').addClass('klass').hide() # Initial call only
(($ '#selektor').addClass 'klass').hide() # All calls

이 그룹화 스타일은 추천하지 않습니다만, 만약에 함수 그룹화 스타일이 특정 프로젝트에 채용 되었다면, 일관되게 사용해야 합니다.

## 문자열

문자열 연결(concatenation) 대신 보간(interpolation)을 사용하세요.

"this is an #{adjective} string" # Yes
"this is an " + adjective + " string" # No

문자열에서 보간을 사용하지않는다면, 쌍따옴표('')보다 홀따옴표('')가 좋습니다.

## 분기

부정적인 조건일때는 if보다는 unless를 쓰세요.

unless...else보다는 if...else를 쓰세요:

  # Yes
  if true
    ...
  else
    ...

  # No
  unless false
    ...
  else
    ...

여러줄의 if/else의 절은 들여쓰기를 해야합니다:

  # Yes
  if true
    ...
  else
    ...

  # No
  if true then ...
  else ...
## Looping and Comprehensions

가능한 comprehensions 를 활용합니다:

  # Yes
  result = (item.name for item in array)

  # No
  results = []
  for item in array
    results.push item.name

필터링 하려면:

result = (item for item in array when item.name is "test")

오브젝트의 키, 값으로 반복이동하려면:

object = one: 1, two: 2
alert("#{key} = #{value}") for key, value of object
## Native Objects 확장하기

native objects는 고치지 마세요.

예를 들면, Array.prototypeArray#forEach로 고치지 마세요.

## 예외 처리

예외 처리를 아끼지 마세요.

## 어노테이션

어노테이션으로 표시된 코드의 블럭이 특정 행동이 필요할 경우 어노테이션을 씁니다.

어노테이션이 설명할 코드의 바로 위에 어노테이션을 적습니다.

어노테이션 키워드 뒤에는 콜론에 한칸을 띄워주고, 설명을 적어야 합니다.

  # FIXME: The client's current state should *not* affect payload processing.
  resetClientState()
  processPayload()

만약 설명에 여러 줄이 필요하면, 이어지는 줄은 두 칸 들여쓰기를 합니다:

  # TODO: Ensure that the value returned by this call falls within a certain
  #   range, or throw an exception.
  analyze()

어노테이션 종류:

  • TODO: 나중에 추가되어야할 없는 기능
  • FIXME: 고쳐져야 할 망가진 코드
  • OPTIMIZE: 병목 현상이 일어나는 비효율적인 코드
  • HACK: 수상한(또는 너무 독창적인)코드
  • REVIEW: 구현을 확인하기위해 리뷰해야하는 코드

그밖의 어노테이션이 필요한 경우에는, 프로젝트의 README파일에 그 어노테이션의 설명이 있어야 합니다.

## 그 외

&& 표기보다 and 표기가 더 좋습니다.

|| 표기보다 or 표기가 더 좋습니다.

== 표기보다 is 표기가 더 좋습니다.

! 표기보다 not 표기가 더 좋습니다.

가급적이면 or= 표현을 권장합니다:

temp or= {} # Yes
temp = temp || {} # No

객체의 프로토타입에 접근하기 위한, 속기 표기법 (::) 을 사용하는 게 좋습니다:

Array::slice # Yes
Array.prototype.slice # No

this.property 표기보다 @property 표기가 더 좋습니다.

return @property # Yes
return this.property # No

하지만, @단독으로 쓰지 마세요:

return this # Yes
return @ # No

명시적 반환의 명확성이 증가하지 않는 한, 불필요한 곳에 return 표기를 피하세요.

펑션의 인수 갯수가 가변적인 경우에는 스플렛 (...) 표기를 사용하세요:

console.log args... # Yes

(a, b, c, rest...) -> # Yes