13

これを行うよりも、オプションのパラメーターをある関数から別の関数に渡す簡単な (そしてよりクリーンな) 方法はありますか?

void optional1({num x, num y}) {
  if (?x && ?y) {
    optional2(x: x, y: y);
  } else if (?x) {
    optional2(x: x);
  } else if (?y) {
    optional2(y: y);
  } else {
    optional2();
  }
}

void optional2({num x : 1, num y : 1}) {
   ...
}

私が実際に呼び出したいのは次のとおりです。

void drawImage(canvas_OR_image_OR_video, num sx_OR_x, num sy_OR_y, [num sw_OR_width, num height_OR_sh, num dx, num dy, num dw, num dh])

少なくとも、位置オプションのパラメーターの組み合わせ爆発は発生しませんが、多くの if-else よりも単純なものが必要です。

最初の回答で提案されたソリューションを使用するコードがいくつかあります (名前付きのオプションパラメーターのデフォルト値を伝播しますが、値が最初の呼び出し元によって提供されたかどうかを確認する機能を失います)。

4

2 に答える 2

12

私はダーツのこの隅に何度か火傷を負った。私の現在のガイドラインは次のとおりです。

  1. デフォルト値は使用しないでください。代わりに、暗黙のデフォルトの を使用しnull、関数の本体でそれを確認してください。nullが渡された場合に使用される値を文書化します。
  2. ?引数テスト演算子を使用しないでください。代わりに、単にテストしてnullください。

これにより、引数を渡さないことと明示的に渡すことnullはまったく同じになります。つまり、引数を明示的に渡すことでいつでも転送できます。

したがって、上記は次のようになります。

void optional1({num x, num y}) {
  optional2(x: x, y: y);
}

/// [x] and [y] default to `1` if not passed.
void optional2({num x, num y}) {
   if (x == null) x = 1;
   if (y == null) y = 1;
   ...
}

このパターンは、デフォルト値を使用する方がクリーンで維持しやすく、転送が必要な場合の厄介な組み合わせの爆発を回避できると思います。また、メソッドをオーバーライドしたり、オプションのパラメーターを使用してインターフェイスを実装したりするときに、既定値が重複することも回避されます。

ただし、これが機能しない Dart の世界の 1 つのコーナーがあります: DOM です。この演算子は、渡すことが渡すことと異なる(つまり、何も渡さない)?いくつかの JavaScript DOM メソッドがあるという事実に対処するために特別に設計されました。nullundefined

内部で使用する Dart の DOM メソッドに転送しようとしている場合は?、組み合わせ爆発に対処する必要があります。個人的には、これらの API を修正できることを願っています。

ただし、独自の Dart コードを作成する場合は、デフォルト値を?完全に避けることをお勧めします。あなたのユーザーはあなたに感謝するでしょう。

于 2013-02-01T19:08:14.837 に答える
0

あなたの場合、位置パラメータはオプションですか?

void optional([num x = 1, num y = 1]) {


}

とにかくデフォルトのパラメーターで呼び出すのでoptional2、関数の目的が何であるかを知らなくても、これは適切な代替のように思えます

于 2013-01-31T16:00:39.160 に答える