?
http://www.tkk7.com/Files/Wingel/第3章%20除去代碼異味.rar??????????????? 第3章 除去代碼異味
??? 異味這個詞,可能有點抽象,我們先看一下下面的例子
??? 這是一個CAD系統. 現在,它已經可以畫三種形狀了:線條,長方形,跟圓.
先認真的看一下下面的代碼:
??? class Shape {??????????????????????????????????????????????????????????????????????????????????
?????? final static int TYPELINE = 0;??????????????????????????????????????????????????????????????
?????? final static int TYPERECTANGLE = 1;?????????????????????????????????????????????????????????
?????? final static int TYPECIRCLE = 2;????????????????????????????????????????????????????????????
?????? int shapeType;??????????????????????????????????????????????????????????????????????????????
?????? //線條的開始點
?????? //長方形左下角的點
?????? //圓心
?????? Point p1;???????????????????????????????????????????????????????????????????????????????????
?????? //線條的結束點
?????? //長方形的右上角的點
?????? //如果是圓的話,這個屬性不用
?????? 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:????????????????????????????????????????????????????????
????????????????????? //畫四條邊
????????????????????? graphics.drawLine(...);??????????????????????????????????????????????????????
????????????????????? graphics.drawLine(...);??????????????????????????????????????????????????????
????????????????????? graphics.drawLine(...);??????????????????????????????????????????????????????
????????????????????? graphics.drawLine(...);??????????????????????????????????????????????????????
????????????????????? break;???????????????????????????????????????????????????????????????????????
????????????????? case Shape.TYPECIRCLE:???????????????????????????????????????????????????????????
????????????????????? graphics.drawCircle(shapes[i].getP1(), shapes[i].getRadius());???????????????
????????????????????? break;???????????????????????????????????????????????????????????????????????
?????????????? }???????????????????????????????????????????????????????????????????????????????????
?????????? }???????????????????????????????????????????????????????????????????????????????????????
?????? }???????????????????????????????????????????????????????????????????????????????????????????
??? }??????????????????????????????????????????????????????????????????????????????????????????????
??? 代碼都是一直在改變的,而這也是上面的代碼會碰到的一個問題.
??? 現在我們有一個問題: 如果我們需要支持更多的形狀(比如三角形), 那么肯定要改動Shape這個類, CADApp里面的drawShapes這個方法也要改.
好,改為如下的樣子:
??
......
??? 如果我們想要支持更多的圖形(比如:三角形),上面沒有一個類需要修改。我們只需要創建一個新的類Triangle就行了。
具體的內容在上面的下載鏈接里面的pdf文件里,看pdf比較舒服。http://www.tkk7.com/Files/Wingel/第3章%20除去代碼異味.rar