網站的軟架構 |
發(fā)布時間: 2012/9/16 20:36:47 |
現在的PHP框架有很多選擇,比如:CakePHP,Symfony,Zend Framework等等,至于應該使用哪一個并沒有唯一的答案,要根據Team里團隊成員對各個框架的了解程度而定。很多時候,即使沒有使用框架,一樣能 寫出好的程序來,比如Flickr據說就是用Pear+Smarty這樣的類庫寫出來的,所以,是否用框架,用什么框架,一般不是最重要的,重要的是我們 的編程思想里要有框架的意識。
邏輯的分層網站規(guī)模到了一定的程度之后,代碼里各種邏輯糾纏在一起,會給維護和擴展帶來巨大的障礙,這時我們的解決方式其實很簡單,那就是重構,將邏輯進行分層。通常,自上而下可以分為表現層,應用層,領域層,持久層。表現層所謂表現層,并不僅僅就指模板,它的范圍要更廣一些,所有和表現相關的邏輯都應該被納入表現層的范疇。比如說某處的字體要顯示為紅色,某處的開頭要 空兩格,這些都屬于表現層。很多時候,我們容易犯的錯誤就是把本屬于表現層的邏輯放到了其他層面去完成,這里說一個很常見的例子:我們在列表頁顯示文章標 題的時候,都會設定一個最大字數,一旦標題長度超過了這個限制,就截斷,并在后面顯示“..”,這就是最典型的表現層邏輯,但是實際情況,有很多程序員都 是在非表現層代碼里完成數據的獲取和截斷,然后賦值給表現層模板,這樣的代碼最直接的缺點就是同樣一段數據,在這個頁面我可能想顯示前10個字,再另一個 頁面我可能想顯示前15個字,而一旦我們在程序里固化了這個字數,也就喪失了可移植性。正確的做法是應該做一個視圖助手之類的程序來專門處理此類邏輯,比 如說:Smarty里的truncate就屬于這樣的視圖助手(不過它那個實現不適合中文)。應用層所謂應用層,它的主要作用是定義用戶可以做什么,并把操作結果反饋給表現層。至于如何做,通常不是它的職責范圍(而是領域層的職責范圍),它會通過 委派把如何做的工作交給領域層去處理。在使用MVC架構的網站中,我們可以看到類似下面這樣的URL: domain/articles/view/123,其內部編碼實現,一般就是一個Articles控制器類,里面有一個view方法,這就是一 個典型的應用層操作,因為它定義了用戶可以做一個查看的動作。在MVC架構中,有一個準則是這么說的:Rich Model Is Good。言外之意,就是Controller要保持“瘦”一些比較好,進而說明應用層要盡量簡單,不要包括涉及領域內容的邏輯。領域層所謂領域層,最直接的解釋就是包含領域邏輯的層。它是一個軟件的靈魂所在。先來看看什么叫領域邏輯,簡單的說,具有明確的領域概念的邏輯就是領域邏輯,比如我們在ATM機上取錢,過程大致是這樣的:插入銀聯卡,輸入密碼,輸入取款金額,確定,拿錢,然后ATM吐出一個交易憑條。在這個過程中,銀聯卡 在ATM機器里完成錢從帳戶上劃撥的過程就是一個領域邏輯,因為取錢在銀行中是一個明確的領域概念,而ATM機吐出一個交易憑條則不是領域邏輯,而僅是一 個應用邏輯,因為吐出交易憑條并不是銀行中一個明確的領域概念,只是一種技術手段,對應的,我們取錢后不吐交易憑條,而發(fā)送一條提醒短信也是可能的,但并 不是一定如此,如果在實際情況中,我們要求取款后必須吐出交易憑條,也就是說吐出交易憑條已經和取款緊密結合,那么你也可以把吐出交易憑條看作是領域邏輯 的一部分,一切都以問題的具體情況而定。在Eric那本經典的領域驅動設計中,把領域層分為了五種基本元素:實體,值對象,服務,工廠,倉儲。具體可以參 閱書中的介紹。領域層最常犯的錯誤就是把本應屬于領域層的邏輯泄露到了其他層次,比如說在一個CMS系統(tǒng),對熱門文章的定義是這樣的:每天被瀏覽的次數多 于1000次,被評論的次數多于100次,這樣的文章就是熱門文章。對于一個CMS來說,熱門文章這個詞無疑是一個重要的領域概念,那么我們如何實現這個 邏輯的設計的?你可能會給出類似下面的代碼:“SELECT ... FROM ... WHERE 瀏覽 > 1000 AND 評論 > 100”,沒錯,這是最簡單的實現方式,但是這里需要注意的是“每天被瀏覽的次數多于1000次,被評論的次數多于100次”這個重要的領域邏輯被隱藏到 了SQL語句中,SQL語句顯然不屬于領域層的范疇,也就是說,我們的領域邏輯泄露了。持久層所謂持久層,就是指把我們的領域模型保存到數據庫中。因為我們的程序代碼是面向對象風格的,而數據庫一般是關系型的數據庫,所以我們需要把領域模型 碾平,才能保存到數據庫中,但是在PHP里,直到目前還沒有非常好的ORM出現,所以這方面的解決方案不是特別多,參考Martin的企業(yè)應用架構模式一 書,大致可以使用的方法有行數據入口(Row Data Gateway)或者表數據入口(Table Data Gateway),或者把領域層和持久層合二為一變成活動記錄(Active Record)的方式。億恩小路QQ572931335電話15890397512租用與托管有興趣請聯系我:億恩-小路1339268817 電話:15890397512 本文出自:億恩科技【mszdt.com】 |