2010-04-27 112 views
0

我在VB.NET Windows窗体应用程序中有多个业务实体。现在,它们在应用程序启动时实例化并在需要时使用。他们掌握商业实体和存储和检索数据的方法的描述。长话短说,他们有点重的对象(他们有一些内部字典和对其他对象的引用)创建并保存在一个叫做“BLogic”的大全局变量中。创建许多新的实例与重用它们?

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

我是否应尽力减少新对象的创建或最大限度地减少静态和全局对象的数量?通常我想尽量减少每个变量的范围,但是我应该专门处理这些业务逻辑对象吗?

回答

2

让我们来看看你提出的两个方案:

单一的全球实例

优点:

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

缺点:所创建的对象,但从来没有使用过

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

每个功能情况

优点独特之处:

  • 每个函数获得它自己的拷贝,不不得不担心其他功能可能同时在做什么。
  • 如果对象没有经常被创建和销毁,那么您的程序的总内存使用量可能会更低。

缺点:

  • 根据需要多长时间来创建对象,你可以在用户界面的响应问题。
  • 根据创建对象的方式,您可能必须等待另一个函数完成创建对象,然后才能创建副本。

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

不要低估你的时间(现在和以后当你回来维修时)作为成本。有时候一个“更好”的解决方案实际上可能会更糟,因为它需要很长时间才能实现通常,“足够好”原来就足够好了。

+0

然后有实例池(即连接池),您作为实例的工厂,并根据设置获得新的或合并的设置。 – 2010-04-27 22:47:01

1

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

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

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