Best practise : 封裝存儲過程


 

如果我們寫了一個存儲過程,比如叫做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); 

}

儘管代碼是等效的,代碼的可讀性也差不多,但是從架構角度看,後者要比前者要好,因爲後者改善了不同層次代碼的耦合關係。既然談到了關係,我們用圖的方式來看更好。看看數據庫層和應用層的耦合關係的對比:

 

Machine generated alternative text: IIi: LocalFunction  . . II2: RunProc

可是連接不僅僅沒有減少,反而多了一個啊?也許你要提出這樣的疑問。這裏最重要的點在於,層之間的耦合減少了。從原來的3個到現在的1個。層之內的聯繫可以多,這就叫做內聚,層之間的調用要少,這就叫做低耦合。這是高內聚低耦合的一個基本原則。儘管客戶代碼層之間的耦合多了,但是可以充分利用類的封裝、繼承、多態等特性,從而讓代碼更清晰。我們來看看好處:

a.          Sqlc#是不同類型的,本來應該有隔離層

b.          讓存儲過程和函數調用一致,從而對客戶端代碼更加友好

c.           同類的存儲過程封裝函數都可以放到一個類內,做好歸類工作

d.          調用都會轉成強類型

不僅如此,更加重要的是,這樣做了後,對變化的適應能力更強,這個內容下一篇再講。待續。

 


發佈了4 篇原創文章 · 獲贊 0 · 訪問量 2296
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章