1

私はこれを認めたくありませんが、VB.NET でのオブジェクト指向プログラミングは初めてです。問題なく動作する Subscriber.vb というクラス オブジェクトがありますが、これらのオブジェクトの「セット」またはリストを作成したいと考えています。「消費者」がこのサブスクライバーのリストをループできるように、次のコードを活用してサブスクライバーのリストを作成するのを手伝ってもらえますか? これが私がこれまでに持っているものです:

Public Class Subscriber
Public Sub New(ByVal theSubscriberID As Int32)
    Dim sConnDatabase As String = ConfigurationManager.ConnectionStrings("DatabaseConnString").ConnectionString
    Dim connection As New SqlConnection(sConnDatabase)
    Dim cmd As SqlCommand
Try
    cmd = New SqlCommand("GetSubscriberInfo_v", connection)
    cmd.CommandType = CommandType.StoredProcedure
    cmd.Parameters.AddWithValue("@SubscriberID", theSubscriberID)
    connection.Open()
    Dim objReader As SqlDataReader = cmd.ExecuteReader()

    Do While objReader.Read()
        SetObjectData(objReader)
    Loop
    objReader.Close()
    connection.Close()
Catch ex As Exception
    Throw
End Try
End Sub
Private Sub SetObjectData(ByVal theObjReader As SqlDataReader)
    Try
        Me._ID = Convert.ToInt32(theObjReader("SubscriberID"))
        Me._NameForLogon = theObjReader("SubscriberName").ToString()
        Me._NameInFull = theObjReader("SubscriberNameFull").ToString()
        Me._DaysUntilExpired = Convert.ToInt32(theObjReader("DaysUntilExpired"))
        Me._SignupDate = theObjReader("SignupDate")
        Me._ExpirationDate = theObjReader("ExpirationDate")
        Me._SubscriberPhone = theObjReader("SubscriberPhone").ToString()
        Me._MostRecentRenewal = theObjReader("MostRecentRenewal")
        Me._CumulativeRevenue = Convert.ToDecimal(theObjReader("CumulativeRevenue"))
        Me._NumberOfRenewals = theObjReader("NumberOfRenewals")
        Me._SubscriptionStatusCode = theObjReader("SubscriptionStatusCode")
        Me._SubscriptionStatus = theObjReader("SubscriptionStatus").ToString()
        Me._NotificationStatusCode = theObjReader("NotificationStatusCode")
        Me._NotificationStatus = theObjReader("NotificationStatus")
    Catch ex As Exception
        Throw
    End Try
End Sub
End Class

ゲッターとセッターは表示しませんでした。残念ながら、これは Visual Studio 2008 に限定する必要があります。いくつかの理由により、この環境をアップグレードできません。

ここでのベストプラクティスは何ですか?Public Class SubscriberList を Subscriber.vb ファイルに追加しますか、それとも別のファイルにする必要がありますか? さらに重要なことに、適切なリストを作成する方法に固執しています。次に、呼び出し元は SubscriberList オブジェクトのインスタンスを作成します。始めるのを手伝ってください。ありがとう。

編集:これがあなたのアイデアのおかげで私が思いついたものです(さまざまな方法でデータをフィルタリングするオーバーロードされたコンストラクターを追加することを考えています...それは良い習慣でしょうか?):

    Public Class SubscriberList
Public Sub New()
    Dim sConnDatabase As String = ConfigurationManager.ConnectionStrings("DatabaseConnString").ConnectionString
    Dim connection As New SqlConnection(sConnDatabase)
    Dim cmd As SqlCommand
    Dim oSubscriberList As New List(Of Subscriber)
    cmd = New SqlCommand("GetSubscriberInfo_v", connection)
    cmd.CommandType = CommandType.StoredProcedure
    connection.Open()
    Dim objReader As SqlDataReader = cmd.ExecuteReader()
    Do While objReader.Read()
        Dim id As Integer = objReader("SubscriberID")
        Dim s As Subscriber = New Subscriber(id)
        oSubscriberList.Add(s)
    Loop
    objReader.Close()
    connection.Close()
End Sub
End Class

使用しようとしている新しいエラー:

Dim allSubscribers As New SubscriberList
For Each Subscriber In allSubscribers
                       ' allSubscribers is not declared
Next

なぜ宣言しないのですか?戸惑う新人ミスきっと…

編集(番号2): 名前をSubscriberListからSubscribersの複数形に変更し、これを機能させました(以下を参照)-しかし、コンストラクターからデータベース接続とクエリを削除し、別のクラスに配置するというアドバイスに非常に困惑しています)。サブスクライバー (およびサブスクライバー) にオーバーロードされたコンストラクターを追加することを想像していました。それぞれのコンストラクターがそれぞれのデータを取得する方法を想像できません。

    Public Class Subscribers
    Implements IEnumerable(Of Subscriber)
#Region "properties"
    Public List As New List(Of Subscriber)
#End Region
Public Function GetEnumerator() As IEnumerator(Of Subscriber) _
                    Implements IEnumerable(Of Subscriber).GetEnumerator
    Return List.GetEnumerator()
End Function
Private Function GetEnumerator1() As IEnumerator _
                    Implements IEnumerable.GetEnumerator
    Return List.GetEnumerator()
End Function
Public Sub New()
    Dim sConnDatabase As String = ConfigurationManager.ConnectionStrings("DatabaseConnString").ConnectionString
    Dim connection As New SqlConnection(sConnDatabase)
    Dim cmd As SqlCommand
    cmd = New SqlCommand("SELECT * FROM dbo.Subscriber_v", connection)
    cmd.CommandType = CommandType.Text
    connection.Open()
    Dim objReader As SqlDataReader = cmd.ExecuteReader()
        Do While objReader.Read()
        Dim id As Integer = objReader("SubscriberID")
        Dim s As Subscriber = New Subscriber(id)
        List.Add(s)
    Loop
    objReader.Close()
    connection.Close()
End Sub
End Class
4

1 に答える 1

3

VB では、カスタム オブジェクトのリストを作成できます。

dim oSubscriberList as new List(of Subscriber)

次に、新しいサブスクライバーをインスタンス化してリストに追加できます

oSubscriberList.add('add object here')

これはおそらく、それを処理するための最も簡単で、迅速で汚い方法です。別のクラスを作成して、オブジェクトのコレクションを作成することもできます。SOLID プログラミングの原則に従い、テスト駆動開発を使用する場合の「ベスト」プラクティスは、それを処理するために別のコレクション クラスを作成することを示しますが、必須ではありません。

編集:以下のコメントに従って

Subscriberlist クラスを作成する必要はありません。サブスクライバーの通常のリストを作成し、リストに追加するだけです。このリストを作成したい場所 (フォームの読み込み、イベントなど) でこれを行います。

Dim oSubscriberList as NEW List(of Subscriber)

Dim sConnDatabase As String = ConfigurationManager.ConnectionStrings("DatabaseConnString").ConnectionString
Dim connection As New SqlConnection(sConnDatabase)
Dim cmd As SqlCommand
cmd = New SqlCommand("SELECT * FROM dbo.Subscriber_v", connection)
cmd.CommandType = CommandType.Text
connection.Open()
Dim objReader As SqlDataReader = cmd.ExecuteReader()

while objReader.Read()
    oSubscriberList.Add(New Subscriber(objReader("SubscriberID"))
end while

'additional cleanup steps here

次に、次のようにリストを反復処理できます。

For each sub as Subscriber in oSubscriberList
    'do something
Next
于 2013-08-23T21:01:28.250 に答える