国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

敏捷開(kāi)發(fā)技巧-消除代碼異味

2019-11-18 15:29:34
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

摘要:
本文通過(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)定的?

 



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 女性| 邹城市| 九龙坡区| 苏州市| 玉溪市| 石台县| 浦北县| 山阳县| 永寿县| 金沙县| 漳平市| 石阡县| 上饶市| 海兴县| 雷山县| 安福县| 高雄县| 漯河市| 邯郸县| 盐边县| 宜君县| 运城市| 枣庄市| 福泉市| 连城县| 固始县| 江口县| 英超| 海门市| 宣恩县| 黄平县| 小金县| 勐海县| 盐源县| 蓬安县| 武陟县| 左云县| 元江| 耒阳市| 灵寿县| 新宁县|