식별자
Upper Camel Case (Pascal Case)
- Class, Enum, Typedef, Type 매개변수에서 사용
class SliderMenu { ... }
class HttpRequest { ... }
typedef Predicate<T> = bool Function(T value);
- Metadata Annotation으로 사용되는 Class
class Foo {
const Foo([arg]);
}
@Foo(anArg)
class A { ... }
@Foo()
class B { ... }
- 만약 Annotation Class의 생성자가 매개변수를 받지 않는다면, 별도의 상수를 lowerCamelCase 형태로 정의하여 사용 가능
const foo = Foo();
@foo
class C { ... }
- extensions(해당 기능은 Dart 2.7 버전에 추가된 기능)
extension MyFancyList<T> on List<T> { ... }
extension SmartIterable<T> on Iterable<T> { ... }
lower Camel Case
- 소문자로 시작
- 각 단어의 시작 문자는 대문자
- 그리고 언더스코어 등 다른 구분자를 사용하지 않음
- 기타 식별자(Identifier) : Class의 멤버, Top-level definition, 변수, 매개변수, 명명된 매개변수
var count = 3;
HttpRequest httpRequest;
void align(bool clearItems) {
}
var COUNT = 3;
HttpRequest http_Request;
void Align(bool clearItems) {
}
- 상수(enum 값 포함)
const pi = 3.14;
const defaultTimeout = 1000;
final urlScheme = RegExp('^([a-z]+):');
class Dice {
static final numberGenerator = Random();
}
const PI = 3.14;
const DefaultTimeout = 1000;
final URL_SCHEME = RegExp('^([a-z]+):');
class Dice {
static final NUMBER_GENERATOR = Random();
}
lowercase with underscores (snake_case)
- 소문자만 사용
- 단어의 구분은 언더스코어(_)
- 일부 운영체제 파일 시스템은 파일명의 대소문자를 구분할 수 없음
- 문제 발생을 막기 위해 전부 소문자 사용
- 파일명이 길어질 경우 가독성을 높이기 위해 언더스코어(_)를 구분자로 사용
- 소스 파일, 디렉터리, 라이브러리, 패키지
library peg_parser.source_scanner;
import 'file_system.dart';
import 'slider_menu.dart';
library pegparser.SourceScanner;
import 'file-system.dart';
import 'SliderMenu.dart';
- library prefix(=import prefix)
import 'dart:test/lib.dart' as test_lib;
import 'package:example/lib.dart' as example_lib;
var element1 = test_lib.Element();
var element2 = example_lib.Element();
import 'dart:test/lib.dart' as TestLib;
import 'package:example/lib.dart' as exampleLib;
var element1 = TestLib.Element();
var element2 = exampleLib.Element();
축약어나 두 문자어(Acronym)가 2글자를 초과하는 경우
- Uppder Camel Case나 lower Camel Case 사용
- 예외로 축약어가 2글자 이하인 경우에는 전체를 대문자로 사
- IO(Input/Output) → IO
- ID(Identification) → Id(와 같이 좀 더 일반적인 표현으로 사용 가능)
class HttpConnection {}
class DBIOPort {}
class TVVcr {}
class MrRogers {}
var httpRequest = ...
var uiHandler = ...
Id id;
class HTTPConnection {}
class DbIoPort {}
class TvVcr {}
class MRRogers {}
var hTTPRequest = ...
var uIHandler = ...
ID iD;
콜백함수의 매개변수가 사용되지 않는 경우
- 해당 매개변수가 사용되지 않으면 관용적으로 _로 표현
- 만약 사용되지 않는 매개변수가 1개 이상이라면 , _와 같이 여러 개의 언더스코어 사용
futureOfVoid.then((_, __, ___) {
print('작업 완료');
});
접미사 문자를 사용하지 말 것
- Dart는 타입, 접근범위, 불변성 여부 등 다양한 속성을 검증하고 알려줌
- 때문에 가독성이 떨어지는 불필요한 접미사를 사용할 필요가 없음
defaultTimeout
count
isValid
kDefaultTimeout
intCount
blnIsValid
식별자
Dart의 Import 구문
- "dart:" → Import는 Dart Core Package에서 제공하는 라이브러리 Import
- Package Import → lib 폴더에 포함된 파일을 Import 할 때 사용하며 경로는 lib 폴더에서 절대 경로로 기술
- Relative Import → lib 폴더에 포함된 파일을 Import 할 때 사용하며 경로는 lib 폴더에서 상대 경로로 기술
"dart:" Import는 맨 윗 줄에 놓을 것
import 'dart:async';
import 'dart:html';
import 'package:bar/bar.dart';
import 'package:foo/foo.dart';
"pakcage:" Import는 Relative Import 앞에 놓을 것
import 'package:bar/bar.dart';
import 'package:foo/foo.dart';
import 'util.dart';
export 구문은 모든 Import 구문이 끝난 뒤 분리된 섹션으로 둘 것
import 'src/error.dart';
import 'src/foo_bar.dart';
export 'src/error.dart';
import 'src/error.dart';
export 'src/error.dart';
import 'src/foo_bar.dart';
Import 섹션들은 알파벳 순으로 정렬할 것
import 'package:bar/bar.dart';
import 'package:foo/foo.dart';
import 'foo.dart';
import 'foo/foo.dart';
import 'package:foo/foo.dart';
import 'package:bar/bar.dart';
import 'foo/foo.dart';
import 'foo.dart';
한 라인에 80자 이상은 피할 것
모든 제어처리 구문에는 중괄호를 사용할 것
- 중괄호를 사용하여 dangle else 문제를 방지해줌
if (isWeekDay) {
print('Bike to work!');
} else {
print('Go dancing or read a book!');
}
- 예외사항으로 else 구문이 존재하지 않고 if 구문이 1줄이라면 중괄호 생략 가능
if (arg == null) return defaultValue;
- if 구문의 내용이 다음 줄에 위치한다면 중괄호 추가
if (overflowChars != other.overflowChars) {
return overflowChars < other.overflowChars;
}
if (overflowChars != other.overflowChars)
return overflowChars < other.overflowChars;