如果我們寫了一個存儲過程,比如叫做delete_dept,功能非常簡單——就是刪除指定id的部門:
CREATE PROCEDURE [dbo].[delete_dept]
@id int
AS
delete from dept where id=@id
RETURN 0
那麼這樣的存儲過程,我們應該在代碼中如何調用呢?
現在的大部分做法都是採用一個封裝的函數,傳遞存儲過程名稱、參數爲函數的參數。還是以這個存儲過程爲例,假設方面名稱爲RunProc,那麼調用的方法就是:
RunProc("delete_dept",1);
這是最簡單的,也是最容易想到的做法。爲了方便我們給它取個名字:RunProc方法,可是直觀的做法,不一定適合大型的產品工程。在客戶端代碼中,如果能夠這樣做,是不是更好:
delete_dept(1);
爲了方便,也給它取個名字:LocalFunction方法。爲此我們只需要實現一個函數就行了:
void delete_dept(int id)
{
RunProc("delete_dept",id);
}
儘管代碼是等效的,代碼的可讀性也差不多,但是從架構角度看,後者要比前者要好,因爲後者改善了不同層次代碼的耦合關係。既然談到了關係,我們用圖的方式來看更好。看看數據庫層和應用層的耦合關係的對比:
可是連接不僅僅沒有減少,反而多了一個啊?也許你要提出這樣的疑問。這裏最重要的點在於,層之間的耦合減少了。從原來的3個到現在的1個。層之內的聯繫可以多,這就叫做內聚,層之間的調用要少,這就叫做低耦合。這是高內聚低耦合的一個基本原則。儘管客戶代碼層之間的耦合多了,但是可以充分利用類的封裝、繼承、多態等特性,從而讓代碼更清晰。我們來看看好處:
a. Sql和c#是不同類型的,本來應該有隔離層
b. 讓存儲過程和函數調用一致,從而對客戶端代碼更加友好
c. 同類的存儲過程封裝函數都可以放到一個類內,做好歸類工作
d. 調用都會轉成強類型
不僅如此,更加重要的是,這樣做了後,對變化的適應能力更強,這個內容下一篇再講。待續。