Dart Code Style

gozero·2024년 3월 14일
0

식별자

Upper Camel Case (Pascal Case)

  • 대문자로 시작
  • 각 단어의 시작 문자는 대문자
  1. Class, Enum, Typedef, Type 매개변수에서 사용
	class SliderMenu { ... }
	class HttpRequest { ... }
	typedef Predicate<T> = bool Function(T value);
  1. Metadata Annotation으로 사용되는 Class
	class Foo {
      const Foo([arg]);
    }

    (anArg)
    class A { ... }

    ()
    class B { ... }
  1. 만약 Annotation Class의 생성자가 매개변수를 받지 않는다면, 별도의 상수를 lowerCamelCase 형태로 정의하여 사용 가능
	const foo = Foo();
 
    
    class C { ... }
  1. extensions(해당 기능은 Dart 2.7 버전에 추가된 기능)
  extension MyFancyList<T> on List<T> { ... }
  extension SmartIterable<T> on Iterable<T> { ... }

lower Camel Case

  • 소문자로 시작
  • 각 단어의 시작 문자는 대문자
  • 그리고 언더스코어 등 다른 구분자를 사용하지 않음
  1. 기타 식별자(Identifier) : Class의 멤버, Top-level definition, 변수, 매개변수, 명명된 매개변수
  //Good
  var count = 3;
  HttpRequest httpRequest;

  void align(bool clearItems) {
    // ...
  }


  //Bad
  var COUNT = 3;
  HttpRequest http_Request;

  void Align(bool clearItems) {
    // ...
  }
  1. 상수(enum 값 포함)
  //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();
  }

lowercase with underscores (snake_case)

  • 소문자만 사용
  • 단어의 구분은 언더스코어(_)
  • 일부 운영체제 파일 시스템은 파일명의 대소문자를 구분할 수 없음
    • 문제 발생을 막기 위해 전부 소문자 사용
    • 파일명이 길어질 경우 가독성을 높이기 위해 언더스코어(_)를 구분자로 사용
  1. 소스 파일, 디렉터리, 라이브러리, 패키지
  //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';
  1. library prefix(=import prefix)
  //Good
  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();


  //Bad
  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(와 같이 좀 더 일반적인 표현으로 사용 가능)
  //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;

콜백함수의 매개변수가 사용되지 않는 경우

  • 해당 매개변수가 사용되지 않으면 관용적으로 _로 표현
  • 만약 사용되지 않는 매개변수가 1개 이상이라면 , _와 같이 여러 개의 언더스코어 사용
futureOfVoid.then((_, __, ___) {
  print('작업 완료');
});

접미사 문자를 사용하지 말 것

  • Dart는 타입, 접근범위, 불변성 여부 등 다양한 속성을 검증하고 알려줌
  • 때문에 가독성이 떨어지는 불필요한 접미사를 사용할 필요가 없음
//Good
defaultTimeout
count
isValid
 
//Bad
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'; // Dart Libraries
import 'dart:html';
 
import 'package:bar/bar.dart'; // Package Import
import 'package:foo/foo.dart';

"pakcage:" Import는 Relative Import 앞에 놓을 것

import 'package:bar/bar.dart'; // Package Import
import 'package:foo/foo.dart';
 
import 'util.dart'; // Relative Import

export 구문은 모든 Import 구문이 끝난 뒤 분리된 섹션으로 둘 것

//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';

Import 섹션들은 알파벳 순으로 정렬할 것

//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';

Formatting

dartfmt를 사용하여 코드 Format


한 라인에 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 구문의 내용이 다음 줄에 위치한다면 중괄호 추가
  //Good
  if (overflowChars != other.overflowChars) {
    return overflowChars < other.overflowChars;
  }


  //Bad
  if (overflowChars != other.overflowChars)
    return overflowChars < other.overflowChars;
profile
Flutter를 제일 좋아하는 앱 프론트엔드 개발자입니다!

0개의 댓글