大型系统的挑战

系统背景:1.c++100~150万行源代码。CS体系结构。CAE,CAM类型的桌面程序。
               2.历时4年×20人开发周期。
               3.产品开发,距发布还有1年。

重构背景:
当我负责重构整个系统的几何算法库的时候,发现我们系统里有一个用来表示几何二维点Point2d的类,用来表示Point2d几何相关的逻辑。 单纯几何逻辑不应该包括下面代码的name, attributes,2D几何点不应该包括z.
class Point2d
{
public double x;
public double y;
public double z;
public String name;
public Map<String, String> attributes;
}

随着时间的推移,越多的属性被添加进去,很明显点这个类承担了过多的职责。这个类被大量使用。在不同语境下有不同的物理含义,比如"标注点", 三维点,等等。
重构过程我认为是异常复杂的。
方案一:
将Point2d换个名字,用来表示混乱逻辑的2D点。新建一个纯几何意义的2D点。新的代码尽量使用新的数据结构。这样做的好处是隔离了系统继续耦合的趋势。但是,这种做法多了,会对系统的可理解性造成致命伤害。想象一下,你想用一个几何点的时候,你有多个选择是多么恐怖的场景。实际上,我们系统已经有了不同的三套几何算法库了,相当混乱。
方案二:
其实我是没有其他方案了,也许你会说分别修改所有引用点,根据使用,建立新的点类,最终去掉原有Point2d类多余的属性和职责。但是系统是巨大的(100~150万行),引用的地方怎样使用我单独去看,是看不明白的。另外,没有单元测试可以保证我的修改是正确的。先写所有单元测试也不是现实的,当然,我不太期望我重构时系统不会引入我误操作的Bug。

我想这个问题的解决方案应该不仅是技术上的,还应该从时间安排,重构的过程控制,团队的分工来思考。各位大虾,来点头脑风暴,发表自己的高见吧。

P.S.
1.上面代码为伪代码,实际系统是c++组成的。
2.将把您的建议实施,并反馈重构过程和结果。
重构进度
1.2011-01-11
过程:对name, attributes, z添加get,set函数。用时4个小时。
问题:由于系统重构中,原有功能有些不能用,所以部分人没有更新代码,他们新添加的代码有可能出错。
2.2011-01-12
过程:今天大家都提到了提取出纯几何意义的父类。其实这个想法和我的方案一应该是一个意思。弊端上面也描述了。
今天我打算先去掉一两个和三维点有关的函数,将其引用处改为三维点。

附上我们几何库的2D核心类图。

猜你喜欢

转载自piao-bo-yi.iteye.com/blog/865754