이펙티브 Dart(2) - 스타일 가이드

Effective Dart: Style https://www.dartlang.org/guides/language/effective-dart/style

naming, ordering, formatting의 일관성은 다른 사람들이 코드를 배우고, 공유하기 쉽게 해준다.

  • Identifiers
    • DO 타입 이름은 UpperCamelCase로 지어라.
    • DO 라이브러리, 패키지, 디렉토리, 소스파일 이름은 lowercase_with_underscores로 지어라.
    • DO import prefix(alias)는 lowercase_with_underscores로 지어라.
    • DO 나머지 다른 identifier는 lowerCamelCase로 지어라.
    • PREFER 상수 이름은 lowerCamelCase로 지어라.
    • DO 2글자보다 더 긴 축약어는 첫글자만 대문자화 해라. // ex) IOStream (X)
    • DON’T prefix 문자를 사용하지 마라. ex) kDefaultTimeout (X)
  • Ordering
    • DO dart: import를 다른 라이브러리 import 이전에 써라.
    • DO package: import를 상대경로에 있는 라이브러리 import보다 이전에 써라.
    • PREFER 외부의 package: import를 내 라이브러리의 import 이전에 써라.
    • DO export는 모든 import 뒤에 구분된 섹션에 써라.
    • DO 모든 import문 섹션들을 알파벳 순서로 정렬해라.
  • Formatting
    • DO dartfmt를 사용해서 포맷팅 해라.
    • CONSIDER 당신의 코드를 더 formatter-friendly하게 만들 수 있는지 고려해라.
    • AVOID 80글자보다 더 긴 줄은 피해라.
    • DO 모든 조건문에 curly braces {}를 사용해라.

Identifiers

DO name types using UpperCamelCase.

타입 이름은 UpperCamelCase로 지어라.

class SliderMenu { ... }
typedef Predicate<T> = bool Function(T value);
DO name libraries, packages, directories, and source files using lowercase_with_underscores.

라이브러리, 패키지, 디렉토리, 소스파일 이름은 lowercase_with_underscores로 지어라.

library peg_parser.source_scanner;
import 'file_system.dart';
DO name import prefixes using lowercase_with_underscores.

import prefix(alias)는 lowercase_with_underscores로 지어라.

import 'dart:math' as math;
import 'package:angular_components/angular_components'
   as angular_components;
import 'package:js/js.dart' as js;
DO name other identifiers using lowerCamelCase.

나머지 다른 identifier는 lowerCamelCase로 지어라.

var item;

HttpRequest httpRequest;

void align(bool clearItems) { ... }
PREFER using lowerCamelCase for constant names.

상수 이름은 lowerCamelCase로 지어라.

const pi = 3.14;
const defaultTimeout = 1000;

자바의 SCREAMING_CAPS 스타일을 사용하지 않는 이유

  • 예를 들면, CSS 컬러값들 에서처럼 많은 경우에 SCREAMING_CAPS는 읽기에 나쁘다.
  • 상수는 자주 변수로 바뀌는데, 그럴 때마다 이름을 lowerCamelCase 스타일로 바꾸어야 한다.
DO capitalize acronyms and abbreviations longer than two letters like words.

2글자보다 더 긴 축약어는 첫글자만 대문자화 해라.

HttpConnectionInfo // HTTPConnectionInfo (X)
IoStream // IOStream (X)
DB // Bb (X)
Id // ID (X) Id, Mr. 같은 2글자 축약어는 여전히 단어처럼 대문자로 표기된다.
DON’T use prefix letters.

prefix 문자를 사용하지 마라.

defaultTimeout // kDefaultTimeout (X)

Ordering

DO place “dart:” imports before other imports.

“dart:” import를 다른 라이브러리 import 이전에 써라.

import 'dart:html'; 
                                       // 섹션 구분은 빈 한줄로 한다.
import 'package:bar/bar.dart';
DO place “package:” imports before relative imports.

“package:” import를 상대경로에 있는 라이브러리 import보다 이전에 써라.

import 'package:foo/foo.dart';

import 'util.dart'; // 상대경로에 있는 라이브러리
PREFER placing external “package:” imports before other imports.

외부의 “package:” import를 내 라이브러리의 import 이전에 써라.

import 'package:foo/foo.dart';

import 'package:my_package/util.dart';
DO specify exports in a separate section after all imports.

export는 모든 import 뒤에 구분된 섹션에 써라.

import 'src/foo_bar.dart';

export 'src/error.dart';
DO sort sections alphabetically.

모든 import문 섹션들을 알파벳 순서로 정렬해라.

import 'package:bar/bar.dart';
import 'package:foo/foo.dart';

import 'foo.dart';
import 'foo/foo.dart';

Formatting

DO format your code using dartfmt.

dartfmt를 사용해서 포맷팅 해라. some documentation

CONSIDER changing your code to make it more formatter-friendly.

당신의 코드를 더 formatter-friendly하게 만들 수 있는지 고려해라.

AVOID lines longer than 80 characters.

80글자보다 더 긴 줄은 피해라.

보통 VeryLongCamelCaseClassNames과 같이 긴 이름을 지을 때 이런 상황이 발생하며, 이런 경우엔 dartfmt가 긴 문자열을 자르지 않는다. 당신이 판단해서 처리하길 바란다.

DO use curly braces for all flow control structures.

모든 조건문에 curly braces {}를 사용해라.

if (isWeekDay) {
  print('Bike to work!');
} else {
  print('Go dancing or read a book!');
}

if (arg == null) return defaultValue; // else절이 따라오지 않고 문장이 짧을 땐 한 줄로 써도 된다.