代码之家  ›  专栏  ›  技术社区  ›  Miroslav Zadravec

创建许多新实例,而不是重用它们?

  •  0
  • Miroslav Zadravec  · 技术社区  · 15 年前

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

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

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

    2 回复  |  直到 15 年前
        1
  •  2
  •   Gideon Engelberth    15 年前

    让我们来看一下您提供的两个选项:

    单个全局实例

    赞成的意见:

    • 由于对象已经创建,因此每个方法的性能成本更低
    • 不需要弄清楚如何传递数据

    欺骗:

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

    每个函数实例唯一

    赞成的意见:

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

    欺骗:

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

    这不是一个详尽的清单,但它确实指出了主要的权衡,因为我可以看到它们。很明显,你对情况了解得更多,也知道哪些折衷是可以接受的。一些明智选择的全局变量是有用的,但是像大多数人一样,我会尽量避免使用大量的全局变量,除非它们代表的是一些只能有一个的变量,如serialport,或者整个应用程序只能有一个的变量,如applicationsettings类。

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

        2
  •  1
  •   dthorpe    15 年前

    是的,您应该重构以仅在需要时分配对象,并在不再需要时处理它们。这总是一个好的设计选择,除非被具体的和可测量的性能要求击败。

    把分配推迟到绝对需要的好处是在许多国家(大多数?)在任何情况下,都不会分配对象。拖延是值得的!;>您的应用程序运行更精简,系统作为一个整体应该更轻松。没有人喜欢使用记忆工具。

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

    推荐文章