<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    That way I want to stay

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      55 Posts :: 1 Stories :: 41 Comments :: 0 Trackbacks

    下載地址 


    http://www.tkk7.com/Files/Wingel/第5章慎用繼承.rar

    http://wingel.javaeye.com/topics/download/81eb4c8a-e19f-48a3-bcf9-1256053a1d79

    下面是摘錄的片段:


    第5章 慎用繼承

    示例

      這是一個會議管理系統。用來管理各種各樣的會議參與者信息。數據庫里面有個表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");

      最后一行代碼,會打印出"There are 1 participants"這樣信息,對不?錯!它打印的是"There are 2 participants"!因為最后一行調用的是DBTable里面的這個方法getCount,而不是ParticipantsInDB的countParticipants。getCount一點都不知道刪除標記這回事,它只是簡單的計算記錄數量,并不知道要計算那些真正有效的參會者(就是刪除標記為false的)。


    繼承了一些不合適(或者沒用的)的功能

    具體的內容在上面的下載鏈接里面的pdf文件里,看pdf比較舒服。

    posted on 2006-11-29 20:40 Wingel 閱讀(1216) 評論(3)  編輯  收藏 所屬分類: 敏捷開發

    Feedback

    # re: (原創翻譯) 敏捷開發的必要技巧5:慎用繼承 2006-11-30 12:52 Dustin Tang[匿名]
    觀點是對的, 例子就沒有舉到點子上.  回復  更多評論
      

    # re: (原創翻譯) 敏捷開發的必要技巧5:慎用繼承 2006-11-30 16:40 someone
    繼承沒有借口干凈,但是也不是什么時候都不如接口。
    這個例子沒有說明什么問題,如果父類里面getCount方法并不實現,abstact或者拋異常的,強制在子類實現,就是非常合適的用法。  回復  更多評論
      

    # re: (原創翻譯) 敏捷開發的必要技巧5:慎用繼承 2006-12-01 09:14 Wingel
    我這章的觀點并不是表達繼承不好,我的意思是說,要謹慎的使用繼承。如果將這個方法定義成abstract的話,那就不叫繼承自這個方法,而應該叫實現這個方法了。如果父類中不實現這個方法絕對是惡心的代碼,拋異常的話,那你就必須有足夠的testcase來保證邏輯的準備。  回復  更多評論
      

    主站蜘蛛池模板: 久久精品亚洲福利| 日韩免费福利视频| 亚洲av日韩综合一区在线观看| 日韩一级免费视频| 亚洲国产成人精品无码区二本| 一本一道dvd在线观看免费视频 | 亚洲成电影在线观看青青| 久久免费线看线看| 国内免费高清在线观看| 亚洲高清无码综合性爱视频| 国产亚洲精品美女2020久久| 国产免费人成在线视频| 一级毛片免费播放试看60分钟| 亚洲w码欧洲s码免费| 亚洲成a人片在线观看中文app| 一边摸一边桶一边脱免费视频 | 中文字字幕在线高清免费电影| 动漫黄网站免费永久在线观看| 中文字幕亚洲乱码熟女一区二区| 亚洲不卡影院午夜在线观看| 免费无码精品黄AV电影| 国产亚洲一卡2卡3卡4卡新区 | 6080午夜一级毛片免费看6080夜福利| 国产真人无遮挡作爱免费视频| 亚洲高清无在码在线无弹窗| 丁香花在线观看免费观看| 久久久久亚洲精品美女| 18禁美女裸体免费网站| 国产精品亚洲成在人线| 67194熟妇在线永久免费观看| 亚洲人成网7777777国产| 国产天堂亚洲国产碰碰| 亚洲人色婷婷成人网站在线观看 | 日本黄色动图免费在线观看| 亚洲第一区视频在线观看| 日韩毛片无码永久免费看| 亚洲人成77777在线播放网站不卡| 午夜网站在线观看免费完整高清观看 | 国产91成人精品亚洲精品| 亚洲性日韩精品一区二区三区| 亚洲一线产区二线产区精华|