精简自己20%的代码
持續(xù)重構(gòu),其樂無(wú)窮。
一:發(fā)現(xiàn)問題
先來(lái)說(shuō)如何重構(gòu)業(yè)務(wù)層的try{}catch{}finally{}代碼塊,我看過很多代碼,異常處理這一塊大致分為兩種情況,一種是每個(gè)方法都大量的充斥著try{}catch{}finally{},這種方式的編程已經(jīng)考慮到了異常處理,還有一種就是沒有try{}catch{}finally{}的代碼,因?yàn)楦揪蜎]有考慮代碼的異常處理。每當(dāng)我看到這樣的代碼,我都很憂傷。從程序的健壯性來(lái)看第一種還是要比第二種情況好,至少在編程意識(shí)中,隨時(shí)想到了異常情況,有一種基本的編程思想。
比如:一個(gè)業(yè)務(wù)單據(jù)的多表插入,關(guān)聯(lián)修改,虛擬刪除等都是一些基本的操作,但是又是比較容易引起錯(cuò)誤的操作,在這些方法上都會(huì)加上try{}catch{}finally{}對(duì)代碼進(jìn)行有效的防錯(cuò)處理。早期的代碼是這樣的。
public Boolean Save(AccountModel accountData) {Boolean result = false;try{//TODO ...result = true;}catch{}finally{ }return result; }public Boolean Edit(AccountModel accountData) {Boolean result = false;try{//TODO ...result = true;}catch{}finally{}return result; }public Boolean VirDelete(AccountModel accountData) {Boolean result = false;try{//TODO ...result = true;}catch{}finally{}return result; }僅僅定義了添加,修改,刪除幾個(gè)空方法,就寫了三四十行代碼,如果業(yè)務(wù)稍微復(fù)雜些,異常處理的代碼很快就會(huì)突破百行大關(guān)。雖然復(fù)制,粘貼try{}catch{}finally{}很好使,但是業(yè)務(wù)邏輯代碼大量充斥著這樣的try{}catch{}finally{}代碼,確實(shí)顯得做事不夠利落。
二:解決問題
那怎樣來(lái)解決這件棘手的事呢,首先定義一個(gè)公用的try{}catch{}finally{},如下如示:
public class Process {public static bool Execute(Action action){try{action.Invoke();return true;}catch (Exception ex){//1,異常隱藏//2,異常替換//3,異常封裝//寫日志return false;}finally{}} }上邊的代碼定義了公用的try{}catch{}finally{},最關(guān)鍵是怎么運(yùn)用起來(lái),如下代碼:
protected void Page_Load(object sender, EventArgs e) {AccountModel accountData = new AccountModel(); //準(zhǔn)備傳入的參數(shù)Boolean result = false; //接收返回的值Process.Execute(() => result = Save(accountData)); //執(zhí)行方法 }public Boolean Save(AccountModel accountData) {Boolean result = false;//TODO ...result = true;return result; }public Boolean Edit(AccountModel accountData) {Boolean result = false;//TODO ...result = true;return result; }public Boolean VirDelete(AccountModel accountData) {Boolean result = false;//TODO ...result = true;return result; }這樣的精簡(jiǎn)過的代碼,是不是感覺心情很舒暢。
三:提升與擴(kuò)展
? 對(duì)于知足者常樂的人來(lái)說(shuō),到第二個(gè)步驟就可以洗洗睡了。但是對(duì)于精益求精的人來(lái)說(shuō),問題仍然沒有完。我們來(lái)說(shuō)一個(gè)應(yīng)用場(chǎng)景,在WCF中的應(yīng)用,我們知道WCF服務(wù)端的異常,不經(jīng)過<serviceDebug includeExceptionDetailInFaults="true"/>的設(shè)置,服務(wù)端的異常是無(wú)法拋到客戶端的。但是在正式環(huán)境中,不可能對(duì)進(jìn)行serviceDebug的配置。正確的處理是在服務(wù)端對(duì)異常進(jìn)行隱藏,替換,或者封裝。
比如我們?cè)诜?wù)端捕獲了一個(gè)已知異常,但是這個(gè)異常會(huì)暴露一些敏感的信息,所以我們對(duì)異常進(jìn)行替換,拋出新的異常后,我們還要把這個(gè)異常怎樣傳輸給客戶端。首先們要明確WCF中的一些基本常識(shí),就是WCF中的數(shù)據(jù)傳遞要遵循WCF的數(shù)據(jù)契約,服務(wù)端拋到客戶端的異常(異常其實(shí)也是數(shù)據(jù)),所以必須要給異常定義異常契約。
[DataContract(Name = "WCFException")]public class WCFException{[DataMember(Name = "Type")]public String Type { get; set; }[DataMember(Name = "StackTrace")]public String StackTrace { get; set; }[DataMember(Name = "Message")]public String Message { get; set; }}然后處理異常的公共方法改寫為:
public static bool Execute(Action action) {try{action.Invoke();return true;}catch (Exception ex){//1,異常隱藏//2,異常替換//3,異常封裝//寫日志WCFException exception = new WCFException{Type = "Error",StackTrace = ex.StackTrace,Message = ex.Message};throw new FaultException<WCFException>(exception, new FaultReason("服務(wù)端異常:" + ex.Message), new FaultCode(ex.TargetSite.Name));}finally{} }這樣在服務(wù)端拋出的異常,就能在客戶端捕捉到。現(xiàn)在是不是感覺自己又提升了一些,想成為編程高手是指日可待了。
四:舉一反三
異常的處理也不過如此,那是不是應(yīng)該舉一反三,看看事務(wù)的處理應(yīng)該怎么辦?比如現(xiàn)在大量的訪求都用到了事務(wù),如下代碼:
public Boolean Save(AccountModel accountData) {OracleConnection conn = new OracleConnection("連接字符串");IDbTransaction trans = conn.BeginTransaction();Boolean result = false;try{//TODO ... trans.Commit();result = true;}catch{trans.Rollback();}finally{}return result; }特別是 trans.Commit(); ?trans.Rollback(); 這樣的代碼出現(xiàn)在每個(gè)與事務(wù)相關(guān)的方法中, 讓我感覺到代碼的臃腫,以及隱陷約約的失望。
經(jīng)過我?guī)滋斓姆嗁Y料終于實(shí)現(xiàn)了事務(wù)的公用訪求提取。使用方法如下代碼所示:
就是在一個(gè)方法上加[TransactionAttribute]就表示這個(gè)方法寫在了事務(wù)中,反之,不在事務(wù)中,加[ExceptionAttribute]就表示這個(gè)方法作了異常處理,反之,不作異常處理。通過反射或者AOP都能實(shí)現(xiàn)Attribute編程的效果。最后,還有什么疑惑,可以在評(píng)論中給我留言,當(dāng)然別忘記了下方的【推薦】。
from: http://www.cnblogs.com/xcj26/p/3442089.html
總結(jié)
以上是生活随笔為你收集整理的精简自己20%的代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机从业者的技术成长学习之路
- 下一篇: 关于HOG特征的一个Python代码