Flutter Go 코드 개발 사양 0.1.0 버전

Flutter Go 코드 개발 사양 버전 0.1.0


코드 스타일


식별자 3가지 유형


낙타봉


클래스, 열거, typedef 및 유형 매개 변수
  class SliderMenu { ... }
  
  class HttpRequest { ... }
  
  typedef Predicate = bool Function(T value);

메타데이터 주석에 사용되는 클래스 포함
  class Foo {
    const Foo([arg]);
  }
  
  @Foo(anArg)
  class A { ... }
  
  @Foo()
  class B { ... }

소문자 밑줄을 사용하여 라이브러리 및 소스 파일 이름 지정

  library peg_parser.source_scanner;
  
  import 'file_system.dart';
  import 'slider_menu.dart';

다음과 같은 쓰기를 권장하지 않습니다.
  library pegparser.SourceScanner;
  
  import 'file-system.dart';
  import 'SliderMenu.dart';

소문자에 밑줄을 사용하여 가져오기 접두어 이름 지정

  import 'dart:math' as math;
  import 'package:angular_components/angular_components'
      as angular_components;
  import 'package:js/js.dart' as js;

다음과 같은 쓰기를 권장하지 않습니다.
  import 'dart:math' as Math;
  import 'package:angular_components/angular_components'
      as angularComponents;
  import 'package:js/js.dart' as JS;

작은 낙타 봉법으로 다른 표지부를 명명하다

  var item;
  
  HttpRequest httpRequest;
  
  void align(bool clearItems) {
    // ...
  }

낙타 봉법을 우선적으로 상량으로 명명하다

  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();
  }

접두어를 사용하지 않음


Dart에서 선언된 유형, 범위, 가변성 및 기타 속성을 알려주므로 식별자 이름으로 인코딩할 이유가 없습니다.
  defaultTimeout

다음과 같은 쓰기를 권장하지 않습니다.
  kDefaultTimeout

정렬


당신의 서류의 앞머리를 깨끗하게 유지하기 위해서, 우리는 규정된 명령을 가지고 있으며, 지시는 반드시 그 안에 나타나야 한다.각 섹션은 빈 행으로 구분해야 합니다.

다른 가져오기 전에 필요한dart 라이브러리 가져오기

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

상대적으로 도입하기 전에 가방에 있는 라이브러리를 먼저 도입합니다

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

타사 패키지를 다른 패키지보다 먼저 가져오기

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

모든 가져오기 후 별도의 섹션에서 내보내기를 지정합니다.

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

모든 흐름 제어 구조는 큰 괄호를 사용하십시오


이렇게 하면 뜨는else문제를 피할 수 있다
  if (isWeekDay) {
    print('Bike to work!');
  } else {
    print('Go dancing or read a book!');
  }

예외


한if문장에else자구가 없고 그 중에서 전체if문장과then주체는 한 줄에 적합하다.이런 상황에서 만약 네가 좋아한다면, 너는 괄호를 없앨 수 있다
  if (arg == null) return defaultValue;

흐름체가 한 줄을 초과할 때 나누기가 필요하면 괄호를 사용하십시오:
  if (overflowChars != other.overflowChars) {
    return overflowChars < other.overflowChars;
  }

다음과 같은 쓰기를 권장하지 않습니다.
  if (overflowChars != other.overflowChars)
    return overflowChars < other.overflowChars;

메모


문장처럼 포맷해야 돼요.


대소문자를 구분하는 표지부호가 아니면 첫 번째 단어는 대문자로 써야 한다.마침표로 끝내기(또는 "!"또는 "?").모든 주석은 다음과 같습니다: doc 주석, 내연 내용, 심지어 TODOS.한 문장이라도
  greet(name) {
    // Assume we have a valid name.
    print('Hi, $name!');
  }

다음과 같은 쓰기를 권장하지 않습니다.
  greet(name) {
    /* Assume we have a valid name. */
    print('Hi, $name!');
  }

블록 주석 (/.../) 을 사용하여 코드를 임시로 주석할 수 있지만, 모든 다른 주석은//를 사용해야 합니다.

Doc 주석


///문서 주석을 사용하여 구성원과 유형을 기록합니다.
일반적인 주석 대신doc 주석을 사용하면dartdoc에서 문서를 찾을 수 있고 생성할 수 있습니다.
  /// The number of characters in this chunk when unsplit.
  int get length => ...

역사적 원인으로 인해 다트머스 아카데미는 도그 리뷰의 두 가지 문법을 지원한다.///("C#스타일")과/**...*/("JavaDoc스타일").우리는////왜냐하면 그것은 더욱 치밀하기 때문이다./*및/컨텐트 없는 두 행을 여러 줄 문서 주석에 추가합니다.문서 주석에 * 태그 목록 항목을 사용하는 글머리 기호 목록이 포함된 경우와 같이///구문도 쉽게 읽을 수 있습니다.

개인api를 위한 문서 주석 작성 고려


Doc 주석은 라이브러리의 공용 API 외부 사용자만을 대상으로 하는 것이 아닙니다.그것들은 또한 라이브러리의 다른 부분에서 호출된 개인 구성원을 이해하는데 도움이 된다

한마디로 요약 시작doc 주석


간단하게 사용자 중심의 설명으로 문서 주석을 시작하고 마침표로 끝냅니다.
/// Deletes the file at [path] from the file system.
void delete(String path) {
  ...
}

다음과 같은 쓰기를 권장하지 않습니다.
  /// Depending on the state of the file system and the user's permissions,
  /// certain operations may or may not be possible. If there is no file at
  /// [path] or it can't be accessed, this function throws either [IOError]
  /// or [PermissionError], respectively. Otherwise, this deletes the file.
  void delete(String path) {
    ...
  }

'doc 주석'의 첫 문장은 자신의 단락으로 나누어진다


첫 번째 문장 뒤에 빈 줄을 추가하여 그것을 자신의 단락으로 나누다
  /// Deletes the file at [path].
  ///
  /// Throws an [IOError] if the file could not be found. Throws a
  /// [PermissionError] if the file is present but could not be deleted.
  void delete(String path) {
    ...
  }

Flutter_Go 사용 참조


라이브러리 참조


flutter go에서lib에서 파일 라이브러리를 가져오고 패키지 이름을 통일적으로 지정하여 너무 많은 것을 피합니다 ../../
package:flutter_go/

문자열 사용


인접 문자열을 사용하여 문자열 문자 연결하기


만약 두 문자열의 액면가 (값이 아니라 실제 인용된 액면가) 가 있다면, + 를 사용하여 그것들을 연결할 필요가 없다.C와 c++에서 간단하게 그것들을 함께 놓으면 할 수 있다.이것은 긴 문자열을 만드는 좋은 방법이지만 단독 줄에는 적용되지 않습니다.
raiseAlarm(
    'ERROR: Parts of the spaceship are on fire. Other '
    'parts are overrun by martians. Unclear which are which.');

다음과 같은 쓰기를 권장하지 않습니다.
raiseAlarm('ERROR: Parts of the spaceship are on fire. Other ' +
    'parts are overrun by martians. Unclear which are which.');

템플릿 문자열 우선 사용

'Hello, $name! You are ${year - birth} years old.';

필요 없을 때는 괄호를 사용하지 마라

  'Hi, $name!'
  "Wear your wildest $decade's outfit."

다음과 같은 쓰기를 권장하지 않습니다.
  'Hello, ' + name + '! You are ' + (year - birth).toString() + ' y...';

다음과 같은 쓰기를 권장하지 않습니다.
  'Hi, ${name}!'
  "Wear your wildest ${decade}'s outfit."

컬렉션


가능한 한 집합 글자의 양을 사용하다


증가할 수 없는 목록이나 다른 사용자 정의 집합 형식을 만들려면, 어쨌든 구조 함수를 사용해야 한다.
  var points = [];
  var addresses = {};
  var lines = [];

다음과 같은 쓰기를 권장하지 않습니다.
  var points = List();
  var addresses = Map();

사용하지 마세요.length 집합이 비어 있는지 보기

if (lunchBox.isEmpty) return 'so hungry...';
if (words.isNotEmpty) return words.join(' ');

다음과 같은 쓰기를 권장하지 않습니다.
  if (lunchBox.length == 0) return 'so hungry...';
  if (!words.isEmpty) return words.join(' ');

높은 방법으로 서열을 바꾸는 것을 고려하다


만약 하나의 집합이 있고 그 중에서 새로운 수정된 집합을 생성하기를 원한다면 사용하십시오.map()、.where () 와 Iterable의 다른 편리한 방법은 일반적으로 더욱 짧고 성명성이 있다
  var aquaticNames = animals
      .where((animal) => animal.isAquatic)
      .map((animal) => animal.name);

편지의 숫자가 있는 Iterable을 사용하지 마십시오.forEach()


Dart에서, 만약 당신이 서열을 두루 훑어보고 싶다면, 관용적인 방법은 순환을 사용하는 것이다.
for (var person in people) {
  ...
}

다음과 같은 쓰기를 권장하지 않습니다.
  people.forEach((person) {
    ...
  });

List를 사용하지 마십시오.결과의 유형을 변경하지 않으려면 from ()


교체를 정하면 같은 요소를 포함하는 새로운 목록을 만들 수 있는 두 가지 뚜렷한 방법이 있다
var copy1 = iterable.toList();
var copy2 = List.from(iterable);

뚜렷한 차이는 첫 번째가 비교적 짧다는 것이다.중요한 차이점은 첫 번째로 원시 대상의 유형 파라미터를 보존했다는 것이다
// Creates a List:
var iterable = [1, 2, 3];

// Prints "List":
print(iterable.toList().runtimeType);
// Creates a List:
var iterable = [1, 2, 3];

// Prints "List":
print(List.from(iterable).runtimeType);

매개변수 사용


= 를 사용하여 명명된 매개변수를 기본값과 분할


남아 있는 이유 때문에 Dart에서는 지정한 매개 변수의 기본값 구분자로 ":"과 "="을 사용할 수 있습니다.선택적 위치 매개변수와 일치하도록 "="를 사용합니다.
  void insert(Object item, {int at = 0}) { ... }

다음과 같은 쓰기를 권장하지 않습니다.
  void insert(Object item, {int at: 0}) { ... }

명시적 기본값null 사용하지 않기


만약 파라미터가 선택할 수 있지만 기본값을 주지 않는다면, 언어는null을 기본값으로 은밀하게 사용하기 때문에 작성할 필요가 없습니다
void error([String message]) {
  stderr.write(message ?? '
'); }

다음과 같은 쓰기를 권장하지 않습니다.
void error([String message = null]) {
  stderr.write(message ?? '
'); }

변량


변수를 비워 두지 마십시오.


Dart에서 명시적으로 초기화되지 않은 변수나 필드가 자동으로 null로 초기화됩니다.더 이상 null 값을 부여하지 마십시오.
  int _nextId;
  
  class LazyId {
    int _id;
  
    int get id {
      if (_nextId == null) _nextId = 0;
      if (_id == null) _id = _nextId++;
  
      return _id;
    }
  }

다음과 같은 쓰기를 권장하지 않습니다.
  int _nextId = null;
  
  class LazyId {
    int _id = null;
  
    int get id {
      if (_nextId == null) _nextId = 0;
      if (_id == null) _id = _nextId++;
  
      return _id;
    }
  }

네가 계산할 수 있는 물건을 저장하는 것을 피하다


디자인 클래스에서, 당신은 보통 여러 개의 보기를 같은 밑바닥 상태로 공개하기를 원합니다.일반적으로 구조 함수에서 모든 보기를 계산하는 코드를 보고 그것을 저장합니다.
피해야 할 쓰기 방법:
  class Circle {
    num radius;
    num area;
    num circumference;
  
    Circle(num radius)
        : radius = radius,
          area = pi * radius * radius,
          circumference = pi * 2.0 * radius;
  }

위 코드 문제:
  • 메모리 낭비
  • 캐시 문제가 잘못되었습니다. 캐시가 만료되면 다시 계산해야 하는 시기를 어떻게 알 수 있습니까?

  • 권장되는 쓰기 방법은 다음과 같습니다.
      class Circle {
        num radius;
      
        Circle(this.radius);
      
        num get area => pi * radius * radius;
        num get circumference => pi * 2.0 * radius;
      }
    

    클래스 멤버


    필드를 Getter와setter에 불필요하게 포장하지 마십시오


    다음과 같은 쓰기를 권장하지 않습니다.
      class Box {
        var _contents;
        get contents => _contents;
        set contents(value) {
          _contents = value;
        }
      }
    

    final 필드를 우선적으로 사용하여 읽기 전용 속성을 만듭니다


    특히 StatelessWidget

    필요 없을 때는 this를 쓰지 마세요.


    다음과 같은 쓰기를 권장하지 않습니다.
      class Box {
        var value;
        
        void clear() {
          this.update(null);
        }
        
        void update(value) {
          this.value = value;
        }
      }
    

    다음 표기법을 추천합니다.
      class Box {
        var value;
      
        void clear() {
          update(null);
        }
      
        void update(value) {
          this.value = value;
        }
      }
    

    구조 함수


    가능한 한 초기화 형식을 사용하다


    다음과 같은 쓰기를 권장하지 않습니다.
      class Point {
        num x, y;
        Point(num x, num y) {
          this.x = x;
          this.y = y;
        }
      }
    

    다음 표기법을 추천합니다.
    class Point {
      num x, y;
      Point(this.x, this.y);
    }
    

    new 사용하지 않기


    Dart2에서 new 키워드 선택 가능
    권장 쓰기 방법:
      Widget build(BuildContext context) {
        return Row(
          children: [
            RaisedButton(
              child: Text('Increment'),
            ),
            Text('Click!'),
          ],
        );
      }
    

    다음과 같은 쓰기를 권장하지 않습니다.
      Widget build(BuildContext context) {
        return new Row(
          children: [
            new RaisedButton(
              child: new Text('Increment'),
            ),
            new Text('Click!'),
          ],
        );
      }
    

    비동기


    원시적인futures 대신 async/await 우선 사용


    async/await 문법은 읽을 수 있도록 해 줍니다. 비동기 코드에서 모든Dart 제어 흐름 구조를 사용할 수 있습니다.
      Future countActivePlayers(String teamName) async {
        try {
          var team = await downloadTeam(teamName);
          if (team == null) return 0;
      
          var players = await team.roster;
          return players.where((player) => player.isActive).length;
        } catch (e) {
          log.error(e);
          return 0;
        }
      }
    

    비동기는 아무 소용이 없을 때 사용하지 마라


    함수 동작을 변경하지 않고 비동기를 생략할 수 있다면 이렇게 합니다.
      Future afterTwoThings(Future first, Future second) {
        return Future.wait([first, second]);
      }
    

    쓰기 권장 안 함:
      Future afterTwoThings(Future first, Future second) async {
        return Future.wait([first, second]);
      }
    

    좋은 웹페이지 즐겨찾기