代码之家  ›  专栏  ›  技术社区  ›  Will Marcouiller

糟糕的设计味道?

  •  0
  • Will Marcouiller  · 技术社区  · 14 年前

    摘要
    实际上,我正在编写一个面向对象的类库,用于在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 以便处理任何实例。

    我的 域.条目 财产是 ICollection(Of DirectoryEntryBase) .

    问题
    当我打电话给我的时候 域.AcceptChanges方法 因为我需要访问 OrganizationalUnit.Children 或者 Group.Members 集合取决于其类型。

    Public 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
    

    我曾考虑过将这个集合泛化,但话说回来,词汇表从一个objet变为另一个objet。至于你,我们可以谈谈 儿童 ,对于一个团队,我们会说 成员 ,等等。事实上,这些并不是指同一个现实,所以我想我会因为一个不好的原因来概括这个集合。

    有什么想法吗?

    谢谢!

    1 回复  |  直到 14 年前
        1
  •  1
  •   TJB    14 年前

    我认为你应该把这些收藏品概括成,比如说,a' BaseList '其中包含OrganizationalUnit.Children和Group.Members的公共属性。

    然后,子类和成员类可以扩展该基类,并添加接受更改时所需的其他自定义功能。

    总而言之:

    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
     }
    }
    

    然后你可以在 基准表 '并调用每个persist方法。