2013-03-25 3 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

+1

주제에서 벗어나 전체 코드 인 경우 연결을 종료하지 않을 것입니다. –

+0

@ Jack Pettinger, 감사합니다. 프로덕션 환경에서 항상 일회용 개체에 USING 문을 사용합니다. 나는 위의 코드에서 속도를 내지 못했다. 어쨌든 +1하십시오. – w0051977

답변

3

나는 예라고 말하고 싶다. 그것은 SRP를 깨뜨린다.

다음과 같은 이유가 있습니다. 클래스는 사람과 사람의 모임이라는 두 가지를 나타냅니다. 이것은 기본적으로 특정 도메인 객체를 식별하는 클래스가 아니라 유틸리티 또는 관리자 클래스입니다.

그러나 이것은 중요하지 않을 수 있습니다. 저장소 클래스는 일반적으로이 작업을 수행합니다. 그들은 개별 객체와 같은 객체의 콜렉션 모두를 다루는 메소드를 가지고있다. 소프트웨어 개발의 모든 것들과 마찬가지로,이 접근 방식을 취하는 여부는 사용자의 요구를 가장 잘 충족시키는 방식에 따라 결정됩니다.

클래스의 "모드"가 생성자가 호출되는 방식에 따라 변경되지 않은 경우 더 나은 디자인이 될 수 있습니다. 그건 꼭 필요 하진 않아; 여러 사람을 삭제하려면 사람 ID 집합을 매개 변수로 사용하는 일반적인 방법을 제공하면됩니다.

+0

그건 내 생각에 SRP를 깨뜨린 것입니다. +1. 그러나 atw13은 내 견해로는 MassDelete가 공유 함수 여야한다는 점에서 아래에 매우 좋은 점이 있습니다 (대량 삭제에 필요한 생성자가 없습니다). SRP를 깨뜨린다고 생각하십니까? – w0051977

+0

@ w0051977 : 그게 바로 "일반적인 방법"입니다. 리파지토리의 메소드는 일반적으로 정적이 아닙니다. 외부 상태를 만지지 않는 작업에 대해서만 정적 메서드 만 사용합니다. 하지만 정적 메서드는 아마도 이것에 대해 괜찮을 것입니다. –

+0

감사합니다. 따라서 MultipleDelete를 공유 메서드로 만들고 제로 arguement 생성자를 제거한 경우 SRP가 더 적합합니까? 이것이 당신의 해석에 달려 있다는 것을 알지만, 또 다른 관점을 얻는 것은 유용합니다. – w0051977

4

당신이 찾고있는 것은 대부분의 언어에서 "정적"방법으로 알려져 있지만 VB의 키워드가 "공유 됨"이라고 생각합니다. (용서해주세요 - VB에서 잘 모르겠지만 개념적 질문에 답하고 싶습니다.) 다중 삭제는 Person 객체를 인스턴스화 할 필요가 없습니다. 클래스의 한 인스턴스가 아니라 클래스에하는 일입니다 .

따라서 대량 삭제는 Person.MassDelete (...)와 같이 사용하는 "클래스 메소드"또는 "정적 메소드"여야합니다. 반면 단일 삭제는 단일 인스턴스에서 호출됩니다 , bob.delete().

+0

+1 합의, 대량 삭제는 '공용 공유 함수'여야합니다. 'Boolean'반환 –

+0

나는이 기능을 공유해야한다는 데 동의합니다. +1. 고마워. – w0051977

0

아마도 말합니다. PersonID가 null인지 여부에 따라 WHERE 절을 명령 문자열에 추가하면 이러한 경우를 단일 사례로 접을 수 있다고 생각합니다. 그렇다면 사람을 삭제하는 목적을 가진 PersonDeleter입니다.

어떻게 생성되는지에 따라 테이블의 가치를 없앨지를 결정하는 것에 대해 걱정하지만, 이는 별개의 관심사입니다.

+0

감사합니다. 그러나 "단일 사례"가 무슨 뜻인지 확신 할 수 없습니까? – w0051977