内部 ORM ツールの一部を再設計しており、Field (CustomerFirstName などのデータベース内のフィールドを表すクラス) を最終開発者に直接公開したいと考えています。
これは簡単に実現できましたが、この Field クラスは以前は内部で使用されていてオープンすぎたため、API は少し見苦しくなってしまいました。たとえば、これは小さな例の 1 つにすぎません。IsDirty プロパティは読み取り専用ではありませんでした。これは最終開発者が改ざんできないものです。
IPublicField と IPrivateField の 2 つのインターフェイスを作成し、両方を実装するフィールド クラスを取得しようと考えました。ただし、 IsDirty の例を続けると、次のようなものは必要ありません。
Public ReadOnly Property PrivateIsDirty Implements IPrivateField.IsDirty
...
End Property
Public Property IsDirty Implements IPublicField.IsDirty
...
End Property
...少し醜いだけでなく、Field クラスにキャストバックして、非読み取り専用メソッドに入ることができます。また、別のセッター メソッドを導入したくありませんでした。これは、考えたくない別の重大な変更になるためです。また、API の他の部分との不整合も生じるためです。
Field クラスの名前を InnerField に変更し、その周りにファサード/ラッパー スタイルの構造を次のように作成しました。
Public Class Field
Implements BusinessObjects.IField
Private InnerField As BusinessObjects.IInnerField
Public Sub New(ByVal field As IInnerField)
InnerField = field
End Sub
...
Public ReadOnly Property IsDirty() As Boolean Implements BusinessObjects.IField.IsDirty
Get
Return InnerField.IsDirty
End Get
End Property
...
End Class
これはかなりうまくいっているようです。内部的には、InnerField は適切にオープンであり、最終開発者に影響を与えることなく、将来さらにオープンにする自由があります。外部的には、Field クラスは、最終開発者が必要とする単純化されたロックダウンされたツールを提供します。
それで、それが首尾一貫していると仮定して、あなたがこの状況でどのように進んだか、そして私の解決策が外部から合理的に見えるかどうか疑問に思っていました.
ありがとう!