0

RecordSetとRecordの2つのクラスがあります。RecordSetにはGenericList(Of Record)があります。

RecordSetを返すRecordSet.AddRecord(ObjRecord)関数を呼び出すことで、オブジェクトをリストに追加できます。リストのカウントが200の場合、何らかの処理が行われ、新しいRecordSetオブジェクトが返されます。それ以外の場合は、それ自体が返され、アプリケーションはRecordオブジェクトをリストに追加し続けることができます。

私の懸念は、ガベージコレクションがスイープするまで、RecordSetのオブジェクトが200個あることです。これは良い考えですか?

Public Class RecordSet
  Private lstRecords As New List(Of Record)

  Public Function AddRecord(SomeVariable) AS RecordSet      
    lstRecords.Add(New Record())
    If lstRecords.Count = 200 Then
      Me.ProcessTheRecords()
      Return New RecordSet()
    Else
      Return Me
    End If
  End Function

  Private Sub ProcessTheRecords()
    'Do stuff in here
  End Sub

  Private Class Record
    Public Sub New()

    End Sub
  End Class
End Class

次に、私のアプリケーションで次のように呼び出します。

Dim objRecordSet AS New RecordSet
For Each VariableName In SomeList
  objRecordSet = objRecordSet.AddRecord(VariableName)
Next
'Process the remaining objects in objRecordSet here.
4

1 に答える 1

0

まず第一に、これは本当に悪い習慣です。新しい人のコードに従うのは難しく、潜在的なバグの原因です。毎回自分自身を返すのではなく、デザインを変更してください。

関数を次のように変更します。

Public Sub AddRecord(SomeVariable)
    lstRecords.Add(New Record()) <--- should't you be doing something with SomeVariable?!
    If lstRecords.Count = 200 Then
        Me.ProcessTheRecords()
    end if
End Function


Private Sub ProcessTheRecords()
   'Do stuff in here
   Me.lstRecords.clear()
End Sub

これで、AddRecordは、それが行うことを正確に実行します。つまり、新しいレコードを追加し、recordSetを変更します。ProcessTheRecordsは、想定どおりに処理を実行します。リストコンテナをクリアする必要がある場合は、それをクリアするだけです。

Cohesionに関するこのwiki記事を読むことを強くお勧めします 。

提案と同様に、AddRecordはBoolean、操作の成功を示すreturn typeの関数である可能性があります(処理関数によってエラーまたは例外が発生する可能性がありますか?)。

今はずっときれいですよね?

于 2013-02-08T21:52:25.750 に答える