final変数とは?
final変数は、値を一度設定すると変更できない(再代入不可)。
final city = "Tokyo";
// city = "Osaka"; // NG: 再代入はできない
const, lateなど定義キーワードがあrますが、大体のユースケースではfinalを使用することになる
var変数とは?
var変数は、値を設定しても何度も変更可能です(再代入可)。
var age = 25;
age = 30; // OK: 再代入が可能
Flutter Linter使用は?
Flutter開発行う際に、Linterライブラリーを導入する前提で考えましょう。
Lint使用目的:
- コードの一貫性
- バグの早期発見
- 非効率的なコードの改善
- 最新のベストプラクティスの適用
(+ 初心者には、 Lintのルールに従ってコードを書くのは一番らく)
Flutter Linterライブラリーの仕様には、大きく分けて2択があります。
A. 標準Lintルール用で、varとfinalをどっちも使用して構わないが。。。⬇
B. より厳しいLintルール用ライブラリーで。。。
Lintルールが厳しくなるほど、finalを定義することになるが。。。⬇
Flutterの実装は?
大幅にFlutterアプリの実装方針が以下に分類される。
(I) Flutter開発 + Linter使用であれば、
= final使用となる。
なるべくfinalを使用することと + Linterの実装でコードの安全性を保証すること。
単体テスト(ユニットテスト)では、Flutterの最小単位であるユニット(関数やメソッド、クラスなど)を個別にテストするコードを書く。
(II) Flutter開発 + Linter使用 + 単体テスト実装であれば、
= var使用となる。その理由は:
- ソースコード + 単体テストに使われる柔軟性
- var変数のステートをテストできる
- モックを導入することができる
結論
自分の担当してるFlutterプロジェクトで単体テストを実装するなら「var」を使用すること。
(より厳しいLinterの使用であれば、final関連のLintルールを無効化する)
var変数に単体テスト用のモックを再代入することで、より簡単に開発できる
それ以外のケースであれば、「final」を使用するのをお勧めします。
コードセキュリティの観点からそこまで深く考える必要はない。
(結果的にFlutterの難読化コマンドを使用することになる)