1

私は D プログラミング言語でマルチスレッド プログラムを書いていますが、この言語にはかなり慣れていません。Tid.send()パッケージ内のおよびreceive[Only]()APIを使用してスレッド間で渡される型std.concurrencyには、送信側と受信側のスレッド間の競合状態を回避するために値型または定数でなければならないという制限があります。struct Message私は値渡ししていた単純な型を持っています:

enum MessageType {
    PrepareRequest,
    PrepareResponse,
    AcceptRequest,
    Accepted
}

struct Message {
    MessageType type;
    SysTime timestamp;
    uint node;
    ulong value;
}

ただし、一部MessageTypeの s にはすべてのフィールドがなく、switch ステートメントを使用して、ポリモーフィズムを使用してこの作業を自動的に行うことができるときに、どの型にどのフィールドがあるかを覚えておくのは面倒です。ここで推奨されるクラス階層を使用していimmutableますか、それとも私がすでに使用しているアプローチが最善の方法ですか?その理由は?

編集

また、不変クラスを使用する必要がある場合、ユーザー定義クラスの不変オブジェクトを作成するための推奨される方法は何ですか? immutable戻り値を?にキャストするクラスの静的メソッド。

4

1 に答える 1

2

経験則として、ポリモーフィック型階層がある場合、クラスは使用するツールです。また、意図的に突然変異が問題にならない場合は、不変クラスが効率的にトリックを実行する必要があります。

Ali による DConf2013 の素晴らしいプレゼンテーションが最近公開されました: http://youtu.be/mPr2UspS0fE . D でのconstandの使用法について詳しく説明しています。immutable他の良いものの中でも、 auto var = new immutable(ClassType)(...);不変クラスを作成するための構文を使用することが提案されています。その後、すべての初期化がコンストラクターに送られ、特別なハックは必要ありません。

于 2013-05-14T08:51:49.213 に答える