请查看下面的课程和类型:
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实例变量。
如果我在思考这个问题,我会徘徊。
答案 0 :(得分:4)
我认为你所寻找的是大多数语言中的“静态”方法,但我认为VB中的关键词是“共享的”。 (原谅我 - 我不是那个知识渊博的VB,但我想回答概念问题。)多删除不应该要求实例化一个Person对象 - 这是你对类做的事情,而不是对类的一个实例
所以你的Mass-delete应该是一个“类方法”或“静态方法”,你可以这样使用:Person.MassDelete(...),而你的单个删除将在一个实例上调用, bob.delete()。
答案 1 :(得分:3)
我会说是的:它打破了SRP。
原因如下:该课代表两件事:一个人和一群人。它基本上是一个实用程序或管理器类,而不是一个用特定域对象标识的类。
然而,这可能无关紧要。存储库类通常只是这样做;他们有处理单个对象和同一对象集合的方法。与软件开发中的所有内容一样,您是否采用这种方法取决于最符合您需求的方法。
如果类的“模式”没有根据构造函数的调用方式而改变,那么这可能是一个更好的设计。这不是必需的;如果你想删除多个人,你可以提供一个普通的方法,将一组人ID作为参数。
答案 2 :(得分:0)
我担心这个课程决定是否根据它的构造方式消除一个表的数据,但这是一个单独的问题。