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

首頁 > 學院 > 開發設計 > 正文

敏捷開發的必要技巧:慎用繼承

2019-11-18 15:31:35
字體:
來源:轉載
供稿:網友
示例

  這是一個會議治理系統。用來治理各種各樣的會議參與者信息。數據庫里面有個表Participants,里面的每條記錄表示一個參會者。因為經常會發生用戶誤刪掉某個參會者的信息。
所以現在,用戶刪除時,并不會真的刪除那參會者的信息,而只是將該記錄的刪除標記設為true。24小時以后,系統會自動將這條記錄刪除。但是在這24小時以內,假如用戶改變主意了,系統還可以將這條記錄還原,將刪除標記設置為false。

  請認真的讀下面的代碼:

    
public class DBTable {                                                                         
       PRotected Connection conn;                                                                  
       protected tableName;                                                                        
       public DBTable(String tableName) {                                                          
           this.tableName = tableName;                                                            
           this.conn = ...;                                                                        
       }                                                                                          
       public void clear() {                                                                      
           PreparedStatement st = conn.prepareStatement("DELETE FROM "+tableName);                
           try {                                                                                  
               st.executeUpdate();                                                                
           }finally{                                                                              
               st.close();                                                                        
           }                                                                                      
       }                                                                                          
       public int getCount() {                                                                    
           PreparedStatement st = conn.prepareStatement("SELECT COUNT(*) FROM"+tableName); 
           try {                                                                                  
               ResultSet rs = st.executeQuery();                                                  
               rs.next();                                                                          
               return rs.getInt(1);                                                                
           }finally{                                                                              
               st.close();                                                                        
           }                                                                                      
       }                                                                                          
    }                              
    
    public class ParticipantsInDB extends DBTable {                                                
       public ParticipantsInDB() {                                                                
           super("participants");                                                                  
       }                                                                                          
       public void addParticipant(Participant part) {                                              
           ...                                                                                    
       }                                                                                          

       public void deleteParticipant(String participantId) {
           setDeleteFlag(participantId, true);
       }                      
       public void restoreParticipant(String participantId) {
           setDeleteFlag(participantId, false);
       }                      
       private void setDeleteFlag(String participantId, boolean b) {
           ...                
       }                      
       public void reallyDelete() {
           PreparedStatement st = conn.prepareStatement(
                             "DELETE FROM "+
                             tableName+
                             " WHERE deleteFlag=true");
           try {              
               st.executeUpdate();
           }finally{          
               st.close();    
           }                  
       }                      
       public int countParticipants() {
           PreparedStatement st = conn.prepareStatement(
                             "SELECT COUNT(*) FROM "+
                             tableName+
                             " WHERE deleteFlag=false");
           try {              
               ResultSet rs = st.executeQuery();
               rs.next();    
               return rs.getInt(1);
           }finally{          
               st.close();    
           }                  
       }                      
    }
                        

  注重到,countParticipants這個方法只計算那些deleteFlags為false的記錄。也就是,被刪除的那些參會者不被計算在內。

  上面的代碼看起來還不錯,但卻有一個很嚴重的問題。什么問題?先看看下面的代碼:

    ParticipantsInDB partsInDB = ...;
    Participant kent = new Participant(...);
    Participant paul = new Participant(...);
    partsInDB.clear();        
    partsInDB.addParticipant(kent);
    partsInDB.addParticipant(paul);
    partsInDB.deleteParticipant(kent.getId());
    System.out.println("There are "+partsInDB.getCount()+ "participants");



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 横山县| 商丘市| 广水市| 红河县| 荔波县| 德阳市| 军事| 遂宁市| 孟津县| 阿拉善左旗| 吉水县| 巫山县| 甘泉县| 玉田县| 陇西县| 剑川县| 仪陇县| 怀仁县| 八宿县| 玉山县| 比如县| 巩留县| 义马市| 廊坊市| 揭阳市| 达尔| 治县。| 武胜县| 随州市| 五河县| 安吉县| 来安县| 元氏县| 澎湖县| 丹凤县| 玉环县| 张家界市| 武乡县| 桃源县| 句容市| 瓮安县|