我的代码很乱.不可否认,我自己写了一年 - 一年前.它没有得到很好的评论,但它也不是很复杂,所以我可以理解它 - 只是不足以知道从哪里开始重构它.
我违反了过去一年中我读过的所有规则.有些职责有多个职责,有间接访问(我忘记了这个术语 - 类似的东西foo.bar.doSomething()),就像我说的那样评论不好.最重要的是,它是游戏的开始,所以图形与数据耦合,或者我试图解耦图形和数据的地方,我制作数据public以便图形能够访问数据需要...
这是一个巨大的混乱!我从哪里开始?你会如何开始这样的事情?
我目前的方法是获取变量并将它们切换为私有,然后重构破坏的碎片,但这似乎不够.请建议其他策略来浏览这个烂摊子并把它变成干净的东西,以便我可以继续我离开的地方!
两天后更新:我一直在绘制类似UML的图表,并沿途捕捉一些"低挂水果".我甚至发现了一些代码是新功能的开始,但是当我试图减少一切时,我已经能够删除这些位并使项目感觉更清洁.在绑定我的测试用例之前,我可能会尽可能地进行重构(当然,只有那些100%肯定不影响功能的东西!),所以我不必重构测试用例.改变功能.(你认为我做得对吗,或者你认为,我更容易吸吮它并先写下测试吗?)
请投票选出最佳答案,以便我公平地标记!您也可以随意添加自己的答案,还有空间给您!我会再给它一天左右,然后可能将最高投票的答案标记为已接受.
感谢迄今为止做出回应的所有人!
2010年6月25日:我发现了一篇博文,它直接回答了那个似乎对编程有很好掌握的人的问题:(或者,如果你读了他的文章,可能不会:))
为此,当我需要重构代码时,我做了四件事:
- 确定代码的用途是什么
- 绘制所涉及的类的UML和动作图
- 四处寻找合适的设计模式
- 确定当前类和方法的更清晰的名称
1.关于PMD:
1.1如何设置PMD检查,忽略其中的一些,例如"变量名太短或太长","删除空构造函数等" - 如果我这样做,会出现另一个警告,说该类必须有一些静态的方法.基本上,这个课程是空的,以便以后开发,我现在想把它留下来.
1.2遵循此警告建议是否必要?
A class which only has private constructors should be final
Run Code Online (Sandbox Code Playgroud)
1.3那是什么意思?
The class 'Dog' has a Cyclomatic Complexity of 3 (Highest = 17)
Run Code Online (Sandbox Code Playgroud)
1.4这个怎么样?我很乐意改变这一点,但目前关于变化的事情并没有让我想到:
Assigning an Object to null is a code smell. Consider refactoring.
Run Code Online (Sandbox Code Playgroud)
2.关于FindBugs:
2.1写入静态字段是否真的那么糟糕,比它的声明要晚一些?以下代码给了我一个警告:
Main.appCalendar = Calendar.getInstance();
Main.appCalendar.setTimeInMillis(System.currentTimeMillis());
Run Code Online (Sandbox Code Playgroud)
哪里appCalendar是静态变量.
2.2此代码:
strLine = objBRdr.readLine().trim();
Run Code Online (Sandbox Code Playgroud)
发出警告:
Immediate dereference of the result of readLine()
Run Code Online (Sandbox Code Playgroud)
这里objBRdr是一个BufferedReader(FileReader).怎么会发生什么?readLine()可能是空的?代码嵌套在while (objBRdr.ready())测试中,到目前为止,我没有问题.
当我用以下代码替换代码时,Update1:2.2被修复了:
strLine = objBRdr.readLine();
if (strLine != null) { …Run Code Online (Sandbox Code Playgroud)