2013-03-25 65 views
1

请看一看类和键入如下:VB.NET - 单类,多种用途?

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

也许吧。我认为如果你根据PersonID是否为null将WHERE子句添加到命令字符串中,你可以将它们折叠成一个大小写。 – neontapir 2013-03-25 21:43:22

+1

偏离主题,如果这是整个代码,那么您并未关闭连接。 – 2013-03-25 21:43:52

+0

@Jack Pettinger,谢谢。我总是在生产环境中使用USING语句来处理一次性对象。我错过了上面代码的速度。无论如何。 – w0051977 2013-03-25 21:46:23

回答

3

我会说是:它打破SRP。

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

但是,这可能并不重要。存储库类通常是这样做的;他们有处理单个对象和同一对象集合的方法。与软件开发中的所有事情一样,无论您采取这种方法,都取决于最能满足您需求的方式。

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

+0

这是我的想法,即它打破SRP。 +1。然而,在我看来,atw13提出了一个非常好的观点,即MassDelete应该是一个共享函数(然后大规模删除不需要构造函数)。你是否仍然认为这打破了SRP这是头脑? – w0051977 2013-03-25 21:58:06

+0

@ w0051977:这就是我所说的“普通方法”。存储库中的方法通常不是静态的;我只对不接触外部状态的操作使用静态方法。但是静态方法对此可能是可以的。 – 2013-03-25 21:59:35

+0

谢谢,因此,如果我使用MultipleDelete共享方法并删除了零参数构造函数,那么它更符合SRP?我意识到这取决于你的解释,但它有助于获得另一个观点。 – w0051977 2013-03-25 22:05:58

4

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

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

+0

+1同意,批量删除应该是一个'公共共享函数'返回一个布尔' – 2013-03-25 21:45:22

+0

我同意该函数应该共享。 +1。感谢那。 – w0051977 2013-03-25 21:53:55

0

我说也许。我认为如果你根据PersonID是否为null将WHERE子句添加到命令字符串中,你可以将它们折叠成一个大小写。如果是这样,这是一个PersonDeleter有一个目的,删除人。

我担心这个班级决定是否根据其构建方式来清除表格的数据值,但这是一个单独的问题。

+0

谢谢,但我不确定你的意思是“单一案件”? – w0051977 2013-03-25 21:59:15