좋은 코드의 아주 중요한 부분은 좋은 스타일 입니다.
Dart 에는 3가지 유형의 Identifier가 있습니다.
- UpperCamelCase
- lowerCamelCase
- lowercase_with_underscores
Linter rule: camel_case_types
Class, enum, typedef, type parameter 의 첫 글자는 대문자로 표시해야 합니다.
class SliderMenu { ... }
class HttpRequest { ... }
typedef Predicate<T> = bool Function(T value);
annotation에 사용되는 것도 포함입니다.
class Foo {
const Foo([arg]);
}
(anArg)
class A { ... }
()
class B { ... }
annotation class의 constructor가 parameter를 가지지 않으면 lowerCamelCase constant를 생성할 수 있습니다.
const foo = Foo();
class C { ... }
Linter rule: camel_case_extensions
extension 도 첫 글자는 대문자로 표시해야 합니다.
extension MyFancyList<T> on List<T> { ... }
extension SmartIterable<T> on Iterable<T> { ... }
Linter rules: library_names, file_names
<good>
library peg_parser.source_scanner;
import 'file_system.dart';
import 'slider_menu.dart';
<bad>
library pegparser.SourceScanner;
import 'file-system.dart';
import 'SliderMenu.dart';
Linter rule: library_prefixes
<good>
import 'dart:math' as math;
import 'package:angular_components/angular_components'
as angular_components;
import 'package:js/js.dart' as js;
<bad>
import 'dart:math' as Math;
import 'package:angular_components/angular_components'
as angularComponents;
import 'package:js/js.dart' as JS;
Linter rule: non_constant_identifier_names
Class members, top-level definitions, variables, parameters, named parameters 는 lowerCamelCase 를 사용해야 합니다.
var count = 3;
HttpRequest httpRequest;
void align(bool clearItems) {
// ...
}
Linter rule: constant_identifier_names
constant variables, enum values 는 lowerCamelCase, 를 사용해야 합니다.
<good>
const pi = 3.14;
const defaultTimeout = 1000;
final urlScheme = RegExp('^([a-z]+):');
class Dice {
static final numberGenerator = Random();
}
<bad>
const PI = 3.14;
const DefaultTimeout = 1000;
final URL_SCHEME = RegExp('^([a-z]+):');
class Dice {
static final NUMBER_GENERATOR = Random();
}
예외 : IO와 같은 약어는 완전히 대문자로 표시합니다.
<good>
class HttpConnection {}
class DBIOPort {}
class TVVcr {}
class MrRogers {}
var httpRequest = ...
var uiHandler = ...
Id id;
<bad>
class HTTPConnection {}
class DbIoPort {}
class TvVcr {}
class MRRogers {}
var hTTPRequest = ...
var uIHandler = ...
ID iD;
<good>
futureOfVoid.then((_) {
print('Operation complete.');
});
<good>
defaultTimeout
<bad>
kDefaultTimeout
Linter rule: directives_ordering
<good>
import 'dart:async';
import 'dart:html';
import 'package:bar/bar.dart';
import 'package:foo/foo.dart';
<good>
import 'package:bar/bar.dart';
import 'package:foo/foo.dart';
import 'util.dart';
<good>
import 'src/error.dart';
import 'src/foo_bar.dart';
export 'src/error.dart';
<bad>
import 'src/error.dart';
export 'src/error.dart';
import 'src/foo_bar.dart';
<good>
import 'package:bar/bar.dart';
import 'package:foo/foo.dart';
import 'foo.dart';
import 'foo/foo.dart';
<bad>
import 'package:foo/foo.dart';
import 'package:bar/bar.dart';
import 'foo/foo.dart';
import 'foo.dart';
일관된 whitespace style 은 사람들이 코드를 compiler와 같은 방식으로 볼수 있도록 도와줍니다.
Formatting을 위해서 dart format 을 사용할 수 있습니다.
Linter rule: lines_longer_than_80_chars
Linter rule: curly_braces_in_flow_control_structures
<good>
if (isWeekDay) {
print('Bike to work!');
} else {
print('Go dancing or read a book!');
}
예외 : else문이 없이 if 문을 사용하는 경우나 if문을 한줄로 작성가능한 경우 중괄호를 생략할 수 있습니다.
<good>
if (arg == null) return defaultValue;
만약 body가 다음 줄로 넘어가는 경우 중괄호를 사용합니다.
<good>
if (overflowChars != other.overflowChars) {
return overflowChars < other.overflowChars;
}
<bad>
if (overflowChars != other.overflowChars)
return overflowChars < other.overflowChars;