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

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

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

    瘋狂

    STANDING ON THE SHOULDERS OF GIANTS
    posts - 481, comments - 486, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    我是如何寫Service的

    Posted on 2010-10-01 17:08 瘋狂 閱讀(1326) 評(píng)論(0)  編輯  收藏 所屬分類: java


    文章轉(zhuǎn)載自:http://kiral.javaeye.com/blog/606348?page=2#comments 原文還包括精彩的討論。
    馬上要告別研發(fā)了,所以寫一些自己積累的經(jīng)驗(yàn),用來紀(jì)念4年的似水流年,本篇為第一張,用來介紹自己是如何寫Service的,當(dāng)然我總結(jié)的不一定合理,大家一起討論下。

     

    筆者認(rèn)為,Service及服務(wù)層,服務(wù)可以分為功能服務(wù)和業(yè)務(wù)服務(wù),功能服務(wù)不易改變,業(yè)務(wù)服務(wù)易改變。所以功能服務(wù)添加得多,修改的少,那么我們可以考慮不使用接口。而業(yè)務(wù)服務(wù),修改和更新都很頻繁,所以應(yīng)該提取接口,用不同的實(shí)現(xiàn)來屏蔽業(yè)務(wù)邏輯。

     

    1:使用斷言控制輸入。

    使用斷言來判斷有效的輸入,這樣能夠避免異常的擴(kuò)散,迅速定位錯(cuò)誤和減少BUG出現(xiàn)的幾率。

    如:

    Java代碼 復(fù)制代碼
    1. import org.springframework.util.Assert;  
    Java代碼 復(fù)制代碼
    1. private boolean addAttachment(Attachment att) {   
    2.   Assert.notNull(att, "att對(duì)象不能為空");   
    3. }  

    要學(xué)會(huì)靈活運(yùn)用斷言,不僅僅是用來斷言來判斷方法的輸入?yún)?shù)是否正確,還可以判斷業(yè)務(wù)邏輯,每次方法調(diào)用的輸入輸出,至于何時(shí)使用需要自己根據(jù)方法自我判斷。

     

    2:只拋出RumtimeException

    作為service層,自己不清楚調(diào)用方到底是誰,也不知道調(diào)用方如何使用自己的接口,那么自己寫出的接口最好是拋出RumtimeException,這樣調(diào)用方能夠處理這個(gè)異常或者覺得處理這個(gè)異常有必要的話,就進(jìn)行處理。如果使用Exception就得強(qiáng)制那些處理不了的調(diào)用方繼續(xù)向外拋出。拋出RumtimeException的時(shí)候需要在注釋里申明我拋出了該異常。

    Java代碼 復(fù)制代碼
    1. throw new RuntimeException("工作流初始化失敗!");  

     

    3:在Service層做事務(wù)處理

    大家都知道Service層一般是用來組合DAO,所以經(jīng)常出現(xiàn)需要事務(wù)處理的地方,筆者建議盡量在service層做事務(wù)處理。

    因?yàn)橐话銟I(yè)務(wù)邏輯都屏蔽在service層。筆者習(xí)慣使用Spring的手動(dòng)事務(wù)。

    Java代碼 復(fù)制代碼
    1. new TransactionTemplate(transactionManager).execute(new TransactionCallbackWithoutResult() {      
    2.             protected void doInTransactionWithoutResult(TransactionStatus status) {      
    3.                 //調(diào)用DAO按照ID刪除部門      
    4.             }      
    5. });     

     

     

    4:Service接口的異常處理

    對(duì)于程序異常,service能夠處理的自己處理(將異常封裝成自己的異常,再向外拋出也算一種處理),不能處理的繼續(xù)向外拋出。

    對(duì)于業(yè)務(wù)異常,以前開發(fā)的時(shí)候都會(huì)向外拋出一個(gè)用戶友好的運(yùn)行時(shí)異常,這種異常信息是能夠直接展現(xiàn)給用戶的,如“您添加的用戶名已經(jīng)存在!”,但是現(xiàn)在考慮到國(guó)際化,所以覺得Service的接口應(yīng)該拋出錯(cuò)誤代碼,定義一個(gè)友好錯(cuò)誤代碼運(yùn)行時(shí)異常,在程序出現(xiàn)條件錯(cuò)誤的時(shí)候拋出錯(cuò)誤代碼。錯(cuò)誤代碼可以定義一個(gè)枚舉類來實(shí)現(xiàn)。

    Java代碼 復(fù)制代碼
    1. /**  
    2.  * 錯(cuò)誤代碼定義  
    3.  *  
    4.  * @author fangtengfei  
    5.  * @date   2010-3-3  
    6.  */  
    7. public enum ErrorCode {   
    8.     /**  
    9.      * 用戶不能重復(fù)  
    10.      */  
    11.     User_Not_Repeat,   
    12.     /**  
    13.      * 用戶名太長(zhǎng)  
    14.      */  
    15.     User_Name_Too_Long   
    16. }  
    Java代碼 復(fù)制代碼
    1. 在Service里拋出:throw new FriendlyCodeRuntimeException(ErrorCode.User_Not_Repeat.toString());  

      

     

    5:必須記錄日志

      大家都知道,記錄日志的目的,主要是當(dāng)程序運(yùn)行在不同的環(huán)境下,使用日志來監(jiān)控程序的運(yùn)行,有些異常可能會(huì)特定的環(huán)境發(fā)生,而這種環(huán)境不容易被重現(xiàn),所以此時(shí)唯一能定位問題的途徑就只有日志。

    Service層會(huì)被各種調(diào)用方使用,特別是對(duì)外提供Service,環(huán)境更會(huì)前差萬別,如何迅速并有效的定位錯(cuò)誤變得尤其重要,所以必須記錄有效的日志。

    Java代碼 復(fù)制代碼
    1. logger.error("更新文檔出現(xiàn)出錯(cuò)", e);  

     

     6:寫有效的注釋

    之所以說寫有效的注釋,是因?yàn)橛袝r(shí)候,有些方法真的不需要寫注釋,如addUser,就不要在寫注釋“添加用戶”這樣的注釋。關(guān)鍵是寫有效的注釋,注釋的作用在于,調(diào)用方只看注釋而不看代碼就能知道如何使用接口,注釋應(yīng)該包括:輸入?yún)?shù)的注釋,輸出參數(shù)的注釋和異常的注釋。特別是List<Map>,Sting[]這樣的參數(shù)要嚴(yán)格說明,筆者認(rèn)為Service作為一個(gè)核心層,注釋必須非常詳細(xì)。另外直觀的方法名也能起到注釋的作用。

    Java代碼 復(fù)制代碼
    1. /**  
    2. * 批量添加文檔的附件   
    3.  
    4. * @param att 附件對(duì)象,附件名長(zhǎng)度為20,附件大小為10M  
    5. * @throws FriendlyCodeRuntimeException  
    6.  */  
    7. private void addAttachment(Attachment... attachment)  
    主站蜘蛛池模板: 四虎www免费人成| 在线看片无码永久免费视频| 黄色毛片视频免费| 伊人久久国产免费观看视频| 中文字幕在线免费观看视频| 精品一区二区三区免费观看 | 夜夜春亚洲嫩草影院| 亚洲国产成人片在线观看无码| 亚洲国产成人久久综合一| 亚洲制服丝袜中文字幕| 免费播放国产性色生活片| 毛片免费全部播放无码| 国产成人免费片在线观看| 国产亚洲人成无码网在线观看| 亚洲第一网站免费视频| 羞羞视频免费网站日本| 国产L精品国产亚洲区久久| 国产亚洲精品VA片在线播放| 在线观看免费黄色网址| 在线观看91精品国产不卡免费| 亚洲国产美国国产综合一区二区| 日韩免费人妻AV无码专区蜜桃 | 国产亚洲高清在线精品不卡| 午夜免费福利小电影| 免费观看国产小粉嫩喷水| 亚洲AV无码专区国产乱码电影| 日韩色视频一区二区三区亚洲| 最近中文字幕完整版免费高清| 中文字幕在亚洲第一在线| 日本系列1页亚洲系列| 国产91精品一区二区麻豆亚洲| 国产一级片免费看| 亚洲中文字幕久久精品无码APP | 亚洲精品无码不卡在线播放| 黄色一级毛片免费| 国产AV无码专区亚洲AV男同| 9久9久女女免费精品视频在线观看 | 在线播放免费人成视频网站| 久久久久亚洲av无码专区| 国产免费一区二区视频| 亚洲AV无码乱码麻豆精品国产|