您使用哪些工具和技术在.NET中查找死代码?
在过去,我使用Obsolete属性修饰方法(传递true,因此编译器将发出错误,如MSDN中所述).
我有兴趣看到其他人的建议(除了像FxCop或ReSharper这样的工具).我想确保我不会错过其他有用的工具.
我正在整理一些旧的代码,这些代码使用"幻数"来设置硬件寄存器,我想使用常量而不是这些数字来使代码更具表现力(实际上它们将映射到名称/用于记录寄存器的值).
但是,我担心随着变化的数量,我可能会打破神奇的数字.这是一个简化的例子(寄存器集更复杂):
const short mode0 = 0;
const short mode1 = 1;
const short mode2 = 2;
const short state0 = 0;
const short state1 = 4;
const short state2 = 8;
Run Code Online (Sandbox Code Playgroud)
而不是:
set_register(5);
Run Code Online (Sandbox Code Playgroud)
我们有:
set_register(state1|mode1);
Run Code Online (Sandbox Code Playgroud)
我正在寻找的是构建时间版本:
ASSERT(5==(state1|mode1));
Run Code Online (Sandbox Code Playgroud)
更新
@Christian,感谢快速响应,我对C/non-boost环境的答案感兴趣,因为这是驱动程序/内核代码.
一个是数学家.这已经遍布办公室,我们希望看到谁可以提出更好的优化版本.
(((a+p) <= b) && (a == 0 || a > 1) && (b >= p)) &&
((b - (a + p) == 0) || (b - (a + p) > 1))
Run Code Online (Sandbox Code Playgroud)
编辑:所有数据都是正整数
编辑:更好==为简单而重构
我继承了一个项目,其中类图非常像一盘意大利面上的蜘蛛网.在过去的两个月里,我写了大约300个单元测试,给自己一个覆盖主要可执行文件的安全网.
在任何特定时刻,我都可以访问我的敏捷开发书籍库:
问题是我触摸的一切似乎打破了别的东西.UI类混合了业务逻辑和数据库代码.许多类之间存在相互依赖关系.每次我改变任何其他课程时,都会有几个神课程.还有一个带有大约一半实例方法和半静态方法的突变单例/实用程序类(虽然具有讽刺意味的是静态方法依赖于实例而实例方法却没有).
我的前任甚至认为向后使用所有数据集会很聪明.每个数据库更新都作为存储过程中的参数直接发送到数据库服务器,然后手动刷新数据集,以便UI显示最新的更改.
我有时候会想到他们在处理代码之前会使用某种形式的弱混淆来保证工作安全或作为最后的告别.
是否有任何好的资源来解决这个烂摊子?我所拥有的书籍很有用,但似乎只涵盖了我遇到的一半场景.
我希望有人尝试解释这些之间的区别.更具体地说,示例使用场景.
我正在重构一些Windows窗体代码,并且Form在Form_Load()事件中有一些代码,并且在protected override void OnLoad()调用的事件中base.OnLoad(e); 我现在跟踪它并且首先触发Override,然后立即触发事件版本.
那么,通常使用哪一个?为什么?
我编写了以下代码,它使用光泽库获取了一堆点并在屏幕上绘制它们.
let s = blocks pes
pts = map (map mkPt) s {- stitches to points-}
lines = map Line pts {-points to lines -}
pict = Pictures lines {- lines to a picture -}
in do displayInWindow "My Window" (200, 200) (10, 10) white pict
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我发现有一个重复的模式:一个函数调用链,每个函数调用的结果进入下一个参数的最后一个参数.所以我通过删除中间变量,反转顺序并使用函数组合(".")链接函数来重构,如下所示:
let pict = Pictures . (map Line) . (map $ map $ mkPt) . blocks $ pes
in do displayInWindow "My Window" (200, 200) (10, 10) white pict
Run Code Online (Sandbox Code Playgroud)
令人高兴的是,这也很好.但是我想知道我是否会降低可读性,或者我是不是习惯于阅读和编写点免费样式代码.另外,我如何推理这段代码?第二个版本更有效率,还是仅仅更高效?有什么我可以风格化的做法让它更清晰吗?
我正在寻找可以集成到我的CI工作流程的东西.
我听说过dbdeploy但我正在寻找其他的东西.我不喜欢dbdeploy的原因是我不想在我的服务器上安装java.
我当然希望解决方案不涉及将一些shell脚本串在一起.
你是如何消除重复代码的狂热者?
就个人而言,每当我看到重复代码时,无论是在测试代码还是生产中,我都倾向于重复复制.我唯一的例外是这些:
我有以下代码:
void f(String t)
{
if(t.equals("a"))
{
someObject.setType(ObjectType.TYPE_A);
}
else if(t.equals("b"))
{
someObject.setType(ObjectType.TYPE_B);
}
// 50 more similar code
}
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法来重写if-else条件,以便没有那么多代码?
我最近的任务是维护一堆使用from module import *相当多的代码.
这个代码库变得足够大,以至于导入冲突/命名歧义/"这个功能来自何处,有八个导入的模块有一个同名的名字?!"ism变得越来越普遍.
继续前进,我一直在使用显式成员(即import module ... module.object.function()为了使维护工作更具可读性.
但我想知道:是否有一个IDE或实用程序可以强大地解析Python代码并重构*导入语句到模块导入语句中,然后将完整的模块路径预先添加到该模块成员的所有引用上?
我们没有大量使用元编程/反射/ inspect/ monkeypatching,所以如果上面的IDE/util在这些事情上表现不佳,那就没关系.
refactoring ×10
.net ×2
algorithm ×1
assert ×1
c ×1
c# ×1
coding-style ×1
database ×1
events ×1
haskell ×1
ide ×1
if-statement ×1
java ×1
legacy-code ×1
overriding ×1
pointfree ×1
python ×1
readability ×1
syntax ×1
winforms ×1