<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://m.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來保證邏輯的準備。  回復  更多評論
      

    主站蜘蛛池模板: 91大神在线免费观看| 两个人看的www免费高清| xxxx日本免费| 久草视频在线免费看| 亚洲色欲久久久综合网东京热| 亚洲精品无码久久久久久久| 亚洲真人无码永久在线观看| 在线看片无码永久免费视频| 亚洲人成www在线播放| 免费国产作爱视频网站| 中中文字幕亚洲无线码| 四虎成人免费大片在线| 国产天堂亚洲国产碰碰| 猫咪免费人成网站在线观看| 亚洲日韩中文字幕| 我想看一级毛片免费的| 午夜亚洲WWW湿好爽| 亚洲VA综合VA国产产VA中| 99精品免费视品| 亚洲一区二区影院| 中文无码日韩欧免费视频| 亚洲国产成人精品不卡青青草原| 老司机午夜在线视频免费观| 日韩精品亚洲专区在线观看| 在线观看片免费人成视频播放| 国产精品无码一区二区三区免费| 91亚洲自偷手机在线观看| 99久久久精品免费观看国产| 亚洲欧好州第一的日产suv| 久久永久免费人妻精品下载| 亚洲av无码片区一区二区三区| 久久久久成人精品免费播放动漫| 亚洲国产精品不卡毛片a在线| 亚洲熟女综合一区二区三区| 免费国产一级特黄久久| 久久免费精品视频| 亚洲另类无码专区丝袜| 亚洲午夜久久久久妓女影院 | 无码少妇一区二区浪潮免费| 亚洲午夜视频在线观看| 免费高清小黄站在线观看 |