【问题标题】:Is assigning an object to itself a good idea?给自己分配一个对象是个好主意吗?
【发布时间】:2013-02-08 15:40:46
【问题描述】:

我有两个类,RecordSet 和 Record。 RecordSet 有一个通用列表(记录)。

我可以通过调用我的 RecordSet.AddRecord(ObjRecord) 函数将对象添加到列表中,该函数返回 RecordSet。当列表计数为 200 时,进行一些处理并返回一个新的 RecordSet 对象,否则返回自身,应用程序可以继续将 Record 对象添加到列表中。

我担心在垃圾收集完成之前会有 200 个 RecordSet 对象。这是个好主意吗?

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.

【问题讨论】:

  • 这听起来像个糟糕的设计。
  • 您正在从 add 返回全新的空记录集,因此对旧记录集的引用正在丢失。存储某些东西并丢失密钥充其量相当于根本不存储它。更糟糕的是,浪费了代码、cpu 周期和系统内存。
  • 这似乎是一个更适合 Programmers.SE 或 codereview.SE 的问题

标签: asp.net vb.net garbage-collection


【解决方案1】:

首先,这确实是一种糟糕的做法,新人很难遵循代码并且是潜在的错误来源。与其每次都返回自己,不如改变你的设计。

把你的函数改成这样:

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 完全按照它所说的做了——它添加了一条新记录并修改了记录集。 ProcessTheRecords 按照它应该做的那样进行处理,如果您需要清除列表容器 - 好吧,只需清除它。

我强烈建议阅读这篇关于 Cohesion.

正如一个提议,AddRecord 可以是一个返回类型为Boolean 的函数,表示操作成功(也许处理函数会引发错误或异常?)。

现在干净多了,不是吗?

【讨论】:

    猜你喜欢
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2012-05-12
    • 1970-01-01
    • 2015-09-30
    • 2016-04-10
    • 2014-10-15
    相关资源
    最近更新 更多