## DRY 是什麼 > DRY 是 Don't Repeat Yourself 的簡寫,意思是不要重複你寫過的程式碼。 ## DRY 發生的原因可分為四種類別 * 強加的重複(Imposed duplication) * 無意的重複(inadvertent duplication) * 懶惰的重複(impatient duplication) * 開發者間的重複(inter-developer duplication) ### 強加的重複(Imposed duplication) > 這一類的重複是發生在開發者自認為是開發環境需要的、被強迫需要的重複,像是不必要的註解以及開發文件等等。 例如我們寫了一些有關 cookie 用的函式,並為其加上了使用註解,但其實從函式名稱本身就能夠得知其用途: ``` // 這是用來取得 cookie 值的函式 function getCookie (cname) { let value = "; " + document.cookie let parts = value.split("; " + cname + "=") if (parts.length == 2) return parts.pop().split(";").shift() } // 這是用來設定 cookie 值的函式 function setCookie (cname, cvalue, exdays){ let d = new Date() d.setTime(d.getTime() + (exdays*24*60*60*1000)) let expires = `expires=${d.toUTCString()}` return document.cookie = `${cname}=${cvalue};${expires}` } ``` ### 無意的重複 (inadvertent duplication) > 第二類是屬於開發者沒有意識到內容上的重複,通常出現在邏輯設計上的內容: 已知 Cube(立方體)長寬高都一樣的情況下,只要給一個邊長(length)即可;除此之外 volumn(體積)其實也就是邊長的三次方,可以由建構式內部算完即可,不應該使其成為公共變數(public variable) ``` // 修改前 function Cube(length, width, height, volumn) { this.length = length this.width = width this.height = height this.volumn = volumn } Cube.prototype.getVolumn = function () { console.log(this.volumn) } let sixCMcube = new Cube(6,6,6) sixCMcube.getVolumn() // 修改後 function Cube(length) { this.length = length this.volumn = Math.pow(length, 3) } Cube.prototype.getVolumn = function () { console.log(this.volumn) } let sixCMcube = new Cube(6) sixCMcube.getVolumn() ``` ### 懶惰的重複 (impatient duplication) 開發者為了節省時間上的重複,可能發生在使用 CV (複製貼上)大法的時候,尤其複製的程式碼量一大的時候,很有可能遺漏某些需要更改的東西。例如在實作多欄位的搜尋表單,有時候只是值上的替換,其程式碼模樣大同小異,就很有可能在複製貼上完後,忘記更改某個表單欄位的 id 值等等。 ### 開發者間的重複 (inter-developer duplication) 最難解決也最常發生的重複議題,通常發生在開發者與開發者之間的決鬥 協作開發或接手開發的時候,因為在同個專案底下很容易有共同的需求,有時候沒有協調好或是接手專案對於架構不清楚時,容易開發出概念上重複的程式碼。 文章整理自:[林奇璇](https://shawnlin0201.github.io/Methodology/Methodology-001-DRY-principle/)