개발자를 위한

Java Programming Style Guide (ref. Google style guide)

4. 서식(Formatting)

Terminology Note(용어 참고) : 블록과 유사한 구성(block-like construct) 클래스(class), 메서드(method) 생성자(constructor) 본문(body) 나타냅니다. , 모든 배열 초기자(array initializer) 선택적으로 블록과 유사한 구성으로 작성될 있습니다.

4.1 중괄호(braces)

  1. 중괄호를 선택적으로 사용하는 경우

중괄호는 본문이 비어 있거나, 단일 구문만 포함하고 있는 경우에도, if, else, for, do, while 문과 함께 사용됩니다.

  1. 비어 있지 않은 블록 (K&R Style)

중괄호는 비어 있지 않은 블록이나 블록과 유사한 구성에K&R Style(Kernighan and Ritchie Style) (“이집트 대괄호”) 따릅니다.

  • 여는 중괄호(opening brace) 전에는 줄바꾸지 않습니다(No line break).
  • 여는 중괄호 다음에는 줄바꿈합니다(Line break).
  • 닫는 중괄호(closing brace) 전에 줄바꿈합니다.
  • 만약 구문이 종료되거나, 메서드나 생성자, 명명된 클래스의 본문이 종료되는 경우, 닫는 중괄호 다음에 줄바꿈합니다. 예를 들어, else 쉼표(comma) 뒤에 오는 경우에는 닫는 중괄호 다음에 바꿈을 하지 않습니다.

<실제 사용 >

return () -> {

  while (condition()) {

    method();

  }

};


return new MyClass() {

  @Override public void method() {

    if (condition()) {

      try {

        something();

      } catch (ProblemException e) {

        recover();

      }

    } else if (otherCondition()) {

      somethingElse();

    } else {

      lastThing();

    }

  }

};


다만, 열거형 클래스(Enum Class)에는 가지 예외가 있습니다.

  1. 블록(Empty blocks) : 활용하면 간결해질 있음

블록이나 블록과 유사한 구성을 K&R Style(Kernighan and Ritchie Style) 작성할 있습니다. 다중 블록 구문(여러 블록을 직접적으로 포함하는 if/else, try/catch/finally 구문처럼) 일부가 아닌 , 중괄호({}) 사이에 문자나 줄바꿈 없이 중괄호 오픈 , 바로 닫을 있습니다.

<실제 사용 >

  // This is acceptable

  void doNothing() {}


  // This is equally acceptable

  void doNothingElse() {

  }


// This is not acceptable: No concise empty blocks in a multi-block statement

  try {

    doSomething();

  } catch (Exception e) {}


4.2 블록 들여쓰기(block indentation) : +2 스페이스(spaces)

새로운 블록이나 블록과 유사한 구성을 작성할 때마다 들여쓰기는 2개의 스페이스만큼 늘어납니다. 블록이 끝날 , 들여쓰기는 바로 이전 들여쓰기 수준으로 돌아갑니다. 들여쓰기는 코드와 주석 모두에 적용됩니다.

4.3 줄에 하나의 구문(one statement per line)

구문의 끝에서는 줄바꿈을 해야 합니다.

4.4 제한(column limit) : 100

Java 코드의 제한은 100글자입니다. “글자 유니코드를 의미합니다. 아래 명시된 경우를 제외하면, 제한 조건을 초과하는 모든 라인은 줄바꿈을 해야 합니다.

Note : 유니코드는 표시되는 너비가 크거나 작더라도 글자로 계산됩니다. 예를 들어, 전각 문자를 사용하는 경우, 규칙에서 엄격하게 요구하는 것보다 먼저 줄바꿈하도록 선택할 있습니다. (전각문자 : 일반적인 영문자의 고정 폭의 정도의 폭을 가지는 문자)

<예외>

  1. 제한 규칙을 준수할 없는 경우(: Javadoc URL이나 JSNI 메서드 참조)
  2. 패키지 구문(package statement) 임포트 구문(import statements)
  3. (shell) 복사 붙여넣기(copy & paste) 있는 주석 명령어 라인(command line)

4.5 라인 변경(line-wrapping)

Terminology Note(용어집): 줄로 작성할 있는 코드가 여러 줄로 나뉘는 경우, 이러한 활동을 라인 변경이라고 합니다.

모든 상황에서 어떻게 라인을 변경 해야 하는지 정확하게 보여주는 포괄적이고 결정적인 공식은 없습니다. 다만, 자주 동일한 코드 조각을 라인 변경하는 가지 적절한 방법이 있을 뿐입니다.

Note : 라인 변경하는 일반적인 이유는 제한(column limit) 넘어가는 경우를 방지하기 위한 것입니다. 하지만, 제한을 만족시키는 코드라도 작성자의 재량에 따라 라인을 변경할 있습니다.

Tip : 메서드(method) 지역 변수(local variable) 추출하면 라인 변경없이 문제를 해결할 있습니다.

  1. 어디에서 라인 변경할 것인가

  라인 변경의 주요 지시문(prime directive) : 높은 구문 수준에서 줄바꿈하는 것을 선호

  1) 할당된 연산자(non-assignment operator)에서 줄이 끊어질 경우, 기호(symbol)앞에서 라인을 변경합니다. (C++이나 JavaScript 같은 다른 언어의 Style 동일하지 않습니다.)

    • 다음연산자와 유사한(operator-like)” 기호에도 적용됩니다.
    • 구분자(dot separator: ‘.’)
    • 메서드(method) 참조를 위한 2개의 콜론(::)
    • 타입 바운드(Type Bound) &(<T extends Foo & Bar>)
    • Catch 블록 Pipe(catch (FooException | BarException e))

  2) 할당된 연산자(assignment operator)에서 줄이 끊어질 경우, 일반적으로 기호(symbol)뒤에서 라인 변경하지만 어느 쪽이든 허용합니다.

    • 향상된 for 구문(“foreach”)할당 연산자와 유사한(assignment-operator-like)” 콜론에도 적용됩니다.

  3) 메서드(method) 생성자(constructor) 이름 바로 다음에 여는 괄호(() 작성합니다.

  4) 쉼표(,) 앞에 오는 토큰 바로 다음에 작성합니다.

  5) 람다의 본문이 중괄호가 없는 단일 표현으로 이루어진 경우 화살표 바로 다음에 줄이 끊어질 있다는 것을 제외하면, 람다의 화살표 옆에서 줄이 끊어지지 않아야 합니다.

<실제 사용 >

    • 일반적인 람다

MyLambda<String, Long, Object> lambda =

    (String label, Long value, Object obj) -> {

        ...

    };


    • 중괄호가 없는 단일 표현으로 이루어진 람다

Predicate<String> predicate = str ->

    longExpressionInvolving(str);


Note : 라인 변경의 주요 목표는 코드를 명확하게 하는데 있습니다. 가장 짧은 코드를 작성하기 위한 것은 아닙니다.

  1. 연속 들여쓰기(Indent continuation lines) : 최소 +4 스페이스 (at least +4 spaces)

라인 변경할 첫번째 이후 (연속하는 포함) 원래에서 최소한 +4 스페이스로 들여쓰기 합니다.

연속 행이 여러 개인 경우 원하는 대로 들여쓰기를 +4 이상으로 변경할 있습니다. 일반적으로 2개의 연속 행일 경우에는 구문적으로 병렬 요소(parallel element) 경우에만 동일한 들여쓰기 수준을 사용합니다.

이후에 정리된 수평 정렬(Horizontal Alignment)에서는 특정 토큰을 이전 라인과 정렬하기 위해서 다양한 숫자의 스페이스를 사용하는, 권장하지 않는 실제 사례들을 다룹니다.

받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/887

개발자를 위한

Java Programming Style Guide (ref. Google style guide)

소스 파일 구조(Source file Structure)

소스 파일은 다음과 같은 순서로 구성되어 있습니다.

  1. 필요한 경우, 라이선스나 카피라이트 정보(License or Copyright Information)
  2. 패키지 선언문 (Package Statement)
  3. 임포트 선언문 (Import Statement)
  4. 유일한(Exactly One) 최상위 클래스(Top-Level Class)

위의 번호에 해당하는 섹션은 하나의 빈줄(Exactly one blank line) 구분합니다.

라이선스나 카피라이트 정보(license or copyright information)

만약 소스 파일에 라이선스나 카피라이트 정보를 포함해야 한다면, 소스 파일의 위에 첫번째로 작성합니다.

패키지 구문(package statement)

만약 소스 파일에 라이선스나 카피라이트 정보를 포함해야 한다면, 소스 파일의 위에 첫번째로 작성합니다.

임포트 구문(import statements)

  1. 와일드카드 임포트 미사용(No wildcard imports)

정적이든 아니든(static or otherwise), 와일드카드 임포트(wildcard imports) 사용하지 않습니다.

  1. 줄바꿈 미사용(No line-wrapping)

임포트 구문(import statement) 줄바꿈하지 않습니다. 제한(column limit) 임포트 구문에는 적용되지 않습니다. (소스코드에서는 100글자로 제한됩니다.)

  1. 순서와 간격(Ordering and Spacing)

임포트 구문에서는 다음과 같은 순서로 작성합니다.

  1) 모든 정적 임포트(static import) 단일 블록(single block) 작성합니다.

  2) 모든 비정적 임포트(non-static import) 단일 블록(single block) 작성합니다.

정적, 비정적 임포트 구문이 모두 있는 경우, 블록 사이는 단일 줄로 구분합니다. 이외 임포트 구문 사이에는 빈줄이 없어야 합니다.

블록 내에서 임포트 선언된 이름은 ASCII 정렬 순서로 나타납니다.

Note : ‘.’ ‘;’보다 먼저 정렬되기 때문에 ASCII 정렬 순서 내에 있는 임포트 구문과 동일하지 않습니다. , ‘.’ 단위로 구분되는 경우, ‘.’ 단위로 ASCII 정렬 순서대로 정렬되어야 합니다.

  1. 클래스에 대해 정적 임포트 미사용(No static import for classes)

정적 임포트(static import) 정적 중첩 클래스(static nested classes) 사용하지 않습니다. 정적 중첩 클래스에 대해서는 일반적인 임포트(normal import) 사용합니다.

클래스 선언(class declaration)

  1. 정확히 하나의 최상위 클래스 선언(Exactly one top-level class declaration)

소스 파일 최상위 클래스는 하나만 있어야 합니다.

  1. 클래스 내용의 순서(Ordering of class contents)

클래스의 멤버(member) 초기자(initializer) 대해 선택한 순서는 학습가능성(learnability) 영향을 미칠 있습니다. 하지만, 어떻게 올바르게 순서를 선택할지에 대한 하나의 완벽한 레시피(recipe) 없습니다. 다른 클래스는 다른 방법으로 클래스 컨텐츠의 순서를 정렬할 있습니다.

중요한 것은, 관리자(maintainer) 요구하면 설명할 있도록 클래스는 어떤 논리적인 순서(logical order) 사용한다는 것입니다. 예를 들어, 논리적인 순서가 아닌, “추가된 날짜별(chronological by date added)” 순서로 나타나는 경우에는 새로운 메서드(method) 습관적으로 클래스의 끝에 추가되지 않습니다.

  1) 오버로드(Overloads) : 절대로 분할하지 않아야

클래스에 여러 생성자(multiple constructors) 있는 경우나 동일한 이름의 여러 메서드(method) 있는 경우, 생성자나 메서드 사이에 다른 코드 없이(private member 생성자나 메서드 사이에 있으면 ) 순차적으로 나타납니다.

받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/886

개발자를 위한

Java Programming Style Guide (ref. Google style guide)

1. Source file basics

  • 파일
    • 소스 파일 명은 대소문자를 구분하여 정확하게 하나만 있는 최상위 클래스와 .java 확장자로 이루어져 있습니다.
  • 파일 인코딩 : UTF-8
    • 소스 파일은 UTF-8 인코딩 되어야 합니다.
  • 특수 문자
    • 공백 문자 (White space characters)
      • 라인 종결자 문자열(sequence) 제외하면, ASCII 가로 공백 문자(0x20) 소스 파일의 어디서나 사용할 있는 유일한 공백 문자입니다.
        1. 문자열(string) 문자 리터럴(character literals) 있는 모든 다른 공백 문자들은 예외(escape)입니다.
        2. (Tab) 문자는 들여쓰기(indentation) 사용하면 됩니다. 
    • 특수 확장열 (Special escape sequences)
      • 특수 확장열(special escape sequences) 가진 모든 문자의 경우, 8진수(ex. \012) 유니코드(\u000a) 특수문자 대신 해당 확장문자 (\b, \t, \n, \f, \r, \”, \’, \\) 사용합니다.
    • Non-ASCII 문자 (non-ASCII characters)
    • 나머지 non-ASCII 문자의 경우, 실제 유니코드 문자(ex.∞) 동등한 유니코드 특수문자(ex. \u221e) 사용됩니다. 유니코드 특수문자가 문자열이나 주석 외부에서 사용되는 것은 정말 권장하지 않지만, 코드를 쉽게 읽고 이해할 있도록 만들기 위한 방법이라면 선택할 있습니다.

Tip : 유니코드 특수문자의 경우, 때때로 실제 유니코드를 사용하는 것이 주석을 설명하는데 매우 유용할 있습니다.

    • Example

Example

Discussion

String unitAbbrev = "μs";

Best : 주석없이 완벽하게 명확함.

String unitAbbrev = "\u03bcs"; // "μs"

Allowed : 하지만 이렇게 작성할 이유가 없음.

String unitAbbrev = "\u03bcs"; // Greek letter mu, "s"

Allowed : 하지만 어색하고 실수하기 쉬움.

String unitAbbrev = "\u03bcs";

Poor : 독자는 이것이 무엇인지 전혀 모름.

return '\ufeff' + content; // byte order mark

Good: 인쇄할 없는 문자에는 특수문자를 사용하고, 필요한 경우 주석 추가.

Tip : 일부 프로그램에서 non-ASCII 문자를 제대로 처리하지 못할 수도 있다는 두려움 때문에 코드의 가독성을 떨어 뜨리면 안 됩니다. 만약 그런 일이 발생한다면, 해당 프로그램은 중단되고, 수정해야만 합니다.
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/885