逝去的青春

          勇往直前

          2006年2月28日 #

          回調函數在Spring中的使用

          ?? 這是一種對單個方法的參數使用控制反轉,把控制權和差錯處理交給框架來處理。嚴格的說,這是一種Strategy模式的特例,他們的區別就在于接口的復雜度不同。
          ?? 在Spring的JdbcTemplate中就使用了這種模式。JdbcTemplate實現了query()方法,參數是SQL字符串,和一個實現了回調接口的,將在讀取resultSet每行時被調用。

          1 public ? interface ?RowCallbackHandler?
          2 {
          3 ???? void ?processRow(ResultSet?rs)? throws ?SQLException;
          4 }
          ?


          ? query()方法封裝了對JDBC底層API的調用。

          public ? void ?query(String?sql,?RowCallbackHandler?callbackHandler)? throws ?JdbcSqlException?
          {
          ????Connection?con?
          = ? null ;
          ????PreparedStatement?ps?
          = ? null ;
          ????ResultSet?rs?
          = ? null ;
          ????
          try ?
          ????
          {
          ????????con?
          = ? < code?to?get?connection >
          ????????ps?
          = ?con.prepareStatement?(sql);
          ????????rs?
          = ?ps.executeQuery();
          ????????
          while ?(rs.next())?
          ????????
          {
          ????????????callbackHandler.processRow(rs);
          ????????}

          ????????rs.close();
          ????????ps.close();
          ????}
          ?
          ????
          catch ?(SQLException?ex)?
          ????
          {
          ????????
          throw ? new ?JdbcSqlException( " Couldn't?run?query?[ " ? + ?sql? + ? " ] " ,?ex);
          ????}

          ????
          finally ?
          ????
          {
          ????????DataSourceUtils.closeConnectionIfNecessary(
          this .dataSource,?con);
          ????}

          }


          ?? 在上面的例子中,JdbcSqlException繼承了java.lang.RuntimeException,也就是說調用者可以選擇去捕獲它,但是這不是必須的。假如實現了回調接口的子類里的方法出錯,而且不是RuntimeException的子類,也就是必須捕獲的異常,但是query()方法中在邏輯上是沒有辦法捕獲它的。所以Rod_Johnson把接口定義成JdbcTemplate的inner interface。這就可以JdbcTemplate就可以捕獲它。
          ?? 回調方法也是框架的一種基本方法,比如java.io.File類中的listFiles(FilenameFilter filter),FilenameFilter就是一個接口,我們實現這個接口中的方法accept(File dir, String name) ,這就是一個典型的回調方法。
          ?? 觀察者模式的使用符合開閉原則,并且分離了關注點。這種對模塊修改開發,影響關閉的原則促進了AOP面向方面編程的發展。Spring中的AOP可能就是這種思想的實現,個人猜測而已。????
          ??? 把方法的參數放在一個類中,這樣以后要增加參數的話,不用修改方法簽名,感覺很干凈,唯一可能的缺點是可能對性能有所下降,不過很小。如果沒有用EJB的話,應該差不多。

          ?? 對異常的處理,分為checked和unchecked異常,checked異常是繼承java.lang.Exception的。Unchecked異常繼承java.lang.RuntimeException。Rod_Johnson主張在對出現異常后,程序不能處理,只能給予沒用的提示時用RuntimeException,因為RuntimeException容器會自動處理。關于異常的詳細說明,我也沒看明白,希望那位大蝦能指點指點。

          備注:本文主要內容來源于Rod_Johnson的大作,強烈建議看原版!

          posted @ 2006-03-30 21:57 逝去的年華 閱讀(1466) | 評論 (0)編輯 收藏

          Template模式和Strategey模式

          ?????????在學習Spring的過程中經常看到一些大蝦推薦閱讀Rod_Johnson的<Expert_One-on-One_J2EE_Design_and_Development>書,據說此書的第四章每個學java人都要看看.好不容易搞到pdf版,可惜是E文的,中文的搞不到,沒辦法只好硬著頭皮看下去。
          ???第四章主要講的是面向對象的設計模式,怎么采用一致的編碼公約,怎么利用也有的系統.這對于理解Spring框架有很大的幫助!因為這是Spring之父的編程思想。):
          ???關于接口的好處及組合模式的有點,我這里就不說了。
          ???Template模式:適用范圍,我們知道某個業務或算法的步驟,但是不知道怎么把每步的順序。Template模式采用在abstract類中有個Public and final的方法封裝了調用每步的順序,也就是說控制了工作流程。所有的繼承類也就只要實現每步的具體方法。這是控制反轉的一種表現,以前都是我們在程序中去調用API中的方法,現在是我們實現API某個類中的抽象方法給該類調用!這種控制反轉的機制,是框架的代碼基礎.比如,EJB中的Init()和destory()方法等等.Spring框架中的對數據持久層的實現就是很好的例子!
          下面把書中的例子COPY下:
          ? AbstractOrderEJB父類實現了商業邏輯,包括用戶是否金額超現和對大的訂單進行打折,palceOrder()方法就是那個工作流方法。

          abstract ? class ?AbstractOrderEJB
          {
          ????
          public ? final ?Invoice?placeOrder?( int ?customerId,?InvoiceItem[]?items)
          ????????
          throws ?NoSuchCustomerException,?SpendingLimitViolation?
          ????
          {
          ????????
          int ?total? = ? 0 ;
          ????????
          for ?( int ?i? = ? 0 ;?i? < ?items.?length;?i ++ )?
          ????????
          {
          ????????????total?
          += ?getItemPrice?(items?[i])? * ?items?[i]?.getQuantity();
          ????????}

          ????????
          if ?(total? > ?getSpendingLimit?(customerId)?)
          ????????
          {
          ????????????getSessionContext()?.setRollbackOnly();
          ????????????
          throw ? new ?SpendingLimitViolation?(total,?limit);
          ????????}

          ????????
          else ? if ?(total? > ?DISCOUNT_THRESHOLD)?
          ????????
          {
          ????????????
          // ?Apply?discount?to?total
          ????????}

          ????????
          int ?invoiceId? = ?placeOrder?(customerId,?total,?items);
          ????????
          return ? new ?InvoiceImpl?(iid,?total);
          ????}


          ????
          protected ? abstract ? int ?getItemPrice(InvoiceItem?item);

          ????
          protected ? abstract ? int ?getSpendingLimit(customerId) throws ?NoSuchCustomerException;

          ????
          protected ? abstract ? int ?placeOrder( int ?customerId,? int ?total,InvoiceItem[]?items);
          ??}

          ???getItemPrice,getSpendingLimit,placeOrder這三個方法,是protected and abstract的,由子類來實現。
          ?? Strategey模式和Template模式比較相似.用Strategey模式對上個例子進行改造:把三個單獨的方法放入一個接口中,工作流方法進行如下修改:

          ?1 public ? class ?OrderEJB
          ?2 {
          ?3 ???? private ?DataHelper?dataHelper;
          ?4 ???? public ? void ?setDataHelper?(DataHelper?newDataHelper)?
          ?5 ???? {
          ?6 ???????? this .dataHelper? = ?newDataHelper;
          ?7 ????}

          ?8 ???? public ? final ?Invoice?placeOrder?( int ?customerId,?InvoiceItem[]?items)
          ?9 ???????? throws ?NoSuchCustomerException,?SpendingLimitViolation?
          10 ???? {
          11 ???????? int ?total? = ? 0 ;
          12 ???????? for ?( int ?i? = ? 0 ;?i? < ?items.length;?i ++ )?
          13 ???????? {
          14 ????????????total? += ? this .dataHelper.getItemPrice(items[i])? *
          15 ????????????items[i].getQuantity();
          16 ????????}

          17 ???????? if ?(total? > ? this .dataHelper.getSpendingLimit(customerId))?
          18 ???????? {
          19 ????????????getSessionContext()?.setRollbackOnly();
          20 ???????????? throw ? new ?SpendingLimitViolation(total,?limit);
          21 ????????}
          ?
          22 ???????? else ? if ?(total? > ?DISCOUNT_THRESHOLD)?
          23 ???????? {
          24 ???????????? // ?Apply?discount?to?total
          25 ????????}

          26 ???????? int ?invoiceId? = ? this .dataHelper.placeOrder?(customerId,?total,?items);
          27 ???????? return ? new ?InvoiceImpl?(iid,?total);
          28 ????}

          29 }

          ???Stratery模式比Temlater模式復雜點,但是它具有更高的靈活性,對于實際項目一些流程的控制有很好的作用!這是本人的觀點,不一定正確,僅供參考。
          ???
          在下面的情況下,用Stratery模式比Temlater模式更好:
          1,每步都是可變的
          2,實現每步的類需要一個獨立的繼承體系
          3,實現每步的類要和其他的類打交道
          4,實現每步的類要實現多態性

          備注:本文主要內容來源于Rod_Johnson的大作,強烈建議看原版!

          posted @ 2006-03-29 20:49 逝去的年華 閱讀(1488) | 評論 (0)編輯 收藏

          程序員的個人發展

                這是我的blog的第一篇文章,轉載一段網上的經典文章,時刻檢查自己望這個方向努力。既然選擇了遠方,就要勇往直前!

          技術&管理&做人&行業

          每天晚上,請你問自己這些問題:
          1, 今天我是否克服了技術上新的困難?
          2, 今天我是否多讀了一些新書?
          3, 今天我是否就某方面的問題與人進行了交流?
          4, 今天我是否多認識了一個新同事或新朋友并準備與他們保持聯絡?
          5, 今天我是否更多的接觸到身處的行業需求,現狀,和發展?

          精通技術

                精通技術是技術人員的根本要求,也是技術人員人生發展的必經之路,只有首先精確掌握一門技術,才能觸類旁通的掌握其他技術。精通技術不僅僅是為了精通技術,而是為了觸類旁通,為了掌握精通技術的學習方法,研究方法,體會身處技術頂點的感受和境界,這樣,下一次準備或需要進入另一個領域時,才會有明確的目標。

                為了精通技術,就要有以工作為樂的精神。不主張過于頻繁的換工作(常常被認為是不熱愛工作,不適應環境,或者不忠誠的表現)。以工作為樂,才會投入更多的精力和時間,才能夠飛快成長,成為該方面的能手。以工作為樂,是朝著技術高峰闊步邁進的享受過程。

                如果僅僅的是以工作為樂,僅僅號稱自己喜歡工作,而沒有“朝著技術高峰闊步邁進”,則是一種浪費。要做工作和生活的有心人,才不會迷信技術,才會避免驕傲,才不會在達到某個水平以后停步不前。不僅要做有心人,還要學會研究。研究該門技術的發展方向,該門技術最好的學習方法,在該門技術上取得突出成就的道路,和激勵自己沿著正確的方向前進的訣竅。做好了這些問題的研究,就會在以工作為樂的境界中做出超凡的成績。

          總之,
          1, 反對不認真對待技術。
          2, 反對不熱愛工作,一心旁鶩。
          3, 做生活和工作的有心人。

          懂得管理

                懂得管理,既要學會管理,也要學會配合管理。那些對所有人和所有事情都吹毛求疵的人是不適應社會的,也是不容易成功的。懂得管理,既要學會管理工程(進度,過程,資源,需求分析,客戶交流),又要學會管理人。要重視團隊建設,重視團隊的合作,重視團隊的文化建設,重視團隊的凝聚力,重視管理者的個人感染力。

                在用戶不能提出明確的需求的情況下,要綜合經驗,替用戶提出明確的需求。

                符合標準的過程控制,方法論的實際應用可以引導工程有一個可期望的好結果。否則就是運氣的功勞。
                資源的合理配置,建設一個每個人舒適工作的環境,不要讓你的組員不得不總是把精力放在環境建設等問題上,是讓人做出更大成績的捷徑。

                與人暢快交流的能力,成為軟件人員必備的素質之一。懂得行業的知識就從這里開始。

                那些單純學過管理的人,無論進入那一個行業,都需要不斷的迅速的學習一些關于該行業的專門知識,至少是名詞術語,基本原理,關鍵技術,主要應用。這樣的了解初步管理知識的人,一定不要對技術人員指手畫腳,否則一定得不到應有的認同,反之,如果他們從過程本身的流程或者方法論等方面提出建議,就可以更好的體現自己的價值。

          進入行業

                軟件工作,離不開行業,尤其是應用軟件。一個僅僅懂得實現技術的人,是不夠的。所以一定要拓展你的知識,對你所處在的行業有一個更全面,更準確,更實質性的了解。

                軟件人員看到需求分析,常常想到如何去實現它,而不會認真的去研究這份需求,站在用戶的角度上來做更多的工作,這是值得軟件人才所注意的。

                研究你所在的行業,也需要有一種系統的方法。了解其中的關鍵點是進入這個行業的捷徑。了解觸及該行業更多方面的關鍵點,是掌握這個行業的必經之路。對該行業做系統的總結分析,是深入該行業的目的。初步的研究成果經過更多的提煉和交流,就會成為金子般的智慧。

          以下是幾點建議:

                從點滴做起。先做好那些你力所能及的工作。標準化你的行業。你所處的行業雖然確定,但是每一家公司的需求各不相同。掌握他們做事情的流程,可以幫助你做好標準化。同時學習那些該行業的標準,以用戶的標準為標準,更加深刻的理解標準,是代替用戶做好標準化的方法。
                掌握核心技術。任何行業都有核心技術。掌握某一項核心技術,就可以讓你進入這個行業并在其中生存,反之僅僅淺嘗輒止,就會讓你遭遇失敗,抱怨不公。

          影響你職業發展的幾項能力
          1, 研究問題的能力
          2, 影響他人的能力
          3, 個人履歷

          請相信以下觀念
          1,教育不是萬能的。希望學校或者任何一個教育機構為你準備所有的知識,能力,水平,是不可能的。最好的大學是自己和無字書。
          2, 成長在工作中。工作中的表現和積累才是人生騰飛的實際動力。

          從今天起,請做好
          1, 培養你自己更廣泛的興趣,并堅持你的人生目標
          2, 鍛煉你的演講能力
          3, 多認識朋友,以他們為榮
          4, 培養你的遠見卓識


          處處深入學習,跟蹤技術頂峰!追求技術頂峰!!

          轉載自:http://gocom.primeton.com/blog/index.php?op=ViewArticle&articleId=15&blogId=9

          posted @ 2006-02-28 22:30 逝去的年華 閱讀(297) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 北海市| 淮北市| 德昌县| 赣榆县| 屏南县| 盈江县| 普兰店市| 特克斯县| 冷水江市| 乌鲁木齐市| 萝北县| 赤峰市| 进贤县| 湘潭市| 民丰县| 通榆县| 云霄县| 兴安盟| 扶余县| 扎囊县| 儋州市| 郑州市| 方山县| 梁平县| 洪江市| 视频| 唐海县| 靖边县| 湖口县| 商南县| 陈巴尔虎旗| 民和| 仁化县| 乌什县| 乌拉特前旗| 新蔡县| 永胜县| 福海县| 城市| 博客| 精河县|