【问题标题】:Measuring code reusability衡量代码可重用性
【发布时间】:2010-07-06 07:53:14
【问题描述】:

我正在尝试衡量我们组织中生成的代码中有多少实际上是可重用的,我想制定一些指导方针。 我想对外部世界有一些参考:

在单个应用程序中通常重用多少代码? 更具体地说——如果我们考虑一个完整的最终用户产品的所有代码(并最终排除第 3 方库),有多少函数和方法是从多个地方调用的?

使用哪些指标来衡量代码的可重用性? 开源和/或闭源软件是否有可用的数字或研究?

【问题讨论】:

    标签: methodology metrics code-reuse


    【解决方案1】:

    在单个应用程序中通常重用多少代码?

    IMO 没有“典型”应用,尤其是在这方面。应用具有截然不同的架构和执行流程,从而导致不同的“重用”模式。

    考虑一个批处理数据处理应用程序,它以特定格式从文件中读取数据,将其转换为另一种格式,然后保存。它实际上只有一个执行路径,因此从多个位置调用的方法并不多。

    OTOH 考虑一个包含多个独立插件的插件框架,这些插件都使用相同的基础架构层,因此该层中的函数从许多不同的地方调用。

    你不能真的说第一个应用程序的设计比第二个应用程序的设计差(没有实际进入具体案例的细节)。

    另请注意,第二种情况下的指标很棘手:如果您只测量核心框架本身而没有插件,那么重用次数会很低,但使用实际插件时,重用次数会更高。由于插件可能是外部开发的,您甚至可能无法访问这些插件,因此您的指标会出现偏差。

    这导致了另一点:重用可以发生在许多层面上。您可以在应用程序内或应用程序之间重用代码。后者只能通过考虑所有相关应用来衡量。

    我认为更好的方法可能是从另一端开始,并搜索重复的代码(例如,使用 PMD 之类的工具来处理 Java 代码)。如果你在很多地方都有大量重复的代码,你需要重构。

    【讨论】:

    • 我知道所有这些障碍,但我仍然想做点什么,我需要一些参考。不同的模块可以分开分析。 (还没有尝试过)一个好的方法是调查每个函数的使用次数分布(我已经做过 - X 轴上的使用次数,Y 轴上使用 X 次的函数次数。)我假设是,对于不同的大型软件包,这些发行版将是相似的,因此应该可以与它们进行比较。作为一个简单的开始,我会感兴趣,有多少函数不会被多次调用。
    【解决方案2】:

    如果您将问题定义为“从多个地方调用了多少个函数”,您可以从技术上构建一个静态分析器来回答该问题;它只是构建调用图并进行一些计数的问题(有关从 C、Java 和 COBOL 中提取调用图的工具,请参阅this)。实际上,您可能会发现您愿意做更多的工作来直接回答这个问题。

    您可以考虑在您的代码库中运行clone detector。这将显示代码实际上已经被复制和粘贴的人重用(并且应该以某种方式抽象出来)并提供精确的指标。像这样复制代码是最直接和最常见的重用形式。

    我已经构建克隆检测器大约十年了。几乎我遇到的每个系统,无论是什么语言,都有 20% 的代码涉及克隆(--> 大约 10% 被重用)。我见过高达 55% 的例子。

    【讨论】:

      【解决方案3】:

      如果您在 .NET 平台上工作,请考虑使用 NDepend 为您提供有关您的软件的many metrics。 “代码重用”不能直接作为衡量标准(可能是因为其他发帖人已经提到的原因),但您可能也会对耦合和内聚之类的东西感兴趣。

      即使您不在 .net 上,metrics definitions 也可能会有所帮助。

      【讨论】:

        猜你喜欢
        • 2016-02-17
        • 2016-04-21
        • 1970-01-01
        • 2019-07-07
        • 2015-10-19
        • 2020-08-03
        • 2018-09-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多