OOP设计气味?

时间:2010-11-23 22:31:35

标签: .net polymorphism oop

摘要
我实际上正在编写一个面向对象的类库,用于处理Visual Basic .NET 2005中的Active Directory。

该库允许管理组织单位,组和用户。

我尽力推广我的代码看起来像(简化):

Public Interface IDirectoryEntityBase
    ReadOnly Property DistinguishedName As String
    ReadOnly Property Domain As String
    Property Name As String
    ReadOnly Property Schema As String
End Interface

Public Interface IDirectoryEntity
    Inherits IDirectoryEntryBase

    Property Login As String
End Interface

Public MustInherit Class DirectoryEntity
    Implements IDirectoryEntity

    Private _distinguishedName As String
    Private _domain As String
    Private _name As String
    Private _schema As String

    Public Sub New(ByVal pName As String)
        Name = pName
    End Sub

    Public ReadOnly Property DistinguishedName As String Implements IDirectoryEntryBase.Name
        Get
            Return _name
        End Get
    End Property

    Public ReadOnly Property Domain As String Implements IDirectoryEntryBase.Domain
        Get
            Return _domain
        End Get
    End Property

    Public Property Name As String Implements IDirectoryEntryBase.Name
        Get
            Return _name
        End Get
        Set(ByVal value As String)
            If (String.IsNullOrEmpty(value)) Then Return
            _name = value.Trim()
        End Set
    End Property

    Public ReadOnly Property Schema As String Implements IDirectoryEntryBase.Schema
        Get
            Throw New NotImplementedException()
        End Get
    End Property
End Class

Public Interface IOrganizationalUnit
    Inherits IDirectoryEntity

    ReadOnly Property Children As ICollection(Of IDirectoryEntityBase)
End Interface

Public Class OrganizationalUnit
    Inherits DirectoryEntity
    Implements IOrganizationalUnit

    Private _children As ICollection(Of IDirectoryEntityBase)

    Public Sub New(ByVal pName As String)
        MyBase.New(pName)

        _children = new List(Of IDirectoryEntity)()
    End Sub

    Public ReadOnly Property Children As ICollection(Of IDirectoryEntityBase) Implements IOrganizationalUnit.Children
        Get
            Return _children
        End Get
    End Property
End Class

Public Interface IGroup
    Inherits IDirectoryEntity

    ReadOnly Property Members As ICollection(Of IDirectoryEntity)
End Interface

Public Class Group
    Inherits DirectoryEntity
    Implements IGroup

    Private _members As ICollection(Of IDirectoryEntity)

    Public Sub New(ByVal pName As String)
        MyBase.New(pName)

        _members = New List(Of IDirectoryEntity)()
    End Sub

    Public ReadOnly Property Members As ICollection(Of IDirectoryEntity) Implements IGroup.Members
        Get
            Return _members
        End Get
    End Property
End Class

现在,当我通过Domain.Entries将我的Domain.Add Method中的任何类型的实例添加到Domain.AcceptChanges Method时,我可以调用Domain.Entries以便处理任何实例。

我的ICollection(Of DirectoryEntryBase)属性为Domain.AcceptChanges Method

问题
当我打电话给OrganizationalUnit.Children时,我发现自己因为必须知道我正在使用什么架构或类型而被戴上手铐,因为我需要访问Group.MembersPublic Class Domain Public Sub AcceptChanges() For Each e As DirectoryEntry In Entries 'How may I find out what collection to work with here?' Next End Sub End Class 集合取决于他们的类型。

{{1}}

我考虑过对这个集合进行概括,但是再一次,词汇从一个对象变为另一个。至于OU,我们可能会谈论 Children ,对于一个Group,我们会说 Members 等等。事实上,这些并不是指同一个现实,所以我猜想,我会把这个集合归结为一个不好的理由。

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

我认为你应该将这个集合归类为,例如,一个'BaseList',它将容纳OrganizationalUnit.Children和Group.Members的公共属性。

然后,Children和Member类可以扩展该基类,并添加接受更改时需要发生的其他自定义功能。

总结如下:

public class BaseList
{
 public virtual void Persist(...);
 // Common stuff
}

public class Children
{
 public override void Persist(...)
 {
   // do custom stuff
 }
}

public class Members
{
 public override void Persist(...)
 {
   // do custom stuff
 }
}

然后,您可以遍历“BaseList”的集合并调用每个单独的持久化方法。