誰に向けた記事?
– 何らかのlinter
は導入してはいるが、今以上厳しくしてみたいなと思っている方
– very_good_analysis | Dart Package
を知らない方
– very_good_analysis | Dart Package
を知っているがどんな警告が出るのか知りたい方
概要
どうも、@daiki1003です!先日、あるプロジェクトにvery_good_analysis
パッケージを導入してみました。
元々は、pedantic_mono
パッケージを使っていたのですが、
もっと厳しいパッケージがあるとのことで導入をしてみました。
個人的には、lint
は厳しい方に寄せる方がデメリットよりもメリットの方が優ると考えています。
– 綺麗なコードを書く雰囲気が醸成される
– 割れ窓理論の逆 (なんていうんだろう笑)
– コードに規律が生まれ、レビュアーの負荷が減少する
– 効率的なアプリケーションが作成できる
– (厳しい方から緩い方に寄せるのは、難しくない)
そんな中で、先日very_good_analysis
パッケージを見つけました。
本記事では、
– very_good_analysis
の概要
– very_good_analysis
の追加
– very_good_analysis
の追加で対応した13個の項目
について書いていこうと思います。
very_good_analysisの概要
very_good_analysis
はVery Good Ventures
が提供しているパッケージです。
執筆時は、5.1.0
が最新です。
Very Good Ventures
は多数パッケージを提供しており、信頼性も高いと思います。
最近だとdart_frog
辺りが有名でしょうか。
現在ある中で最も厳しいパッケージ?
実は、Flutter
のlinter
って結構種類が存在するのですが、数ある中でもvery_good_analysis
は最多の適用数を誇っている様です。
flutterのlint、改めてどうしようかなと思ってた矢先見つけたスプシが良さそう。
基本的にルールは厳しめの方が個人的には良いと思っている。
緩くする分には後からいくらでも出来るしね。厳しくするだけならvery_good_analysisかなー。#Flutterhttps://t.co/7yjUEL4vnr
— ashdik(朝日)@Flutter(Kaigi) (@daiki1003) August 26, 2023
very_good_analysisの追加
pubspec.yaml
いつものように、pubspec.yaml
に追加します
very_good_analysis: ^5.1.0
analysis_options.yamlの変更
analysis_options.yaml
に以下を追記します。
もし、既存のlinter
パッケージがあるなら置換します。
include: package:very_good_analysis/analysis_options.yaml
また、バージョンごとに固定する事も出来ます。
include: package:very_good_analysis/analysis_options.5.1.0.yaml
very_good_analysisの追加で対応した13個の項目
public_member_api_docs
public
なメンバーに対しては、ドキュメントを書きましょうという項目です。
正直に言うと、これに関しては大変すぎたのでignore
させてもらいました…!
パッケージを除いて、これを守れてるプロジェクトって世にどれくらいあるんだろう。
always_put_required_name_parameters_first
required
なパラメタを常に先頭に持ってこいという警告です。
// BEFORE class SomeWidget extends StatelessWidget { const SomeWidget({ super.key, required this.value, }); final int value; } // AFTER class SomeWidget extends StatelessWidget { const SomeWidget({ required this.value, super.key, }); final int value; }
// BEFORE void someMethod({ int? intValue, required String stringValue, }) { ... } // AFTER void someMethod({ required String stringValue, int? intValue, }) { ... }
prefer_asserts_with_message
assert
文を書く時は必ずメッセージを指定せよ、という警告です。
// BEFORE assert(users.isNotEmpty); // AFTER assert(users.isNotEmpty, 'users must not be empty');
avoid_equals_and_hash_code_on_mutable_classes
immutable
ではないクラスに対して、bool operator ==(Object other)
およびint get hashCode
をoverride
するなよ、という警告です。
// BEFORE class SomeClass { const SomeClass(...); @override int get hashCode => ...; @override bool operator ==(Object other) { ... } } // AFTER @immutable class SomeClass { const SomeClass(...); @override int get hashCode => ...; @override bool operator ==(Object other) { ... } }
use_if_null_to_convert_nulls_to_bools
nullable
なbool
値の比較時にnull-aware operator
を使用せよ、という警告です。
// BEFORE bool? isEnabled; if (isEnabled == true) { ... } // AFTER if (isEnabled ?? false) { ... }
missing_whitespace_between_adjacent_strings
一つの文字列を複数行で定義している際に、1行目の最後に改行を入れろ、と言う警告です。
// BEFORE Text( 'This is' 'a pen', ) // AFTER Text( 'This is ' // 空白を追加 'a pen', )
なお、日本語ではこの警告は出ない様です。
avoid_escaping_inner_quotes
Dart
では、文字列リテラルの生成の際にsingle quote('
)の利用が推奨されています。
なので、I'm a pen.
の様な文字列リテラルを生成する時はescapeしていました。
そうではなく、そう言う時だけはdouble quotesを使えよ、という警告です。
// BEFORE 'I\'m a pen.' // AFTER "I'm a pen."
leading_newlines_in_multiline_strings
'''
を記述した行は必ず改行しろよ、という警告です。
// BEFORE final someString = '''{ aaa, bbb, }'''; // AFTER final someString = ''' { aaa, bbb, }''';
unnecessary_raw_strings
文字列リテラルに r
を付けることで、raw string
を生成することができます。
でも、必要ない時は普通の文字列を生成してね、という警告です。
// BEFORE Text( r'This is a string', style: ..., ), // AFTER Text( 'This is a string', style: ..., ),
use_raw_strings
逆に、必要があるときは raw string
にしなさいよ、と言う警告です。
// BEFORE RegExp('^https://example.com/.*\.(jpg|png)') // AFTER RegExp(r'^https://example.com/.*\.(jpg|png)')
always_use_package_import
絶対パスでimportしてね、と言う警告です
// BEFORE import 'user.dart'; // AFTER import 'package:sample/user/model/user.dart';
prefer_if_elements_to_conditional_expressions
コンポーネントを表示する際に、二項演算子ではなくif/else
で記述しろ、と言う警告です。
const isLiked = true; // BEFORE children: [ ... isLiked ? _LikedComponent() : _NormalComponent(), ... ] // AFTER children: [ ... if (isLiked) _LikedComponent() else _NormalComponent(), ... ]
no_runtimetype_tostring
全てのクラスの親クラスであるObject
にはruntimeType
と言うプロパティがあります。
これは、現在の型名を表すクラス(Type
クラス)を返してくれるのですが、これに対してtoString
を呼ぶな、と言う警告です。
// BEFORE 42.runTimeType.toString // AFTER // 特になし?
最後に
いかがでしたでしょうか?pedantic_mono
も割と厳しめのパッケージなのでflutter_lints
など、
他のパッケージからの移行の際はもっと多くの警告が出るかもしれませんね。
Twitterフォローお願いします
「次回以降も記事を読んでみたい!」「この辺分からなかったから質問したい!」
そんな時は、是非Twitter (@daiki1003)やInstagram (@ashdik_flutter)のフォローお願いします♪
Twitterコミュニティ参加お願いします
Twitterコミュニティ「Flutter lovers」を開設しました!参加お待ちしております😁
☕️ Buy me a coffee
また、記事がとても役に立ったと思う人はコーヒーを奢っていただけると非常に嬉しいです!
コメント