本文的作者Elliotte是一位著名的IT方面的作家,寫20多本關於編程方面的書籍,有很多書籍在國內都有出版,如《重構HTML:改善Web應用的設計》,目前他正在研究XML處理器XOM、jaxen XPath引擎和Amateur媒體播放器。
以下為本文:
上周,一位同事的一個觀點讓我深受啟發,這個觀點是如此的顯而易見,以至於當他說出來時我驚奇於為什麼以前沒有意識到這點:如果你為複用而設計,那你就做錯了。
你現在要寫的代碼的唯一目的就是服務於你目前手頭上的需要解決的任務。不要為複用而設計。不要去考慮複用。不要為讓代碼複用而浪費一秒鐘時間。
事實上,任何你需要的可以複用的代碼都已經存在了。想要去串連一個HTTP Server,並且要全面支援安全認證和cookies嗎?這個東西聽起來很多項目都可以用到,於是,你想把這個東西封裝一下做成一個易用的HTTP類或共用包,很好的想法不是?錯。你應該使用 Apache HttpClient。
需要解決你的拋物線方法的初始值問題嗎?不要去翻看你的《numerical analysis textbook》,你需要做的是下載Flanagan的Java科學計算庫,或購買一個NAG許可證。想要給你的同事們做一個日曆選擇組件嗎?直接告訴他們去用JCalendar。儘管它在外觀和使用方法上和你想象的不是完全一致,但完全夠用。如果你打算做出自己的組件,或找一個現有的修改一下,你會發現,你開發出的這種不一樣的表現效果並不適合另外一些人的應用,所以,不要浪費時間去開發自己的可複用的代碼。
這些例子都是針對Java來說的,但對於另外一些主流的語言,比如Perl,Python,Ruby,C++,C#,Scala等,都是適用的。事實上,如果一種語言不能提供解決你的問題的可複用的代碼,那你就是選錯瞭解決你的問題的語言。
有例外的情況嗎?我只能想出兩種(目前為止我感覺沒有第三種情況了)。
第一種例外是你在開發一種新的東西,你需要的類庫不存在,你是第一個進入這個領域的人,你需要寫出可複用的代碼。例如,當我率先開發出XIncluder類庫時,XInclude的規範還處於制訂中,你在Java裡找不到第二個可用的類庫。我寫的這個類庫成了規範的可實現的一種證明,推動了規範向更完備的狀態發展。十年前開發我自己的XInclude類庫是明智的,而今天絕對不會再重做這樣的事。
第二種例外情況是針對專家的,我甚至還不確定這是否是例外。如果你是某一個領域的真正專家,有可複用的代碼能解決你的領域的問題,而你經過認真的研 究現有的解決方案,你認為它們是不完善的,你在尋找一種更好的解決方案,這時,而且只有這時,你可以考慮寫出你自己可複用的代碼。這就是我為什麼要開發XOM的 原因。只是在我寫了數百頁的書稿,詳盡的收集了目前Java裡處理XML的各種API,知道了它們的優點和缺點後,我才覺得應該坐下來設計一個API來改 進它們。儘管我認為我設計的API是最好的API,但我仍然不確定把時間花在它上面是否值得。XOM,按我的觀點,比之前的任何API都好,但它並不是好 到能夠在大量的其它項目中替代其它的類庫。對這個新API的需求不是真正的很大。
還有另外的例外嗎?還有另外的一種情況裡你需要寫出可複用的代碼嗎?我想不出。有如此多的程式員花了如此多的時間來探索我們生活中存在的問題,並把 他們的成果放在 Sourceforge 和 Github 這樣的網站上免費分享。當然,新的問題會不斷的出現,但對一些老的問題,如果去再重新研究它們一遍,你並不能從中獲得多大的收益。下一次,如果你發現自己 在為複用而設計,請住手,問問自己是否可以複用別人的代碼。
[英文原文:Don’t Design for Reuse ]