软件开发思想之我见
軟件開發(fā)思想之我見
一
雖不敢自詡自己的代碼量有多大,但是這絲毫不能壓制我對(duì)于軟件開發(fā)的理解。寫的代碼越多,越發(fā)覺面向?qū)ο笙鄬?duì)于面向過程是多么的優(yōu)越,就比如簡(jiǎn)單的jdbc編程,為執(zhí)行一條解決目標(biāo)業(yè)務(wù)的sql語句,往往會(huì)搭上更多的諸如加載驅(qū)動(dòng)、獲取連接、捕獲異常、關(guān)閉資源等額外操作,對(duì)于初學(xué)者而言,反正有的是精力,也會(huì)覺得理所當(dāng)然:有多少個(gè)方法,就會(huì)有多少個(gè)這樣額外的東西的身影存在。當(dāng)這樣重復(fù)寫過兩三天后,開始有點(diǎn)反思了,考慮是不是應(yīng)該把這些重復(fù)的、不涉及具體業(yè)務(wù)的固定步驟提取出來?于是有了JDBC操作數(shù)據(jù)庫的util工具類,把那些一成不變的動(dòng)作按一定的功能封裝為不同的靜態(tài)方法。這種提取公共代碼轉(zhuǎn)為工具類的方法的確解決了燃眉之急,而且還似乎提升了自己的編程內(nèi)功,但是當(dāng)用過一兩個(gè)月后又發(fā)現(xiàn)自己的包里充斥著各種各樣的util工具類,導(dǎo)致包負(fù)荷量的臃腫,更麻煩的是這些特定的util工具類僅僅適合特定的應(yīng)用場(chǎng)合,還不能在各個(gè)api、底層產(chǎn)品間平滑過渡。而你就會(huì)開始反思之前的封裝辦法似乎有點(diǎn)具有**特色主義的封裝——雖然符合特定場(chǎng)合的“國情”,但是我們要的是以不變應(yīng)萬變!于是,你就開始嘗試著將你對(duì)重復(fù)工作的封裝進(jìn)一步優(yōu)化和擴(kuò)展,反正算法和策略或是業(yè)務(wù)流程是不變的,何不弄一個(gè)為Template,設(shè)定好房屋的骨骼架構(gòu),留給以后的具體開發(fā)僅僅是一個(gè)蘿卜一個(gè)坑的往里填就是了。當(dāng)這樣做過之后,又是一段時(shí)間編程中的游刃有余,但是后文似乎還沒有完,當(dāng)你對(duì)這些重復(fù)功能或業(yè)務(wù)的封裝應(yīng)用于更大更復(fù)雜的場(chǎng)合時(shí),加上你的經(jīng)驗(yàn)的累積,開始站在更高的軟件思想角度來思考這是不是應(yīng)該把這些東西復(fù)合成一個(gè)特定的領(lǐng)域解決方案?這樣想過之后,你開始將之前那些封裝再次進(jìn)行肢解,應(yīng)用更健壯、更靈活的設(shè)計(jì)邏輯和各式的設(shè)計(jì)模式來進(jìn)行重新設(shè)計(jì)——于是,你從混沌未開中開辟了一條領(lǐng)域解決方案,甚至于你打算將之進(jìn)行開源,這便是一個(gè)新的框架的誕生。
而這樣一個(gè)過程,或者說是設(shè)計(jì)思想的轉(zhuǎn)變,需要時(shí)間和代碼量的積累。的確,當(dāng)你對(duì)現(xiàn)有的代碼進(jìn)行分析、歸納、總結(jié)時(shí),你才會(huì)發(fā)現(xiàn)很多顯而易見或者隱形的問題,這個(gè)時(shí)候你就會(huì)逐漸的反思自己的設(shè)計(jì)方式的合理性。面向?qū)ο蟮娜筇卣?#xff1a;封裝、繼承、多態(tài),從字面上或者理論上是多么的容易理解,但是要在自己的代碼中體現(xiàn),對(duì)于剛剛踏入程序開發(fā)行列的初學(xué)者而言又是何其的難,原因可能有經(jīng)驗(yàn)不足,在沒有多個(gè)可供選擇的設(shè)計(jì)方案下,只能依據(jù)流程式的思維把功能實(shí)現(xiàn)就好;也有可能是因?yàn)闆]有面向?qū)ο笤O(shè)計(jì)的主動(dòng)意識(shí);還有可能是在時(shí)間和開發(fā)成本的約束下,顯得有些力不從心。
但是無論如何,我認(rèn)為一種科學(xué)的設(shè)計(jì)思想比編碼本身更重要,這就相當(dāng)于理論指導(dǎo)實(shí)踐,決策高于執(zhí)行(很好的執(zhí)行力在錯(cuò)誤的決策下只會(huì)自食惡果)。不管是Gof的32種設(shè)計(jì)模式,還是面向?qū)ο蟮乃拇笤瓌t,亦或是基于UML的RUP等等,這些都是一種指導(dǎo)并實(shí)現(xiàn)高效編碼的理論思想。值得注意的是,這些設(shè)計(jì)思想和方式,并不能因?yàn)橐粌杀緯淖置胬斫庵猩羁汤斫狻?/p>
但是,過分講求這些條條框框而不具體問題具體分析,便會(huì)陷入另一個(gè)麻煩:教條主義。話說回來,所謂的最佳實(shí)踐也就是一個(gè)經(jīng)驗(yàn)的累積加上事實(shí)求是(具體問題具體分析),面向過程也好,面向?qū)ο笠擦T,都沒有絕對(duì)的好壞,這要依具體的情況而言。
二
對(duì)于項(xiàng)目的分析、設(shè)計(jì),在后期開發(fā)的時(shí)候,以嚴(yán)謹(jǐn)?shù)乃季S面對(duì)計(jì)算機(jī)沒錯(cuò),但是在分析設(shè)計(jì)階段,作為一個(gè)程序員很容易陷入系統(tǒng)的角度分析和考慮問題,這其實(shí)是很麻煩的。容易導(dǎo)致的結(jié)果是,你的后期的代碼實(shí)現(xiàn)依據(jù)了你自己的分析,但是你這種分析沒有以一個(gè)用戶的角度、一個(gè)業(yè)務(wù)人的角度來進(jìn)行分析,很容易到最終你所實(shí)現(xiàn)的系統(tǒng)并不是用戶想要的甚至是不能被理解的。那么即使再安全、再高效、再優(yōu)秀的系統(tǒng)也只能落得個(gè)返工的下場(chǎng)。“涉眾”決定“系統(tǒng)用戶”,“用例”決定“系統(tǒng)實(shí)現(xiàn)”。足見用例的重要性,我們尤其在對(duì)用例分析的時(shí)候,要多站在用戶的角度去思考用戶是想要實(shí)現(xiàn)怎樣一個(gè)系統(tǒng)或者功能,而不應(yīng)是急促地跳進(jìn)系統(tǒng)里去,用數(shù)據(jù)庫的CRUD來向用戶拍胸口保證這就是完美解決方案。
三
以上是關(guān)于我對(duì)設(shè)計(jì)思想的重要性的理解,還有一個(gè)很重要的就是關(guān)于項(xiàng)目管理方面的一個(gè)要注意的地方——專注核心功能的實(shí)現(xiàn),把輔助性的功能放在次要位置!
對(duì)一個(gè)項(xiàng)目,為確保該項(xiàng)目正確地體現(xiàn)設(shè)計(jì)方案的要求,應(yīng)該提取出項(xiàng)目的核心功能,并進(jìn)行著重的開發(fā)、監(jiān)督和控制。像一個(gè)基于元數(shù)據(jù)的數(shù)據(jù)庫管理視圖系統(tǒng),其核心功能應(yīng)該是三個(gè)模塊:其一,數(shù)據(jù)查詢;其二,數(shù)據(jù)編輯;其三,數(shù)據(jù)庫導(dǎo)入導(dǎo)出。雖然系統(tǒng)定義了用戶管理、角色分配、日志管理、修改密碼等功能,但是它們不是系統(tǒng)的核心,所以在核心功能沒有完成或者無法保證其按時(shí)、順利地完成的情況下,應(yīng)該要減輕對(duì)這些次要功能的開發(fā)成本的投入。讓“核心”的人做核心的事,讓大的成本投入于核心的工作。除此之外,對(duì)于核心的模塊,也應(yīng)該警惕開發(fā)人員一個(gè)與生俱來的癖好——遇到哪個(gè)問題往往糾結(jié)哪個(gè)問題,技術(shù)人員最喜歡死扣一個(gè)心眼兒,糾纏于一個(gè)死問題。問題當(dāng)然是要解決的,而且應(yīng)該制定專門的問題、bug匯總?cè)罩?#xff1b;只是如果站在全局的角度看,我們完全應(yīng)該暫時(shí)“跳過”這個(gè)問題,把其他的東西先做著走,之后才回過頭來解決它。只有這樣,我們的才能夠保證項(xiàng)目有序地進(jìn)行下去。
轉(zhuǎn)載于:https://www.cnblogs.com/xuxiace/archive/2012/04/10/2441090.html
總結(jié)
- 上一篇: 深入浅出学习Struts框架(九):分析
- 下一篇: android有错.怎么办