需要代码度量。最佳代码中 h 文件中的 LOC 与 cpp 文件中的 LOC 的比率
Code metric required. Ratio of LOCs in h-files to LOCs in cpp-files in optimal code
我可以估计一下,在给定 h 文件中的 LOC 数量的情况下,最佳代码(桌面应用程序)中的 C++ LOC 数量是多少?
背景:
我正在进行一项工作量估算和一项将 C++ 软件移植到 C# 的计划。
我的第一个想法是创建一个基于 LOC 的粗略估计,并使用移植到剩余 LOC 的 LOC 来跟踪过程。假设移植速度为 200LOCs/天,我得出 1.5 人年。如果我把这个数字给客户,我肯定拿不到合同。
仔细查看代码后发现,代码效率很低,使用了很多C&P代码,实现了自己的容器-类,等等。
所以 C++ 的 LOC-Number 似乎没有反映实现相同功能的努力。现在我的假设是,头文件应该更好地反映功能。
没有。 header 文件的大小是关联代码文件大小的一个非常糟糕的代理。 header 只显示 API 的入口点,它可以根据 API 的要求隐藏尽可能多的东西。
换句话说,声明单个函数的 header 仅表示该实现文件中有一个 public 函数。实现文件中可以只有一个函数,也可以有数百个。它们都不是更好,任何一种开发方法都没有错。这只是意味着您不能使用 headers 来估算工作量。
对于 100k SLOC 程序,使用 SLOC 作为衡量标准会有些牵强,因为您将花费更多时间进行测试而不是开发。如果您有权访问应用程序的功能文档,请考虑改用 function points。据我所知,它们是周围较少损坏的启发式算法之一。
就开发而言,不要忘记您可以从 C# 调用 C++ 代码,并且 C++/CX 可以集成 C#。如果您可以增量重写或多或少的独立组件,这可以减轻一些移植痛苦。
头文件可能不是指标。
头文件通常包含函数声明 -- 关于如何调用函数的接口或说明。
源文件中的函数可以是零条语句,也可以是数百行代码。不能通过查看函数声明来判断函数中的语句数或行数。
许多 LOC 计数器包括头文件和源文件。
与 objective 不同,但出于好奇,我曾经使用 cloc
检查我的 LOC,以了解处于中间(pre alpha)阶段的项目。它没有很好的记录,并且它的一些地方编码有点脏或没有很好的计划。
C++ 100 2545 3252 11680
C/C++ Header 108 2847 12721 9077
C 4 1080 971 6298
CMake 33 241 161 1037
Bourne Shell 4 16 0 709
Python 8 90 72 423
CSS 1 63 21 422
PHP 5 23 21 295
Javascript 5 42 23 265
JSON 4 0 0 183
XML 1 11 171 72
make 1 13 0 15
Bourne Again Shell 2 10 0 14
如您所见,header LOC 与源 LOC 之间的比率为 0.777
。然而 average
不是一个好的衡量标准。但连同其他指标,例如评论线 可能会画出一些模糊的线来表示不同的参数和发展阶段。需要对众所周知的代码库进行更多研究才能得出好的启发式方法。
但是最后无论你采取什么措施,它都可以得出一个可能是错误的假设。
我可以估计一下,在给定 h 文件中的 LOC 数量的情况下,最佳代码(桌面应用程序)中的 C++ LOC 数量是多少?
背景: 我正在进行一项工作量估算和一项将 C++ 软件移植到 C# 的计划。
我的第一个想法是创建一个基于 LOC 的粗略估计,并使用移植到剩余 LOC 的 LOC 来跟踪过程。假设移植速度为 200LOCs/天,我得出 1.5 人年。如果我把这个数字给客户,我肯定拿不到合同。
仔细查看代码后发现,代码效率很低,使用了很多C&P代码,实现了自己的容器-类,等等。 所以 C++ 的 LOC-Number 似乎没有反映实现相同功能的努力。现在我的假设是,头文件应该更好地反映功能。
没有。 header 文件的大小是关联代码文件大小的一个非常糟糕的代理。 header 只显示 API 的入口点,它可以根据 API 的要求隐藏尽可能多的东西。
换句话说,声明单个函数的 header 仅表示该实现文件中有一个 public 函数。实现文件中可以只有一个函数,也可以有数百个。它们都不是更好,任何一种开发方法都没有错。这只是意味着您不能使用 headers 来估算工作量。
对于 100k SLOC 程序,使用 SLOC 作为衡量标准会有些牵强,因为您将花费更多时间进行测试而不是开发。如果您有权访问应用程序的功能文档,请考虑改用 function points。据我所知,它们是周围较少损坏的启发式算法之一。
就开发而言,不要忘记您可以从 C# 调用 C++ 代码,并且 C++/CX 可以集成 C#。如果您可以增量重写或多或少的独立组件,这可以减轻一些移植痛苦。
头文件可能不是指标。
头文件通常包含函数声明 -- 关于如何调用函数的接口或说明。
源文件中的函数可以是零条语句,也可以是数百行代码。不能通过查看函数声明来判断函数中的语句数或行数。
许多 LOC 计数器包括头文件和源文件。
与 objective 不同,但出于好奇,我曾经使用 cloc
检查我的 LOC,以了解处于中间(pre alpha)阶段的项目。它没有很好的记录,并且它的一些地方编码有点脏或没有很好的计划。
C++ 100 2545 3252 11680
C/C++ Header 108 2847 12721 9077
C 4 1080 971 6298
CMake 33 241 161 1037
Bourne Shell 4 16 0 709
Python 8 90 72 423
CSS 1 63 21 422
PHP 5 23 21 295
Javascript 5 42 23 265
JSON 4 0 0 183
XML 1 11 171 72
make 1 13 0 15
Bourne Again Shell 2 10 0 14
如您所见,header LOC 与源 LOC 之间的比率为 0.777
。然而 average
不是一个好的衡量标准。但连同其他指标,例如评论线 可能会画出一些模糊的线来表示不同的参数和发展阶段。需要对众所周知的代码库进行更多研究才能得出好的启发式方法。
但是最后无论你采取什么措施,它都可以得出一个可能是错误的假设。