個人的に気になったDartの書き方

# はじめに
厳密さにかけているので、下記のドキュメントさらっと読むのが一番良いです。

[A Tour of the Dart Language](https://www.dartlang.org/guides/language/language-tour)と、[Effective Dart](https://www.dartlang.org/guides/language/effective-dart)を読みつつ、[DartPad](https://dartpad.dartlang.org/)使って試すと良いかと。

## 基本
GoとかJavaと同じようにmain関数から処理が開始される。

## 変数、定数
Dartにはvar, dynamic, final, constがある。

### var

```dart
var name = 'hoge';
```
varはJSのvarとは異なりTSのletのイメージが一番近いと思う。型が同じであれば再代入可能。  
下記は可能。

```dart
var name = 'hoge';
name = 'fuga';
```
しかし、下記のように型が異なる場合には当然再代入できない。

```dart
var name = 'hoge';
name = 1; // 型が異なるため再代入できない
```

### dynamic

```dart
dynamic name = 'hoge';
```
dynamicはJSのletのイメージが一番近いと思う。
型が異なっていても再代入可能。型は不定（dynamic型）になる。
下記すべて可能。

```dart
dynamic name = 'hoge';
name = 1;
name = 'fuga';
```

### 明示的型の記述
推論があるためあまり使わないかもしれないが、下記のようにも書ける。当然同一の型は再代入可能。

```dart
String name = 'hoge';
name = 'fuga';
```

### final

```dart
final name = 'hoge';
```
JSのconstのイメージが一番近いと思う。Javaをあまり知らないがJavaのfinalに近いのかな？
再代入不可だが、参照先が変更される可能性はある。

下記は可能。

```dart
final List<int> list = [1, 2, 3];
print(list);

list[0] = 2;
print(list);
```

下記はできない。

```dart
final List<int> list = [1, 2, 3];
list = [3, 3, 3]; // 再代入できない。
```

### const
再代入不可。参照先が変わることもない。

```dart
const name = 'hoge';
```

下記もできない。

```dart
const List<int> list = [1, 2, 3];
list[0] = 2;
```

## デフォルト値(default value)
未初期化変数の初期値はすべてnull。

```dart
int count;

String name;

assert(count == name);
```

## 文字列結合と変数展開
下記のように改行した文字列は+で結合した文字列と同じになる。また変数展開はシングルクォーテーション、ダブルクォーテーション内で`${}`または`$`を用いる。

```dart
var name = 'Tarou '
           'Tanaka';

var lastName = 'Tanaka'

assert(name == 'Tarou' + lastName);
assert(name == 'Tarou ${Tanaka}');
```

## オプションのパラメータ(optional parameters)
### オプションの名前付きパラメータ(optional named parameters)
引数内で`{}`で囲むことで可能

```dart
String echo({ String word }) {
  print(word);
  return word;
}

echo(word: 'hello');
echo();
```

### オプションの定位置パラメータ(optional poisitional parameters)
引数内で`[]`で囲むことで可能

```dart
String echo([String word]) {
  print(word);
  return word;
}

echo('hello');
echo();
```

## 型テスト演算子(type test operators)
`as`, `is`, `is!`がある。asはTypecastなのでTSのasと同じように捉えればよいかと。
`is`, `is!`はインタフェースを実装しているか否かで真偽値を返す。

```dart
dynamic name = 'hoge';
if (name is String) {
  print('string'); // stringと標準出力される
}
```

## 条件式(conditional expressions)
JSの`||`に近いものとしては`??`がある

```dart
String echo([String word]) {
  var nonNullWord = word ?? '';
  print(nonNullWord);
  return nonNullWord;
}
```

## カスケード記法(cascade notation)

```dart
class Point {
  num x;
  num y;
}

var point = Point();
point..x = 1
     ..y = 2;
```
上記と下記は同じ

```dart
class Point {
  num x;
  num y;
}

var point = Point();
point.x = 1;
point.y = 2;
```

## 条件付きメンバーアクセス(conditional member access)
Rubyのぼっち演算子みたいなやつ。
下記の場合、pointがnullの場合にはnullを返し、pointがnullでない場合には、メンバーにアクセスする。

```dart
point?.x
```

## 例外処理
onを用いることで例外の種類ごとに対応可能

```dart
main() {
  try {
    hello();
  } on Exception catch (e) {
    print(e);
  }
}

void hello() {
  throw 'hogehoge';
}
```

## コンストラクタ
### 省略記法
TSのparameter propertiesみたいなやつ

```dart
class Point {
  num x, y;

  Point(num x, num y) {
    this.x = x;
    this.y = y;
  }
}
```
上記と下記は同じ

```dart
class Point {
  num x, y;

  Point(this.x, this.y);
}
```

### 名前付きコンストラクタ(named constructors)

```dart
class Point {
  num x, y;

  Point(this.x, this.y);

  Point.origin() {
    x = 0;
    y = 0;
  }
}

main() {
  var point = Point.origin();
}
```

他にも下記の部分が気になった
* Constant constructors(immutableにできるってこと)
* Factory constructors(そういうのがあるってこと)
* getter setter(書き方)
* Implicit interface(暗黙のインタフェース)
* metadata(@requiredとか書けること)
* mixin(withで書けること)

上記すべて押さえておけばとりあえず問題なく書けると思います。

## 参考文献

[A Tour of the Dart Language](https://www.dartlang.org/guides/language/language-tour)