摘要:
本文通過(guò)簡(jiǎn)單通俗的例子, 告訴我們?nèi)绾闻卸ùa的穩(wěn)定性和代碼中的異類, 并且如何重構(gòu)此類代碼.
異味這個(gè)詞,可能有點(diǎn)抽象,我們先看一下下面的例子
這是一個(gè)CAD系統(tǒng). 現(xiàn)在,它已經(jīng)可以畫(huà)三種外形了:線條,長(zhǎng)方形,跟圓.先認(rèn)真的看一下下面的代碼:
class Shape {
final static int TYPELINE = 0;
final static int TYPERECTANGLE = 1;
final static int TYPECIRCLE = 2;
int shapeType;
//線條的開(kāi)始點(diǎn)
//長(zhǎng)方形左下角的點(diǎn)
//圓心
Point p1;
//線條的結(jié)束點(diǎn)
//長(zhǎng)方形的右上角的點(diǎn)
//假如是圓的話,這個(gè)屬性不用
Point p2;
int radius;
}
class CADApp {
void drawShapes(Graphics graphics, Shape shapes[]) {
for (int i = 0; i < shapes.length; i++) {
switch (shapes[i].getType()) {
case Shape.TYPELINE:
graphics.drawLine(shapes[i].getP1(), shapes[i].getP2());
break;
case Shape.TYPERECTANGLE:
//畫(huà)四條邊
graphics.drawLine(...);
graphics.drawLine(...);
graphics.drawLine(...);
graphics.drawLine(...);
break;
case Shape.TYPECIRCLE:
graphics.drawCircle(shapes[i].getP1(), shapes[i].getRadius());
break;
}
}
}
}
代碼都是一直在改變的,而這也是上面的代碼會(huì)碰到的一個(gè)問(wèn)題.
現(xiàn)在我們有一個(gè)問(wèn)題: 假如我們需要支持更多的外形(比如三角形), 那么肯定要改動(dòng)Shape這個(gè)類, CADApp里面的drawShapes這個(gè)方法也要改.
好,改為如下的樣子:
class Shape {
final static int TYPELINE = 0;
final static int TYPERECTANGLE = 1;
final static int TYPECIRCLE = 2;
final static int TYPETRIANGLE = 3;
int shapeType;
Point p1;
Point p2;
//三角形的第三個(gè)點(diǎn).
Point p3;
int radius;
}
class CADApp {
void drawShapes(Graphics graphics, Shape shapes[]) {
for (int i = 0; i < shapes.length; i++) {
switch (shapes[i].getType()) {
case Shape.TYPELINE:
graphics.drawLine(shapes[i].getP1(), shapes[i].getP2());
break;
case Shape.TYPERECTANGLE:
//畫(huà)四條邊.
graphics.drawLine(...);
graphics.drawLine(...);
graphics.drawLine(...);
graphics.drawLine(...);
break;
case Shape.TYPECIRCLE:
graphics.drawCircle(shapes[i].getP1(), shapes[i].getRadius());
break;
case Shape.TYPETRIANGLE:
graphics.drawLine(shapes[i].getP1(), shapes[i].getP2());
graphics.drawLine(shapes[i].getP2(), shapes[i].getP3());
graphics.drawLine(shapes[i].getP3(), shapes[i].getP1());
break;
}
}
}
}
假如以后要支持更多的外形,這些類又要改動(dòng)……,這可不是什么好事情!
理想情況下,我們希望當(dāng)一個(gè)類,一個(gè)方法或其他的代碼設(shè)計(jì)完以后,就不用再做修改了。它們應(yīng)該穩(wěn)定到不用修改就可以重用。
現(xiàn)在的情況恰好相反!
每當(dāng)我們?cè)黾有碌耐庑危嫉眯薷腟hape這個(gè)類,跟CADApp里面的drawShapes方法。
怎么讓代碼穩(wěn)定(也就是無(wú)需修改)?這個(gè)問(wèn)題是個(gè)好問(wèn)題!不過(guò)老規(guī)矩,先不說(shuō),我們以行動(dòng)回答。
我們先看看另外一個(gè)方法: 當(dāng)給你一段代碼,你怎么知道它是穩(wěn)定的?
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注