【问题标题】:Creating many new instances vs reusing them?创建许多新实例与重用它们?
【发布时间】:2011-02-12 22:46:35
【问题描述】:

我在 VB.NET Windows 窗体应用程序中有多个业务实体。现在它们在应用程序启动时被实例化并在需要时使用。它们包含业务实体的描述以及用于存储和检索数据的方法。长话短说,它们是一些需要构造的重对象(它们有一些内部字典和对其他对象的引用),它们被创建并保存在一个名为“BLogic”的大全局变量中。

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

我应该尽量减少新对象的创建,还是尽量减少静态和全局对象的数量?通常我会尽量减少每个变量的范围,但我应该特别对待这个业务逻辑对象吗?

【问题讨论】:

    标签: .net scope instance business-logic


    【解决方案1】:

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

    单个全局实例

    优点:

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

    缺点:

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

    每个函数实例唯一

    优点:

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

    缺点:

    • 根据创建对象所需的时间,您可能会在 UI 中遇到响应问题。
    • 根据对象的创建方式,您可能必须等待另一个函数完成对象的创建,然后才能创建副本。

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

    不要低估您的时间成本(无论是现在还是以后回来进行维护时)。有时,“更好”的解决方案实际上可能更糟,因为实施时间太长。通常“足够好”结果证明是,嗯,足够好。

    【讨论】:

    • 然后是实例池(即连接池),您可以在其中作为实例的工厂,根据设置,您可以获得一个新的或池化的。
    【解决方案2】:

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

    将分配推迟到绝对需要的好处是,在许多(大多数?)情况下,对象永远不会被分配。拖延是有代价的! ;> 你的应用程序运行得更精简,整个系统应该更少的税收和更快捷。没有人喜欢使用内存猪。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多