在一种工作的应用程序中,我看到了这个可怕的代码:
class SomeUglyClass extends Thread {
ArrayList<SomeData> someDataStructure = new ArrayList<SomeData>();
Handler mHandler = new Handler() {
// a lot
// writing to someDataStructure
}
public void run() {
int some_count, ...;
while(true) {
// a lot
// r/w access to someDataStructure
try {
Thread.sleep(1, 0);
} catch (Exception e) {
break;
}
}
} // end of run(), total 500 lines of code
} // end of SomeUglyClass, total 4K lines of code也许您已经看到了这段代码的问题。如果没有,它们在这里:
mHandler附加到UI线程(因为它是由加载类的线程创建的,类是主线程)。someDataStructure并不是线程安全的,但是同步基本访问操作不会有帮助;在一个没完没了的循环中同步大块代码可能会阻塞受保护的资源,并使它对其他线程不可用;最后,它不仅是someDataStructure,整个类都基于这样的假设,即只有一个线程可以运行其代码。run()中的无穷无尽的循环,而Looper.loop();也是一个无限循环。一个线程不能运行两个无限循环。尽管这个宏伟的架构失败了,但代码确实在做一些事情,它不能立即重写,它是4K行代码,而且我常常只能猜测代码到底做了什么。
我要重建它。它应该是一系列保持功能的小步骤。
如何重构这段很棒的代码?
发布于 2015-01-26 10:00:46
发布于 2015-01-26 09:32:36
添加大量的测试,使用版本控制,然后以您需要的速度工作。
发布于 2015-01-27 11:41:38
第一步是改变:
public void run() {
int some_count, ...;
while(true) {
// a lot
// r/w access to someDataStructure
try {
Thread.sleep(1, 0);
} catch (Exception e) {
break;
}
}
}至:
@Override
public void run() {
Looper.prepare();
mHandler = new MyHandler();
mHandler.post(run_step);
Looper.loop();
}
Runnable run_step = new Runnable() {
int some_count, ...;
@Override
public void run()
{
//while(true) {
// a lot
// r/w access to someDataStructure
mIntoThreadHandler.postDelayed(this, 1);
//}
}
}这保留了功能,但仍然浪费CPU时间。紧急问题已经解决,问题已经解决,我不能把“必须重构以杀死可怕的代码”卖给我的管理人员,但我可以卖给“如果我重构就能更快地工作”,于是又开了一个新的单独的问题。啊!
没有机会出售“大量的测试”。
https://stackoverflow.com/questions/28147313
复制相似问题