成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

代碼診所的第二次診斷

開發 開發工具
我之前的一個團隊開發人員的現狀是:沒有Clean Code的意識,不知道何謂TDD與重構,寫出來的Java代碼質量很糟。于是我當起了診治代碼疾病的醫生。這是當時我在項目上的第二次診斷。

[[186576]]

幾年前,我有機會負責一個項目的咨詢。團隊很小,目標是對舊有系統的后端用Java改寫,而團隊的開發人員全為C程序員。我的工作職責是負責項目設計、開發,以及擔任項目開發過程敏捷化的教練,并培養Java開發人員。

我在團隊工作室的墻角落,開了一個小小的診所,廣而告之——“每日一貼,包治百病”。這是當時我在項目上的第二次診斷。

1. 變量的聲明應盡量與使用放在一起

本規則與代碼的可讀性有關,倘若方法還沒有保持短小,這個問題就更要命。或許這是C語言開發者容易犯的毛病。當然也有許多Java程序員從前輩程序員處繼承了這一陋習。我曾經在一個遺留項目中看到過一個長達幾千行的Java方法,在方法頭部堆砌了數十個變量定義,讓人目不暇給!

除了影響代碼的可讀性之外,還可能導致隱藏的缺陷。很多程序員之所以習慣在一開始就聲明變量,就是將這種局部變量當做了存儲中間狀態的容器,在方法內部反復使用該變量,這種中間結果的變遷未必符合開發者意圖,又或者后來的代碼維護者沒有理清這種變化,從而做出變量值的誤判。

2. 對常量和枚舉的使用

本規則本不足道,寫在這里,為了進一步驚醒一下團隊成員。在咨詢過程中,我看到有這段代碼:

  1. Integer.parseInt(freeFlash, 16); 

這個16,究竟是什么鬼?Magic Number,很多時候會讓人感到困惑。

在JDK沒有提供枚舉之前,很多Java程序員喜歡使用接口類型來包裝一大堆常量。如果常量存在內聚的分類意義,還是使用枚舉為佳。

3. 進行合理封裝,避免方法調用順序錯誤

封裝是非常有必要的。有時候,暴露太多的細節會讓調用者感到無可適從。

對于TelnetService類,我們需要依序調用connect()、login()、enterUShell(),然后在執行命令后,必須依序執行exitUShell(),disconnect()。這讓我想起事務處理,FTP訪問等與資源有關的邏輯,都需要在執行邏輯前后包裹一些基礎設施的處理邏輯。為了避免在執行命令前后忘記連接或斷開telnet,***能將此過程封裝。

這是從調用安全性來考慮。

如果從調用的簡潔性考慮,封裝亦有必要。當我們需要通過TelnetService發送telnet命令時,為何還需要了解內部的執行邏輯呢?

那么,該如何封裝才能兩全其美,既滿足對執行邏輯順序的重用,又滿足對命令邏輯的擴展?

通常做法是將真正的執行邏輯提取為接口,如Java中Runnable的方式。這其實可以看作Command模式的運用。當然,我更愿意看做是對函數的封裝,例如Guva中的tranform()、filter()之類的方法,接受更具有函數氣質的Function或者Predicate接口(當時,Java 8還未問世呢)。

因此,我的做法如下:

  1. public class TelnetService { 
  2.     public T withCommand(ExecutionCommand<T> command) { 
  3.         connect(); 
  4.         login(); 
  5.         enterUShell(); 
  6.         T result = command.send(); 
  7.         exitUShell(); 
  8.         disconnect(); 
  9.         return result; 
  10.     } 

可以這樣調用:

  1. String result = telnetService.withCommand(new ExecutionCommand<String>() { 
  2.         @Override 
  3.         public String send() { 
  4.             return telnetService.transfer(); 
  5.         } 
  6.     } 
  7. ); 

4. 遵循異常處理的架構規則

團隊成員對異常極為陌生,面對java的受控異常、非受控異常,不知如何選擇;也不知道該何時捕獲異常,何時拋出異常。因而我針對該項目確定了異常處理的架構原則,其目的是為了讓整個架構變得更簡單,讓異常處理更加一致。

我的目的是減輕開發人員的負擔,但同時又不降低代碼質量,并利于未來對代碼的維護。規則如下:

  • 同層之間的調用不做try-catch,上層調用下層的對象,必須try-catch。即使對象拋出了異常,只要不是checked exception(我們盡量避免使用checked exception,以避免它對接口的污染),就無需考慮去捕獲這個異常。這樣的設計并不會導致異常泄露,因為我們要求在上一層捕獲。至于最頂端的Application Layer,則只做捕獲異常的事兒,不干拋異常的活兒。
  • 為各層(即領域層和基礎設施層)定義各自的異常超類。其中,領域層定義的異常要求提供Error Code。Error Code并非我所愿,但對于本系統的上游系統,卻需要該值,不得不為。
  • 領域層。若是結合實際情況由自己拋出異常,則只需考慮異常消息和錯誤碼;若是捕獲了異常再拋出,則在捕獲時記錄日志,再度拋出的異常需要包裹原始異常對象。

在代碼診所中診斷出來的疾病,可以作為代碼評審的一個標準,同時這些處方則可以當做團隊內部分享與交流的知識庫。長期累積下來,非常有利于團隊成員編碼能力的成長。

【本文為51CTO專欄作者“張逸”原創稿件,轉載請聯系原作者】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2011-08-05 12:36:01

2017-03-22 15:38:28

代碼架構Java

2010-05-28 10:50:44

JavaGoogleVMWare

2011-02-17 10:15:05

RSA 2011飛天誠信

2022-04-06 10:40:32

云原生容器微服務

2009-07-21 10:44:31

熊貓燒香李俊

2016-12-02 08:46:04

Gopro裁員科技新聞早報

2009-10-13 09:42:16

2018-03-16 08:22:01

區塊鏈API應用程序

2015-03-31 17:50:00

CIO

2009-12-30 17:43:50

NIIT軟件培訓

2022-02-15 13:57:36

勒索軟件贖金黑客

2009-03-31 08:14:42

Sun裁員重組

2016-11-23 15:31:16

聯盟 云計算

2015-11-16 19:18:27

Adobe數字化營銷

2013-07-09 09:29:23

大數據旅游業技術革命

2013-03-25 15:18:43

獵豹瀏覽器

2018-08-13 17:55:01

GPU

2018-09-21 11:11:34

備份離線自動

2020-03-12 15:20:14

網絡安全CISO信息安全
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美影院 | 最新黄色在线观看 | 成人免费视频在线观看 | 九九在线| 国产一区二区三区久久久久久久久 | 亚洲国产欧美国产综合一区 | 国产精品乱码一区二区三区 | 国产精品日韩欧美一区二区三区 | 欧美一区二区在线 | 欧美成视频 | 羞羞的视频在线观看 | 成人免费精品视频 | 97久久久| 91精品国产综合久久久亚洲 | 亚洲国产二区 | 欧美日韩国产在线 | 亚洲精品视频在线 | 国产精品2区 | 亚洲三区在线播放 | 久久久精品天堂 | 亚洲成人精品一区二区 | 国产一区二区高清在线 | 亚洲欧美在线观看 | 颜色网站在线观看 | 激情一区二区三区 | 国产三区av | 国产精品96久久久久久 | 91一区| 亚洲社区在线 | 欧美激情一区二区三级高清视频 | 亚洲精品一| 天天草天天干天天 | 四虎最新视频 | 日韩欧美中文字幕在线观看 | 亚洲欧美一区二区三区国产精品 | 亚洲综合无码一区二区 | 欧美电影在线观看网站 | 欧美一级大黄 | 亚洲视频在线看 | 99精品免费视频 | 在线观看亚洲专区 |