Web應用程序和N層很有趣,主要是因爲N層的概念隨着JSON和AJAX或Flash和XMLRPC的廣泛採用而擴展。這chart on Webopedia顯示一個交錯的藍線,表達這個好。總結一下:您的業務,訪問者和表示邏輯不僅可以存在於服務器上,而且在某些情況下也可以存在於瀏覽器中。然而,N層的意圖是可分離性。如果您需要更換UI或數據庫,或添加其他UI,則不應影響業務邏輯。這就是決定你的API的原因 - 預計你的HTML和CSS在Flex中被拋棄的日子,並且MySQL被Oracle更換。
這是需求確定的,在我使用的一些Web應用程序中,同時使用N層的變體。以LyrisHQ爲例(電子郵件ASP)。他們有一個客戶Web應用程序。最近,他們盯着他們的基於Flash的應用程序。很明顯,這會向瀏覽器傳送大量數據,並且可能在Flash UI中複製了一些業務邏輯。但是,他們必須保留兩份申請,因爲任何一份申請對於不同(和重疊)的要求都是必需的。
最常見的PHP應用程序不考慮將大量未格式化的數據傳送到瀏覽器。但是,如果你是,這會很快告訴你如何設計你的API。很可能,除了類似於PHP演示文稿模板使用的內部控制器類以外,您還需要可以與XMLRPC,REST或SOAP交談的控制器。這將嚴格意味着一個簡單的Web登錄頁面,您將擁有一個與LoginController類交談的登錄表單的PHP模板。 XML接口同樣會使用相同的LoginController類。就像你會認爲你會把SQL寫入Ajax請求一樣,你會嚴格避免在你的演示文稿模板中寫入查詢。
業務層可以更嚴格或更不嚴格,因爲通常不需要切換數據庫後端品牌。在嚴格的N層設計中,您的業務對象如何與數據庫進行交談就好像您可以從MySQL切換到MS SQL,而無需重寫業務層。有時這是通過爲每個表(表網關),每行(活動記錄),每個連接或每個事務建模對象完成的。這就是PDO或PHP-ADO這樣的東西有用,但不足以完全隔離的地方。像Hibernate這樣的Java中的ORM /持久層通常通過提供對象查詢語言(OQL)來演示更好的這種隔離。
我自己,我目前正在進行從基於MySQL的PHP應用程序到MS-SQL的後端轉換。該應用程序只使用過直接的SQL查詢。設想一下如何選擇如何在一個類中進行一系列查詢,或者抽象它們,或者進行子類化,並且希望不會改變業務邏輯。至少,你會希望所有的SQL調用都是間接的。 (S.O. post on PHP ORM。)
最後,對於您關於面向對象的問題:使用它如何必須滿足您的要求。我個人的技巧是從PHP演示模板中的邏輯開始,花幾分鐘時間讓團隊滾動,很快我會將其重構爲一個類和一個模板。如果我有共同的想法,我會將例程分成共享類,努力保持DNRY原則。 (A S.O. post on that here. OOP不是N層設計的基本要求,DNRY對於保持代碼的可維護性非常重要,通常截止日期和範圍轉移會摧毀一個API,重構它直到你得到你需要繼續去的東西。打賭OOP將幫助你到那裏
是的,是的,是的。 Go框架;) – Franz 2009-11-08 00:50:19