次のようなビジネス オブジェクトの OOP 設計を適切に実装する方法について頭を悩ませようとしています。
- データベースに「マスターリスト」を持っている(分類など)
- プロパティとして別のオブジェクトの一部 (つまり、オブジェクト構成) ですが、追加のプロパティがあります
ここで私は理論にこだわっています。CRUD 関数が定義された (MustOverride) 抽象クラス BusinessObject から継承する Classification オブジェクトがあるとします。これは私に与えます:
Public MustInherit Class BusinessObject
Public Sub New()
End Sub
Public MustOverride Function Create() As Boolean
Public MustOverride Sub Read(ByVal id As Integer)
Public MustOverride Function Update() As Boolean
Public MustOverride Function Delete() As Boolean
End Class
Public Class Classification
Inherits BusinessObject
<Fields, properties, etc. for ID, Name (or Description), and
IsActive. DB table has only these 3 fields.>
Public Sub New()
MyBase.New()
End Sub
Public Overrides Function Create() As Boolean
Dal.Classifications.Create(Me)
End Function
Public Overrides Function Delete() As Boolean
Dal.Classifications.Delete(Me)
End Function
Public Overloads Overrides Sub Read(ByVal id As Integer)
Dal.Classifications.Read(Me)
End Sub
Public Overrides Function Update() As Boolean
Dal.Classifications.Update(Me)
End Function
End Class
これにより、システム管理者がシステム内の分類のマスター リストを管理できるフォームで分類オブジェクトを使用できるようになります。ここでは問題ありません。
ここで、Customer オブジェクトに Classification 型 (オブジェクト構成) のプロパティを持たせたいのですが、1 つの注意点があります。Classification オブジェクトは、Customer オブジェクトのプロパティになるときに、追加のフィールド Level を必要とします。レベルは、ビジネスに応じた分類の論理的な部分です。分類には、アプリケーション ユーザーが入力した数値レベルがあります。そこで、Classification から継承するクラス CustomerClassification を作成しました。
Public Class CustomerClassification
Inherits Classification
Private _level As Integer
Public Property Level() As Integer
Get
Return _level
End Get
Set(ByVal value As Integer)
_level = value
End Set
End Property
Public Sub New()
MyBase.New()
End Sub
End Class
Customer オブジェクトは CustomerClassification で構成されます。
Public Class Customer
Inherits BusinessObject
Public Property Classification() As CustomerClassification
........ etc
End Class
さて、私の設計上の問題は、Create、Read、Update、および Delete 関数がまだ CustomerClassification オブジェクトで公開されていることです。
Dim c as New Customer
c.CustomerClassification.Update() ' <-- Not desirable!
ここで他のどのような設計を実装できますか? これを間違った方法で設計していることは明らかですが、簡単な代替パターンは見当たりません。Classification を継承せず、すべてのフィールドとプロパティ コードを繰り返すことによって、CustomerClassification クラスのコードを繰り返したくありませんが、CRUD 関数を CustomerClassification レベルに公開したくありません。クラス全体の設計を見て何が欠けていますか?
編集:データベースはレガシーであり、レベルのフィールドは顧客テーブルで定義されているため、データベースへの分類レベルの保存は顧客オブジェクトによって処理されます。