你的程式碼有重複嗎?
【編者按】本文作者為來自 SoftwareYoga.com 的軟體架構師、敏捷與 DevOps 開發流程踐行者 Deepak Karanth,文章主要介紹了 DRY 原則的諸多優點。
本文系國內 ITOM 管理平臺 OneAPM 編譯呈現。以下為正文:
“避免重複程式碼”(DRY) 是軟體發展的一項原則,其主旨是減少程式碼重複現象。
“所有內容寫兩遍”(WET) 則是上述原則的反義縮寫,意指不遵守 DRY 原則的程式碼。
開發人員應當以其中哪個原則為目標本應是顯而易見的。但是,也許這個時候已經有人開始拿出證據來證明我是錯的。
在本文中,我們會逐一討論編寫程式碼時遵循 DRY 原則的好處。首先,我們先舉一個簡單的例子來說明 DRY 原則的基本優勢。
DRY 原則 - 簡單例子
假設你的程式碼中有很多地方需要根據當前使用者的角色來執行。比如:只有編輯或管理員才可以執行 createPage()
函式,只有管理員才可執行 deletePage()
函式。
在creatPage(建立頁面)和 deletePage(刪除頁面)函式檢查使用者的角色時,我們可以使用下面這個 isPermitted() 單一函式,而不是分別開展使用者角色檢查的邏輯。
//get the current Subject
Subject currentUser = context.getSubject();
if (isPermitted(currentUser)) {
//allow execution of deletePage}
else {
//block execution
}
將 isPermitted() 的邏輯固定在一個地方,就可以避免重複,同時反覆利用程式碼。另外一個優勢就是邏輯的獨立性,即 createPage() 和 deletePage() 無需知道如何檢查許可權。
當然,DIY 原則的優勢遠不止這樣。
DRY 原則的優勢
可維護性
DRY 原則的最大優勢是可維護性。如果檢查許可權的邏輯在整段程式碼中重複很多次,在重複程式碼中出現的問題將很難修復。修復一段程式碼中的某個問題後,很容易忘記修復其他重複程式碼中同樣存在的問題。同樣,如果需要修改邏輯,就得四處複製貼上。如果使用不重複的程式碼,只需在一處維護程式碼即可。新的邏輯和漏洞修復都只需在一處進行,不必再四處徘徊。通過這種方式開發的軟體既穩定又可靠。
可讀性高
大多數情況下,遵循 DRY 原則的程式碼更容易閱讀。這並不是因為 DRY 原則本身,而是因為開發人員在程式碼中投入了更多精力,讓它符合一定的原則(比如 DRY 原則)。
重複使用
DRY 原則始終提倡二次利用程式碼,這是因為我們會將2個或2個以上重複程式碼例項併入一個程式碼塊。可重用程式碼縮短了開發時間,因此從長遠看,可重用程式碼是有回報的。
成本合理
如果想說服管理層用更多的時間來提高程式碼質量,就可以用“成本”這個理由。程式碼越長,成本越高。程式碼越長,維護程式碼、修復漏洞所需的人手和時間也越多。程式碼越長,開發時間和漏洞也越多,結果就是客戶非常不滿。無庸贅述。
測試方便
這裡我們討論的是模組測試和整合測試,而不是手動測試。測試時需要覆蓋的路徑和功能越多,為測試而編寫的程式碼就會越長。如果程式碼不重複,就只需要測試一個主路徑。當然,不同的行為仍然需要接受測試。
注意事項
雖然 DRY 原則好處多多,但還是有幾個小缺陷。
- 不是所有程式碼都需要整合成一段。有時候2段程式碼看上去差不多,但卻存在細微差異。什麼時候應當將程式碼段整合成一段,什麼時候又應當讓它們保持分離狀態,都需要仔細斟酌。
- 如果程式碼太過簡略,會讓人難以理解。我曾見過開發人員在只有一個程式碼塊例項時,還要貫徹 DRY 原則。雖然我欣賞他們希望讓程式碼更出色、可重用率更高的想法和遠見,但是我只有在需要二次利用程式碼時才會去遵循 DRY 原則。
- 人們經常會忽略的是,DRY 原則並不僅僅適用於程式碼,它還可以同等地應用到資料庫設計、文件編寫、程式碼測試等方面。
OneAPM 能為您提供端到端的 Java 應用效能解決方案,我們支援所有常見的 Java 框架及應用伺服器,助您快速發現系統瓶頸,定位異常根本原因。分鐘級部署,即刻體驗,Java 監控從來沒有如此簡單。想閱讀更多技術文章,請訪問 OneAPM 官方技術部落格。
本文轉自 OneAPM 官方部落格
原文地址:https://dzone.com/articles/is-your-code-dry-or-wet
相關文章
- 利用註解+反射消除重複程式碼,你學會了嗎?反射
- 幹掉 “重複程式碼” 的技巧有哪些
- beego有防止頁面重複提交的功能嗎Go
- 複製貼上程式碼真的有問題嗎?
- 如何檢測程式碼中是否有重複的id屬性
- 除了敲程式碼,你還有什麼副業嗎?
- 重構你的javascript程式碼JavaScript
- 防止表單重複提交的程式碼
- 你意識到你需要和重複作戰了嗎?
- 你會敲程式碼嗎
- 重複程式碼(克隆程式碼)的幾個概念與型別型別
- 有重複元素的全排列
- js如何刪除陣列中是否有重複內容程式碼JS陣列
- 你信嗎?重構軟體並不會改善程式碼質量
- 程式設計師是否有義務做好程式碼的註釋?你做好程式碼註釋了嗎?程式設計師
- 我來告訴你程式碼重構有什麼好處
- PHP 防抖(防重複提交)有哪些實現方法,具體程式碼PHP
- jquery防止重複提交程式碼例項jQuery
- 你需要每天寫程式碼嗎?
- 有重複元素的排列問題
- 你瞭解你和程式碼的生存環境嗎
- 你覺得我的這段Java程式碼還有優化的空間嗎?Java優化
- 重構:幹掉有壞味道的程式碼
- dataset 判斷整列是否有重複,找出重複資料
- 低程式碼/無程式碼的SaaS/CRM還有未來嗎?
- js 的陣列去除重複元素程式碼例項JS陣列
- javascript刪除陣列中的重複元素程式碼JavaScript陣列
- javascript刪除陣列重複元素程式碼JavaScript陣列
- 你試過不用if擼程式碼嗎?
- 重複提交,你是如何處理的?
- 程式碼重構,你所不知道的二手程式碼
- 如何解決unity做遊戲面臨的重複程式碼過多 程式碼複用性差的問題Unity遊戲
- 小測試:HashSet可以插入重複的元素嗎?
- 重構遺留程式碼(6):進攻複雜的方法
- 有本事你來寫程式碼
- 你見過背誦程式碼的程式設計師嗎?程式設計師
- 寫程式碼前的準備,你做好了嗎?
- Margin會重疊,你造嗎