ООП Дизайн Запах? - PullRequest
       8

ООП Дизайн Запах?

0 голосов
/ 24 ноября 2010

Резюме
На самом деле я пишу объектно-ориентированную библиотеку классов для работы с Active Directory в Visual Basic .NET 2005.

Библиотека позволяет управлять организационными единицами, Группы и пользователи.

Я стремился обобщить как можно больше, чтобы мой код выглядел (упрощенно):

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

Я думал об обобщении этой коллекции, но опять же, словарь меняется от объекта к другому.Что касается OU, мы можем говорить о Children , когда для группы мы скажем Members и т. Д. На самом деле, это не относится к одной и той же реальности, поэтому я быЯ полагаю, обобщить эту коллекцию по плохой причине.

Есть мысли?

Спасибо!

1 Ответ

1 голос
/ 24 ноября 2010

Я думаю, вы должны обобщить коллекцию, скажем, как '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' иВызовите каждый отдельный постоянный метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...