在试图了解一些遗留的C++和C#代码维护难度以及引入错误的风险时,有人建议测量变量作用域的广度或狭窄程度可能会很有用。 该代码使用了许多全局变量或广泛作用域的变量,而本地变量则更好。 常见情况是发现这些变量在声明它们的几个作用域级别之后,被用于2或3行代码。
我知道静态代码分析工具通常试图量化耦合和内聚性,但是否有更专门测量变量/数据范围的方法?
我知道静态代码分析工具通常试图量化耦合和内聚性,但是否有更专门测量变量/数据范围的方法?
int i; for (i=0; i<10; ++i) meow(i);
在此循环之后,i的值为10,这个值可能会被需要。然而,在大多数情况下,它是不需要/使用的。编译器会认为它是“活动的”,但如果我正确理解karm的话,他希望得到一个提示/警告,即i的作用域应该限制在for循环中:for (int i = 0; i<10; ++i) meow(i);
- Arne Mertzi
将被评估为"死亡"。"可能需要"考虑(分析器所能做到的最好)变量的整个作用域,而不仅仅是在评估其活性的程序点之前的代码。 - Steve Jessopputs("foo");
,并且i
已经失效,那么优化器知道它不需要在调用之间保留i
的值,并且可能会因此节省一些指令和/或堆栈空间。这和寄存器分配是我最熟悉的活跃度用途,我看到gefei的观点认为它对这个问题也很有用。在您的示例中,并假设它在循环后没有使用,i
仅在循环内部处于活跃状态(不在之前也不在之后),这足以引发所需的提示以减少其范围。 - Steve Jessopint i = 0; ...; for(;i < 10; ++i)
(其中...不使用i
)需要更多的活性定义才能得出结论,即i
可以缩小范围。您还必须检测i
的初始化可以尽可能地延迟到第一次读取它时(当然要考虑导致条件读取的分支,但是这个例子没有这些)。DFA通常也会这样做,但我不知道它是否被称为“活性”或其他名称。 - Steve Jessop你可以尝试CppDepend和它的CQLinq代码查询语言,来检测仅被单个方法或类使用的全局变量。
from f in Fields where f.IsGlobal && f.MethodsUsingMe.Count()==1 select f
我将集中讨论OO语言(Java、C#、C++)中的局部变量。我可以想到一些关于局部变量作用域的措施。
局部变量作用域大小
是局部变量可访问的语句数量。这个值不应该太大,因为这表示方法过长。然而,方法语句计数可能更适合用来衡量。
可访问局部变量计数
是每个方法语句可访问的局部变量数量。这个值不应该超过3,因为这会使在表达式中选择要使用的局部变量更加困难。
局部变量使用密度
是访问局部变量的语句占所有可访问局部变量语句的百分比。低值表示该方法不太连贯。
局部变量的连贯修改计数
是同一块内局部变量修改的次数。这表示多个局部变量属于同一组。因此,它们应该形成自己的对象,从而增加连贯性。