0

次のようなビジネス オブジェクトの OOP 設計を適切に実装する方法について頭を悩ませようとしています。

  1. データベースに「マスターリスト」を持っている(分類など)
  2. プロパティとして別のオブジェクトの一部 (つまり、オブジェクト構成) ですが、追加のプロパティがあります

ここで私は理論にこだわっています。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 レベルに公開したくありません。クラス全体の設計を見て何が欠けていますか?

編集:データベースはレガシーであり、レベルのフィールドは顧客テーブルで定義されているため、データベースへの分類レベルの保存は顧客オブジェクトによって処理されます。

4

2 に答える 2

1

問題を正しく理解していれば、 Customer クラスは実際の Classification クラスのインスタンスを集約する必要はありません。IDまたは列挙値で表される分類のレベルとタイプを指定する別のクラスのインスタンスが必要です。Classification クラスは、管理者が分類 ID/列挙のリストを維持するシナリオでのみ使用する必要があります。

于 2009-02-23T19:24:45.113 に答える
0

したがって、私が正しく理解していれば、関数をクラス Update()でのみ使用できるようにする必要があります。Customer

ClassificationCustomerクラスが同じアセンブリに配置されている場合は、関数を としてマークできUpdate()ますfriend。これにより、そのアセンブリ外のクラスからアクセスできなくなります。

于 2009-02-23T19:22:20.393 に答える