【问题标题】:Optimization and testability at the same time - how to break up code into smaller units同时优化和可测试性——如何将代码分解成更小的单元
【发布时间】:2013-03-19 00:26:51
【问题描述】:

我试图分解一个长的“主”程序,以便能够对其进行修改,也可能对它进行单元测试。它使用了一些庞大的数据,所以我犹豫了:

什么是最好的:进行函数调用,传递可能非常大(内存方面)的数据,

(a) 按值,或

(b) 参考

(非常大,我的意思是一些结构和小类的向量的映射和向量......甚至图像......可能真的很大)

(c) 或者拥有所有功能都可以访问的私有数据?这也可能意味着 main_processing() 或其他东西可以拥有所有这些的向量,而某些函数将只有一个项目......具有函数可测试的优势。

虽然我的问题与优化有关,但我试图将这个怪物分解成小怪物,我也不想耗尽内存。

如果我创建局部变量,我不太清楚我将拥有多少个数据副本。

有人可以解释一下吗?

编辑:这不是通用的“如何将非常大的程序分解为类”。该程序是一个大型解决方案的一部分,该解决方案已经分解为多个小实体。

我正在查看的可执行文件虽然相当大,但它是一个具有不可分割数据的单一实体。因此,数据要么全部创建为我已经创建的单个类中的成员变量,要么(全部)作为函数的参数传递。

哪个更好?

【问题讨论】:

  • 这真的取决于。如果您的所有函数都可以分组到一个类中,那么类字段将是使数据可用于所有类函数的一种可接受的方式。否则,我会说非常大的数据几乎肯定应该通过 const 引用传递,假设数据本身没有在函数中修改。
  • 数据本身已被修改...因此,如果我可以将所有函数分组到类中,这与将它们全部放在“main”中一样吗?
  • 我认为这两种实现在速度或内存使用方面没有太大(如果有的话)差异。因为无论哪种方式,您都不会创建任何额外的数据副本,除非您按值传递(几乎可以肯定不应该使用大量数据)。
  • 谢谢。如果您想发布答案,我愿意接受。
  • C++11?你听说过移动语义吗?您可以编写代码,其中数据通过 move 传入并通过 move 返回,几乎没有开销。

标签: c++ class function optimization


【解决方案1】:

如果你想要单元测试,你不能“拥有所有函数都可以访问的私有数据”,因为那样的话,所有这些数据都将成为每个测试用例的一部分。

因此,您必须考虑每个函数,并准确定义它在数据的哪个部分起作用。至于函数参数和返回值,很简单:小对象传值,大对象传引用。

您可以对区分大小的阈值使用猜测值。我使用的规则是“8 小,任何东西都大”,但对我的系统有益的东西对你的系统不一定同样有益。

【讨论】:

    【解决方案2】:

    这似乎更像是一个关于 OOP 的一般性问题。将您的数据拆分为逻辑分组的概念(类),并将处理这些数据元素的代码与数据(成员函数)一起放置,然后通过组合、继承等将它们结合在一起。

    您的问题过于笼统,无法提供更具体的建议。

    【讨论】:

    • 我已添加到我的问题中,以使其更清楚。这不是一个“阅读这本书,然后创建几个课程”的问题。绝对没有办法将其分解为逻辑分组的概念,它已经被分解了。我已经根据功能提取了尽可能多的成员函数,而不必携带整个数据量。问题是:如果我制作传递整个数据的函数,我不会对性能产生太大影响吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 2012-08-24
    • 1970-01-01
    • 2014-07-24
    • 2018-07-02
    • 1970-01-01
    • 2013-04-16
    相关资源
    最近更新 更多