TL; DR:名前付きパラメーターは、 意識的な設計選択 の結果としてオプションです。公式の言語サポートがなければ、必要な名前付き引数を強制(および通知)する方法はありますか?
クラスを定義するときに名前付きパラメーターを使用すると非常に便利です。たとえば、MMORPGのAbility
を使用します。
class Ability {
final name;
final effectDuration;
final recast; // wait time until next use
// ...
}
effectDuration
とrecast
は両方とも同じタイプの情報(つまり、期間)を保持し、同じデータ型で表される可能性があります。どの番号がどこに行くかは簡単に混同できます。ただし、これらは両方ともオブジェクトの正確性に不可欠な情報であるため、インスタンス化中に欠落することはありません。
これらのパラメーターの要件を強制するために、try-catchを介してプログラムを中断することもできますが、クラスを使用し、何も知らない人にとっては楽しいとは思えません(ドキュメントを読んで、クラスが何をするのかを直感的に理解すること)必須であること。
特定の名前付きパラメーターの要件を強制する方法はありますか?
meta パッケージは、DartAnalyzerでサポートされている_@required
_注釈を提供します。
Flutterはこれをよく使用し、_@required
_から直接_import 'package:flutter/foundation.Dart'
_を提供します
_foo({@required String name}) {...}
foo(); // results in static warning
_
_@required
_は、渡された値がnull
であるかどうかをチェックせず、値が呼び出しサイトで実際に渡されたことのみをチェックします。 null
を確認するには、assert()
を使用して、渡された値を確認することもできます
_class Ability {
Ability(this.name, this.effectDuration, this.recast) : assert(name != null), assert(effectDuration != null), assert(recast != null);
final name;
final effectDuration;
final recast; // wait time until next use
// ...
}
_
はいあります!
以下に例を示します。
class Ability {
final String name;
final Duration effectDuration;
final bool recast;
Ability({
@required this.name,
this.effectDuration = new Duration(seconds: 1),
this.recast = false,
}):
assert(name != null),
assert(effectDuration != null);
}
名前がnullに等しくないことを断定する必要はありませんが、役に立つかもしれません。
受け入れられた答えで説明されているようにflutter foundation
パッケージを使用することもできますが、Flutterについて知る必要のないモデルクラスを使用している場合、 metaを使用することを好みます。 パッケージを直接。そうすれば、フレームワークへの不要な依存関係が作成されません。これにより、Flutterの外部でもDartコードを共有できます。
meta をpubspec.yamlに追加します:
dependencies:
meta: ^1.1.7
クラスファイルにインポートします。
import 'package:meta/meta.Dart';
使用 @required
コード内の注釈:
class Person {
String name;
int age;
Person({@required this.name, this.age,});
}
したがって、name
は必須パラメーターですが、age
は必須ではありません。
final person = Person(name: 'Bob');