1

请看一下下面的类和类型:

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 实例变量。

如果我想太多,我会徘徊。

4

3 回答 3

4

我认为您正在寻找的是在大多数语言中称为“静态”方法的方法,但我认为 VB 中的关键字是“共享”。(请原谅我——我在 VB 中不是那么博学,但我想回答概念性问题。)多重删除不应该需要实例化 Person 对象——这是你对类所做的事情,而不是对类的一个实例.

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

于 2013-03-25T21:44:30.473 回答
3

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

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

但是,这可能无关紧要。存储库类通常就是这样做的;它们具有处理单个对象和同一对象的集合的方法。与软件开发中的所有事情一样,您是否采用这种方法取决于最能满足您的需求的方法。

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

于 2013-03-25T21:41:16.460 回答
0

我说也许。如果根据 PersonID 是否为空将 WHERE 子句添加到命令字符串,我认为您可以将它们折叠成一个案例。如果是这样,这是一个具有一个目的的 PersonDeleter,即删除人员。

我担心这个类会根据表的构造方式决定是否清除表中的数据,但这是一个单独的问题。

于 2013-03-25T21:45:20.023 回答