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

このクラスには2つの用途があります。

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の原則に違反しますか?このクラスには2つの目的があります。ゼロ引数コンストラクターが使用されている場合、PersonIDインスタンス変数は使用されません。

これを考えすぎたらさまよいます。

4

3 に答える 3

4

あなたが探しているのは、ほとんどの言語で「静的」メソッドとして知られている方法だと思いますが、VBのキーワードは「共有」だと思います。(許してください-私はVBに精通していませんが、概念的な質問に答えたいと思います。)複数削除では、Personオブジェクトをインスタンス化する必要はありません-これは、クラスの1つのインスタンスではなく、クラスに対して行うことです。 。

したがって、一括削除は「クラスメソッド」または「静的メソッド」である必要があります。これは、Person.MassDelete(...)のように使用しますが、単一の削除は単一のインスタンスbob.deleteで呼び出されます。 ()。

于 2013-03-25T21:44:30.473 に答える
3

はいと思います。SRPを壊します。

その理由は次のとおりです。クラスは、人と人の集まりの2つを表します。これは基本的に、特定のドメインオブジェクトを識別するクラスではなく、ユーティリティクラスまたはマネージャークラスです。

ただし、これは問題ではない場合があります。リポジトリクラスは通常、これを実行します。それらには、個々のオブジェクトと同じオブジェクトのコレクションの両方を操作するためのメソッドがあります。ソフトウェア開発のすべてのものと同様に、このアプローチを採用するかどうかは、ニーズに最適なものによって決まります。

コンストラクターの呼び出し方法に応じてクラスの「モード」が変更されない場合は、おそらくより良い設計になります。それは必要はありません; 複数の人を削除したい場合は、人のIDのコレクションをパラメーターとして受け取る通常のメソッドを提供するだけです。

于 2013-03-25T21:41:16.460 に答える
0

多分言う。PersonIDがnullであるかどうかに基づいて、コマンド文字列にWHERE句を追加すると、これらを1つのケースにまとめることができると思います。もしそうなら、これは人を削除するという1つの目的を持つPersonDeleterです。

このクラスが、テーブルの構築方法に基づいてテーブルの価値のあるデータを消去するかどうかを決定することを心配していますが、それは別の懸念事項です。

于 2013-03-25T21:45:20.023 に答える