<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 首頁 新隨筆 聯(lián)系 聚合 管理
      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章 慎用繼承

    示例

      這是一個會議管理系統(tǒng)。用來管理各種各樣的會議參與者信息。數(shù)據(jù)庫里面有個表Participants,里面的每條記錄表示一個參會者。因為經(jīng)常會發(fā)生用戶誤刪掉某個參會者的信息。所以現(xiàn)在,用戶刪除時,并不會真的刪除那參會者的信息,而只是將該記錄的刪除標(biāo)記設(shè)為true。24小時以后,系統(tǒng)會自動將這條記錄刪除。但是在這24小時以內(nèi),如果用戶改變主意了,系統(tǒng)還可以將這條記錄還原,將刪除標(biāo)記設(shè)置為false。

      請認(rèn)真的讀下面的代碼:

    ??? 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的記錄。也就是,被刪除的那些參會者不被計算在內(nèi)。

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

    ??? 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"!因為最后一行調(diào)用的是DBTable里面的這個方法getCount,而不是ParticipantsInDB的countParticipants。getCount一點都不知道刪除標(biāo)記這回事,它只是簡單的計算記錄數(shù)量,并不知道要計算那些真正有效的參會者(就是刪除標(biāo)記為false的)。


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

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

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

    Feedback

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

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

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

    主站蜘蛛池模板: 无码中文字幕av免费放| 亚洲国产精品无码久久九九| 亚洲色丰满少妇高潮18p| 免费看国产一级片| 鲁丝片一区二区三区免费| 亚洲mv国产精品mv日本mv| 日韩中文字幕在线免费观看| 中文字幕在线免费看| 亚洲国产日产无码精品| xvideos亚洲永久网址| 99久久精品免费精品国产| 久久水蜜桃亚洲AV无码精品| 亚洲va久久久噜噜噜久久| 日本一区免费电影| 香蕉免费一区二区三区| 久久精品国产亚洲av天美18| 亚洲ⅴ国产v天堂a无码二区| 日本成人免费在线| 91在线老王精品免费播放| 污视频网站在线免费看| 亚洲人成电影院在线观看| 成人亚洲性情网站WWW在线观看| 免费H网站在线观看的| 成人自慰女黄网站免费大全| 亚洲人成自拍网站在线观看| 久久精品国产69国产精品亚洲 | 国产精品免费视频播放器| 鲁大师在线影院免费观看| 天堂亚洲免费视频| 亚洲中文字幕无码一去台湾 | 亚洲日本国产乱码va在线观看| 亚洲av午夜精品一区二区三区| 久久国内免费视频| 无码国产精品一区二区免费vr| 免费夜色污私人影院网站| 亚洲熟妇无码av另类vr影视| 4480yy私人影院亚洲| 亚洲乱码中文字幕久久孕妇黑人| 国产一区二区三区在线免费| 久久久久久久免费视频| 亚洲一区二区三区免费在线观看 |