1

「オプションの入力」の何が特別なのですか?

人々は Dart が「オプションのタイピング」をサポートすることに非常に熱心ですが、言語がダック タイピングをサポートすると、オプションのタイピングを当然のことと見なすことはできませんか? 明らかな特徴ではないでしょうか。

4

1 に答える 1

2

型注釈を指定すると、仲間の開発者とツールの両方に情報が渡されます。

2 つの関数のこの (かなり長い) 例を考えてみましょう。1 つ目は型情報なし、2 つ目は型情報あり:

createConnection(details) {
  var foo = details.host; // assume details has a host property
  // do stuff
  return connection;
}

Connection createConnection(ConnectionParams details) {
  var foo = details.host; // tools can validate that details has a host property
  // do stuff
  return connection;
}

最初の関数を呼び出すときは、関数がフィールドを持つものを受け取ることを (API ドキュメントまたはソースコードを読んで) 知る必要がありhostます。Connectionまた、関数が文字列などではなくオブジェクトを返すことも知っておく必要があります。

2 番目の関数を呼び出すと、 で定義されたインターフェイスを満たす任意のオブジェクトを渡すことができ、オブジェクトが返さConnectionParamsれることがわかります。Connection

2 つのクラスがあるとします。

class MySqlConn {
  String host;
}

class PostgreSqlConn {
  String host;
}


// elsewhere
var conn = new MySqlConn()..host = '127.0.0.1';
createConnection(conn);

これは有効なダック タイピングですが、最初の関数とこれらのクラスの間にコード内での接続はありません。ただし、両方に同じ名前のフィールドがあることを除けば: host.

これら 2 つのクラスを見ると、それらの 1 つの用途がそれらのインスタンスをcreateConnection()関数に渡すことであるとは言えません (ツールがそれを理解するのも非常に困難です)。createConnectionこれら 2 つのクラスにリンクする関数の API ドキュメントを作成できません。

型情報をもう少し追加して意図を伝えると、突然すべてがまとまります。

// define an interface
abstract class ConnectionParams { 
  String host;
}

// inform tools and humans that MySqlConn implements the interface
class MySqlConn implements ConnectionParams {
  String host;
}

class PostgreSqlConn implements ConnectionParams {
  String host;
}

ツールと人間の両方が、2 番目のcreateConnection関数からクラス、そして最終的にはインターフェイスに戻る静的コード内のリンクを形成できるようになりました。最初の例では、リンクは実行時にのみ作成されます。

于 2013-07-12T07:52:02.273 に答える