Web應用開發實用程式設計指導(二) 大道至簡

2021-09-02 04:01:32 字數 2261 閱讀 2541

大道至簡——老子·《道德經》

**是我們的敵人——jeff atwood ·《高效程式設計師的修煉》

矽谷的大牛jeff atwood說過一句言簡意賅的箴言:**是我們的敵人。其實**不光是程式設計師的敵人,它還是一切與專案有關的人的敵人。多一行**就意味著:多一行**需要除錯,多一行**需要閱讀,多一行**需要測試,多一行**可能發生錯誤!這就像「蝴蝶效應」,隨著專案時間和人員的累積,乙個專案將會變得越發臃腫而且錯誤頻發,而乙個專案越臃腫和錯誤頻發就要投入越多的人力和時間進行維護,這樣就形成了乙個惡性迴圈。著名的it顧問andy hunter曾在他的《程式設計師的修煉之道》裡面指出:乙個rot的專案通常都是從一些小的模組開始腐爛的,即所謂的「破窗效應」。而為了避免乙個專案過早地走向衰敗,我們可以從根本下手,那就是減少**的數量!

減少**的數量,從哪兒做起呢,我覺得最有必要的就是從sql語句開始下刀!

很多應用系統的開發人員喜歡把大量的邏輯寫到sql語句裡面,比如下面的sql,包含了日期型別轉換和乙個case語句:

select convert(date,』yyyy-mm-dd』),case a when 1 then … else end from …

邏輯控制是程式的強項,sql(標準化查詢語言)是檢索和更新資料的語言。程式是物件導向的,sql對於應用系統來說不過是一句扁平的字串。物件導向的程式語言顯然有更強的邏輯處理能力,有更加強大的擴充套件性和可讀性。sql函式有很多都是非標準化的,不同的資料庫之間函式的寫法完全不同,從這一點看sql的移植性也大大不如程式。而且不恰當的sql函式使用可能令資料庫索引失效而發生全表掃瞄,比如把函式放在where語句裡面。

試想上面的語句的查詢結果如果要先後應用在兩個頁面上,a頁面要只顯示年-月-日,b頁面要顯示年-月-日時分秒,難道你要再寫一條sql語句?另外,巢狀在sql裡面的case之類的邏輯語句如果較多,將給閱讀sql帶來不方便,如果非要在sql語句裡面進行這樣的處理,應該考慮能否把這部分語句用迴圈的方式在程式裡面生成。

寫複雜的sql不是一件牛b的事情而是為專案增加拖累,在應用開發時尤其如此。如果是做資料分析資料探勘之類的事情,那就另當別論。

減少**的數量,第二件可以做的事情,減少冗餘的方法和sql語句

這件事對於那些幾乎不寫設計文件的專案組來說似乎有困難,也許他們可以用**生成器或自定義框架之類的辦法來減少這樣的問題。當然如果有**評審或結對程式設計之類的措施就更棒了。jeff atwood就曾在他的部落格裡面大加讚賞這兩種工作方法,並一度指出這樣的方法可以降低60%的bug發生率!

selectproductbya(string a);//給xx君呼叫

selectproductbyab(string a ,string b);//給某a頁面用

selectproductbyabc….(string a,string b,string c…..stringn);//給c頁面用

不要小看這種現象,這種現象幾乎在我經歷的每個專案裡面都發生,而且在大專案中這種問題可謂數不勝數。很多人似乎都不屑於在寫**前先去看一看那些已經有的介面,這實在是個不懂團隊合作的壞習慣。這種浪費型的寫法帶來的後果是專案中類**、接**炸,bug反覆出現,也許乙個小小的修改要涉及到四五個不同的類和方法。這種寫法一開始就應該用乙個物件引數來包含各種引數的呼叫。類似的浪費寫法還有一些無謂的重複sql,比如按a屬性查詢寫乙個sql,按ab屬性查又寫乙個sql。方法的引數定義應該簡略,當然最好的傳參方式就是物件。不要覺得這種方式是大材小用,在需求擴充套件的過程中你必將體會到物件傳參的精彩妙用,而且物件(領域模型)也是連線三層架構的一條重要紐帶。

減少**的數量,第三件可以做的事是把正確的**寫在正確的地方!

乙個專案的規模通常會隨著需求的變化而變化,因此三層架構仍不失是專案中可採用的萬全之策。那麼如何在這三層架構中找到**的位置呢,首先你必須做到第一點——簡化sql!

一般來說dao層類是和資料庫表對應的,那麼我們可以按照返回的資料集結果來決定把我們的sql放在哪個dao裡面。

在很多簡單的小型系統中,業務邏輯基本上就等於資料查詢的邏輯,因此服務層的作用被大大弱化了——基本成了控制層和dao層之間的「傳話筒」,或者在一些spring框架中做事務控制之用。但是,當sql語句被簡化後,一部分業務邏輯就被往上「推」到了服務層,我們會發現原來「打醬油」的服務層慢慢變得有事可做了,服務層裡面可以做各種判斷,鑑權,運算以及複雜資料結構的整合,也就是把各個dao裡面查出來的資料做各種轉換,達到符合控制層輸出的目的。

合理地安排**的位置,可以提高**的復用性,這讓我們更輕鬆地適應需求的變化!

我國偉大的思想家老子在數千年前就發現了「大道至簡」的道理。簡單意味著強大,簡單意味著輕鬆,簡單也意味著更低的成本。所以我們應該著力於如何把複雜的事情變簡單!make it easy!

Web應用開發實用程式設計指導(一) 引言

軟體的本質就是 好像人的身體是細胞組成的,大多數細胞健康了,人才會健康強壯。同理,雖然軟體成功的因素眾多,但 的質量就是專案 每乙個細胞 的質量。大多數 健康了,軟體才會成功向上。乙個僅僅 可以執行 的專案,如果它的 沒有可擴充套件性,沒有可讀性,沒有健壯性,那麼它一定會發生下列的各種的嚴重問題之一...

Web應用開發實用程式設計指導(一) 引言

軟體的本質就是 好像人的身體是細胞組成的,大多數細胞健康了,人才會健康強壯。同理,雖然軟體成功的因素眾多,但 的質量就是專案 每乙個細胞 的質量。大多數 健康了,軟體才會成功向上。乙個僅僅 可以執行 的專案,如果它的 沒有可擴充套件性,沒有可讀性,沒有健壯性,那麼它一定會發生下列的各種的嚴重問題之一...

Web應用程式開發 二

web應用程式開發 二 乙個host代表乙個web站點 1 虛擬目錄的根目錄 自己指定乙個檔案系統目錄是web站點的根目錄,在server.xml中在元素中間增加 2 虛擬目錄的子目錄 1 在server.xml中在元素中間增加 3 達成乙個war包,在server.xml檔案中配置 虛擬子目錄的名...