web-dev-qa-db-ja.com

わかりやすくするために、Dartで名前付きパラメーターを使用したいと思います。それらをどのように扱うべきですか?

TL; DR:名前付きパラメーターは、 意識的な設計選択 の結果としてオプションです。公式の言語サポートがなければ、必要な名前付き引数を強制(および通知)する方法はありますか?


クラスを定義するときに名前付きパラメーターを使用すると非常に便利です。たとえば、MMORPGのAbilityを使用します。

class Ability {

  final name;
  final effectDuration;
  final recast;            // wait time until next use
  // ...
}

effectDurationrecastは両方とも同じタイプの情報(つまり、期間)を保持し、同じデータ型で表される可能性があります。どの番号がどこに行くかは簡単に混同できます。ただし、これらは両方ともオブジェクトの正確性に不可欠な情報であるため、インスタンス化中に欠落することはありません。

これらのパラメーターの要件を強制するために、try-catchを介してプログラムを中断することもできますが、クラスを使用し、何も知らない人にとっては楽しいとは思えません(ドキュメントを読んで、クラスが何をするのかを直感的に理解すること)必須であること。

特定の名前付きパラメーターの要件を強制する方法はありますか?

11
Kafeaulait

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
  // ...
}    
_
23

はいあります!

以下に例を示します。

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に等しくないことを断定する必要はありませんが、役に立つかもしれません。

4
rmtmckenzie

受け入れられた答えで説明されているようにflutter foundationパッケージを使用することもできますが、Flutterについて知る必要のないモデルクラスを使用している場合、 metaを使用することを好みます。 パッケージを直接。そうすれば、フレームワークへの不要な依存関係が作成されません。これにより、Flutterの外部でもDartコードを共有できます。

metapubspec.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');
0
Suragch