Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有涵盖变量范围的代码度量 试图了解一些遗留C++和C代码的困难,以及引入错误的风险,有人建议测量变量的范围或范围是有用的。代码使用了大量全局变量或范围广泛的变量,其中局部变量更好。常见的一种情况是,这些变量在声明它们的几个范围级别中用于2或3行代码_C#_Java_C++_Static Analysis_Metrics - Fatal编程技术网

C# 是否有涵盖变量范围的代码度量 试图了解一些遗留C++和C代码的困难,以及引入错误的风险,有人建议测量变量的范围或范围是有用的。代码使用了大量全局变量或范围广泛的变量,其中局部变量更好。常见的一种情况是,这些变量在声明它们的几个范围级别中用于2或3行代码

C# 是否有涵盖变量范围的代码度量 试图了解一些遗留C++和C代码的困难,以及引入错误的风险,有人建议测量变量的范围或范围是有用的。代码使用了大量全局变量或范围广泛的变量,其中局部变量更好。常见的一种情况是,这些变量在声明它们的几个范围级别中用于2或3行代码,c#,java,c++,static-analysis,metrics,C#,Java,C++,Static Analysis,Metrics,我知道静态代码分析工具通常试图量化耦合和内聚,但是否有更具体的度量变量/数据范围的方法?是的,这是静态分析的标准技术。这叫做变量活性分析。在介绍中,示例正在进行这样的分析 从《关于它的故事》中: 在编译理论中,活变量分析(或称活变量分析) 分析)是由编译器执行的经典数据流分析,用于 计算每个程序点可能存在的变量 在下一次写入之前读取,即,处于活动状态的变量 每个程序点的出口 简单地说:如果一个变量的值可能是 未来需要 我将集中讨论面向对象语言(Java、C#、C++)中的局部变量。我可以想到一些

我知道静态代码分析工具通常试图量化耦合和内聚,但是否有更具体的度量变量/数据范围的方法?

是的,这是静态分析的标准技术。这叫做变量活性分析。在介绍中,示例正在进行这样的分析

从《关于它的故事》中:

在编译理论中,活变量分析(或称活变量分析) 分析)是由编译器执行的经典数据流分析,用于 计算每个程序点可能存在的变量 在下一次写入之前读取,即,处于活动状态的变量 每个程序点的出口

简单地说:如果一个变量的值可能是 未来需要


我将集中讨论面向对象语言(Java、C#、C++)中的局部变量。我可以想到一些关于局部变量范围的度量

局部变量范围大小
是可访问局部变量的语句数。这不应该太大,因为这表明方法太长。然而,对于这一点,施工方案计数可能是一个更合适的测量方法

可访问的局部变量计数
方法的每个语句的可访问局部变量数。这不应该大于3,因为它使得在表达式中使用哪个局部变量变得更加困难

本地可变使用密度
是访问局部变量的语句与可访问局部变量的语句的百分比。低值表明该方法不太一致

局部变量计数的一致修改
是同一块中局部变量的修改次数。这表明多个局部变量属于同一个。因此,它们应该形成自己的对象,从而提高一致性。

您可以尝试使用CQLinq代码查询语言来检测仅由一个方法或一个类使用的一些全局变量

from f in Fields where f.IsGlobal && f.MethodsUsingMe.Count()==1 select f

我认为这是一个很好的测量方法,“将来可能需要”不一定是“将来使用”。简单示例:循环
inti的C样式;对于(i=0;i@ArneMertz:对于我所想的,可能“活性分析”是一个错误的术语,但由于它基于数据流分析,我相信在您的示例中,
I
将被评估为“死亡”在循环结束时,前提是在该点和第一次无条件写入
i
i
范围结束之间没有从
i
读取数据,以先到者为准。“可能需要”考虑在内(尽分析仪所能)变量的整个范围,而不仅仅是程序点之前的代码,在该程序点上它的活动性正在被评估……例如,如果循环后面的下一个语句是
put(“foo”);
,并且
i
已死亡,那么优化器知道它不需要在整个调用中保留
i
的值,并且可能因此可以节省一些指令和/或堆栈空间。这和寄存器分配是我最熟悉的活动性用法,我明白gefei的观点,它对这个问题很有用同样。在您的示例中,假设在循环
i
仅在循环内部活动(不在之前和之后)之后不使用它,这足以引发所需的提示以缩小其范围。也就是说,在另一个示例中,
int i=0;…;例如(;i<10;++i)
(其中…不使用
i
)仅根据上面的活动性定义就可以得出结论,
i
的范围可以缩小。您还必须检测到,
i
的初始化可以延迟到第一次读取时(当然,考虑到导致条件读取的分支,但本例没有这些分支).DFA通常也会这样做,但我不知道它是否被称为“活力”保持可访问的局部变量计数不大于3是很棘手的,你引用的所有三种语言都有标准的方法/函数,参数超过3个,因此不能用这个限制来实现。在C++中,一个参数是局部变量,我不知道别人说的是什么,但参数是什么。为了选择在给定表达式中应该使用的名称,最好是本地人。当然,这是一个崇高的目标,如果要求您查看设计,您可能会标记这些标准函数:危险:-)@SteveJessop我不是说它们是硬限制。但我必须承认我没有想到参数。所以我想5是一个更合适的值。我当然同意它值得记住。在实践中,我会看看我喜欢的函数和我讨厌的函数,并试图从中辨别出一个指导值。对于不同类型的组件,它可能会有所不同,因为有时您希望代码有点粗糙,而有时您希望让一切都非常简单。