1

私は現在、PCに接続されたデバイスで構成値を読み取って設定できるライブラリに取り組んでいます。各構成フィールドは、定数(public static readonly)オブジェクトによって記述されます。このオブジェクトには、このフィールドの名前、データのタイプ(値の制限とともに)、および読み取り/書き込みに必要なコマンドシーケンスが含まれています。

この情報は、ほとんどの場合、ライブラリ内で必要になります。ただし、クライアントコードは、特定のフィールドの読み取り/書き込みをライブラリに指示できる必要があります。また、フィールドを値に関連付けるディクショナリで構成値のコレクションを渡したいと思います。これを行うには、フィールドを識別するパブリック値を提供する必要があります。

フィールドを内部的に記述し、それらを公に識別するために同じオブジェクトを使用しても大丈夫ですか?少し違和感がありますが、理由がわかりません。疑問を投げかけるか、なぜそれが悪い考えなのか、何に注意すべきかを教えていただければ幸いです。

更新:フィールドIDとフィールドアクセスの実装の両方に同じオブジェクトを使用することになりました。さて、数か月後、私はついに、これが完全にクリーンなソリューションではなかった理由を浮き彫りにする問題に遭遇しました。前述のように、フィールドオブジェクトはデバイスの構成フィールドを表します。これは、そのようなフィールドへのアクセス方法とは無関係です。

より一般的な言葉で言えば、物事の私の隠された内部表現は物事を説明していません。それは必ずしも1:1の関係を持っていないものに関連する何かを説明します。

フィールドアクセスを変更する場合、これは問題になる可能性があります。たとえば、「エラー時に再試行」アクセス動作を提供するFieldデコレータクラスを作成できなくなりました。デコレータを操作するコードは、実際の基になるフィールドとは関係なく、それを独自のフィールドとして扱います。

これは元の質問に対する答えではなく、私の仮定が間違っていたことの認識であることに注意してください。モノの内部記述がモノ自体と1:1の関係にあると本当に確信している場合、この問題は当てはまりません。

4

1 に答える 1

2

これは、ライブラリがどのように機能するか、およびクライアント コードがどのように相互作用するかに大きく依存します。内部表現をクライアントに公開する際の潜在的な問題の 1 つは、クライアント コードを壊すことなく内部表現を変更する柔軟性がないことです。ただし、内部で別の表現が必要な時点で、新しい内部表現を作成し、古い表現をパブリック API の一部として残すことができるため、それを克服するのはそれほど難しいとは思いません。 .

内部表現をパブリック API の一部として公開することにした場合、注意すべき点の 1 つは、意図しない副作用です。たとえば、クライアント コードがオブジェクトを渡し、そのオブジェクトを内部に格納するとします。C# では、オブジェクトは参照によって渡されます。つまり、そのオブジェクトに対する変更は、内部に保存されているオブジェクトにも適用されます。もちろん、この問題が発生しないように、オブジェクトのコピーを作成することもできます。

最後に、一歩下がって、クライアントの観点からパブリック API を検討することをお勧めします (まだ検討していない場合)。おそらく、いくつかの単体テストで使用してみてください。内部表現は、クライアントの観点から表現するのに最適な方法ではないことに気付くかもしれません。

内部構造を使用する非常に単純な API の場合は、おそらく問題ありません。私は常に他の方向に傾く傾向があり、パブリック API を内部の仕組みから分離する私の設計では、抽象化と分離を選択します。

それはすべてトレードオフに関するものであり、達成しようとしていることに依存します。うまくいけば、これがあなたの決定に少し役立つでしょう.

于 2012-11-02T01:53:35.137 に答える