创建许多新实例与重用它们?

时间:2010-04-27 16:01:38

标签: .net scope instance business-logic

我在VB.NET Windows Forms应用程序中有多个业务实体。现在,它们在应用程序启动时实例化,并在需要时使用。它们包含用于存储和检索数据的业务实体和方法的描述。简而言之,它们是一些有点繁重的对象(它们有一些内部词典和对其他对象的引用),它们被创建并保存在一个名为“BLogic”的大型全局变量中。

我应该重构这个,以便在需要时创建每个对象,并在超出范围时释放它们吗?然后UI上的每个事件都可能会创建一些这样的对象。

我是否应尽量减少新对象的创建或尽量减少静态和全局对象的数量?一般来说,我试图最小化每个变量的范围,但我应该特别对待这个业务逻辑对象吗?

2 个答案:

答案 0 :(得分:2)

让我们看看你提出的两个选项:

单一全局实例

优点:

  • 每个方法的性能成本较低,因为已经创建了对象
  • 无需弄清楚如何传递数据

缺点:

  • 创建对象但从未使用过的机会。这是对内存和性能的浪费。这可以通过使用延迟初始化来缓解,该初始化将在第一次使用时创建对象,但仍保留单个全局创建的实例。
  • 多线程问题,例如确保数据一致性(潜在性能和开发成本)

每个功能实例的唯一

优点:

  • 每个函数都有自己的副本,不必担心其他函数可能同时在做什么。
  • 如果没有不断创建和销毁对象,则可能会降低程序的总内存使用量。

缺点:

  • 根据创建对象所需的时间,您可能会在UI中出现响应问题。
  • 根据对象的创建方式,您可能需要等待其他功能才能完成创建对象,然后才能创建副本。

这并不是一个详尽的清单,但它确实指出了我可以看到的主要权衡。显然,你对这种情况了解得更多,可以接受哪些权衡。一些明智选择的全局变量可能是有用的,但是像大多数人一样,我会倾向于拥有大量的全局变量,除非它们代表的东西只有一个,比如SerialPort,或整个应用程序应该只有一个,就像ApplicationSettings类一样。

不要低估您的时间(现在和以后当您回来维修时)作为成本。有时候“更好”的解决方案可能实际上更糟糕,因为实施起来需要很长时间。通常“足够好”结果证明是足够好的。

答案 1 :(得分:1)

是的,您应该重构仅在需要时分配对象,并在不再需要时处置它们。除非特定和可测量的性能要求超越,否则这总是一个很好的设计选择。

在绝对需要之前延迟分配的优点是在许多(大多数?)情况下,对象永远不会被分配。拖延付出! ;>你的应用程序运行更精简,整个系统应该减税和更快捷。没有人喜欢使用记忆猪。

按需分配的缺点是它可能会引起用户反馈/响应性的延迟,这会令人恼火。如果你有一个相当的时间来构建或初始化(例如,通过网络加载数据)的对象,那么如果用户期望的话,这对于按钮点击分配可能不是很好的匹配是按钮点击后立即看到结果。如果您可以立即调出UI以响应按钮单击,但是新表单上的控件会尽快从网络数据中填充(并指示它们正在加载某些内容),这不是问题。 “相当长的时间”的一般用户界面指标通常是点击和用户界面响应之间的最大半秒。

相关问题