VB.NET - 单一类,多重用途?

时间:2013-03-25 21:38:48

标签: vb.net design-patterns

请查看下面的课程和类型:

Imports System.Data.SqlClient

Public Class c1

    Dim PersonID As Integer

    Public Sub New(ByVal Person As Person)
        PersonID = Person.PersonID
    End Sub

    Public Sub New()

    End Sub

    Private Sub SingleDelete()
        Dim objCommand As SqlCommand
        Dim objCon As SqlConnection
        Try
            Dim _ConString As String = "Data Source=IANSCOMPUTER;Initial Catalog=Test;Integrated Security=True;MultipleActiveResultSets=true"
            objCon = New SqlConnection(_ConString)
            objCommand = New SqlCommand("Delete FROM Person were id=" & PersonID)
                objCommand.Connection = objCon
                objCon.Open()
                objCommand.ExecuteNonQuery()
        Catch ex As Exception
            Throw
        Finally

        End Try
    End Sub

        Private Sub MassDelete(ByVal listPerson As List(Of Person))
            Dim objCommand As SqlCommand
            Dim objCon As SqlConnection
            Try
                Dim _ConString As String = "Data Source=IANSCOMPUTER;Initial Catalog=Test;Integrated Security=True;MultipleActiveResultSets=true"
                objCon = New SqlConnection(_ConString)
                For Each Person In listPerson
                objCommand = New SqlCommand("Delete FROM Person were id=" & Person.PersonID)
                objCommand.Connection = objCon
                    objCon.Open()
                    objCommand.ExecuteNonQuery()
                Next
            Catch ex As Exception
                Throw
            Finally

            End Try
        End Sub
    End Class

Public Class Person
    Public PersonID As String
End Class

此课程有两种用途:

1) Call the constructor with a Person argument.  Then call SingleDelete i.e. delete one person.
2) Call the zero argument constructor.  Then call multiple delete i.e. delete many persons (all persons in the list are deleted)

这会违反SOLID原则吗?这个课在我的脑海里有两个目的。如果使用零参数构造函数,则不使用PersonID实例变量。

如果我在思考这个问题,我会徘徊。

3 个答案:

答案 0 :(得分:4)

我认为你所寻找的是大多数语言中的“静态”方法,但我认为VB中的关键词是“共享的”。 (原谅我 - 我不是那个知识渊博的VB,但我想回答概念问题。)多删除不应该要求实例化一个Person对象 - 这是你对类做的事情,而不是对类的一个实例

所以你的Mass-delete应该是一个“类方法”或“静态方法”,你可以这样使用:Person.MassDelete(...),而你的单个删除将在一个实例上调用, bob.delete()。

答案 1 :(得分:3)

我会说是的:它打破了SRP。

原因如下:该课代表两件事:一个人和一群人。它基本上是一个实用程序或管理器类,而不是一个用特定域对象标识的类。

然而,这可能无关紧要。存储库类通常只是这样做;他们有处理单个对象和同一对象集合的方法。与软件开发中的所有内容一样,您是否采用这种方法取决于最符合您需求的方法。

如果类的“模式”没有根据构造函数的调用方式而改变,那么这可能是一个更好的设计。这不是必需的;如果你想删除多个人,你可以提供一个普通的方法,将一组人ID作为参数。

答案 2 :(得分:0)

我可能会说。如果根据PersonID是否为null将WHERE子句添加到命令字符串,我认为您可以将这些折叠为单个案例。如果是这样,这是一个有一个目的的PersonDeleter,用于删除人员。

我担心这个课程决定是否根据它的构造方式消除一个表的数据,但这是一个单独的问题。