不該活着的SqlHelper和DBHelper


前言:

還記得剛學ADO.NET的情景么?

還記得當年是怎么從ADO.NET被忽悠到用SqlHelper的么?

話說從入門到走上工作崗位那些年,我們就一直被純純地教導或引導,ADO.NET太原始,得封裝成SqlHelper或DBHelper......

后來,這種思維一直深深就存在腦海里,並不知不覺中進入了潛意識,形成一種習慣。

在寫框架的前幾年,我也一直延續着這種思維,早期CYQ.Data的源碼里,也有Sqlhelper,我也分享過Sqlhelper類的源碼......

后來框架寫久了,開始對框架的命名有講究了,就默默低調的把Sqlhelper給改名了...

上個月的某一天,我給以前的同事傳授知識時,不自覺的提到這個Helper悖論問題。

今天,無意中看到了這樣的一篇文章,於是覺得可以分享一下自己的觀點了:

文章里只有一個幫助類的代碼,這里只截一小段(這是一段典型的有問題的代碼,用來給下文當反例用的):

 

這些年框架寫多了,對面向對象相關的很多定義和使用,在潛意識里已經自有一套模式,以下分享兩個小點:

1:定義Static變量需要考量的兩個因素:內存和並發:

1:定義static變量:意味着該對象從始致終,都存在內存中,因此,你需要思考對象可預計或不可預計的大小,是否全局,若否,需要在何處需要將對象置Null?以便垃圾回收!

2:定義static變量:意思着在(Web)多線程環境下必然需要思考:是否有線程訪問沖突?問題需要解決?需要Lock嗎?需要雙重判斷?

若寫代碼時沒有這兩種考量,容易導致static亂用問題。

因此,上面的代碼對Connection對象定義為static,明顯錯誤有二:

1:資源只能用一個。

2:多線程下掛掉或拋異常是必然的,因為共用一個對象(場景如:A操作完Close,B操作到一半發現被Close了,好囧......)。

發現有超過一半的人分不清文章的邏輯,所以加點無敵分隔線,以便后續來者看的簡單些。

----------------------------------以上內容只是引子和分享點知識,和標題要陳述的內容無關--------------------------------

評論的問題在於:

A:只針對引子1去發表意見,而忽視重要的論據2和3,沒有人針對論據2和3去評論?

B:把范圍擴大到Static和Helper去評論,不知道文章說的是sqlHelper或DBHelper,是針對數據庫的么?

----------------------------------下面的2-3才是針對標題的論據---------------------------------------------------------

2:數據庫操作類不應該為設計為static:

在現實的項目中,數據庫的並發和事務是一件很自然就存在的事情。

因此:

1:並發的存在:意味着數據庫操作類(ADO.NET)對象不能設置為static。(把特意把對象加粗,這里不是說方法

2:事務的存在:意味着數據庫操作類不能將方法定義為static。(這里才是說方法

因此,數據庫操作類合適的方式,應該設計成實例方式。

進一步補充解釋:

1:通過在static里方法產生實例,可以避免線程問題,但對象不能復用,事務沒法用。

2:把對象提升為參數,外部實例后傳入:能復用對象和事務,但根據業務場景需要不斷增加重載方法,修改方法以適用,所以這種設計也不合理。

比如你需要增加參數來達到復用:執行的時候是否關閉鏈接、事務是否提交、參數是否清除、DataReader返回的參數重載等N種場景。

再簡化解釋:

1:不該將對象定義為靜態(這個1的引子可見)

2:不該方法定義為static(因為要操作事務共享,進一的論據是場景會引發重載過多,導致設計不合理)

如果還是看不懂。。。多看幾遍吧,這里是重要的論據。

3:關於XXXHepler或XXXUtility的思維定義:

我們可以用Reflector在微軟的內庫里搜Helper或Utitliy結尾定義的類,可以隨便挑着看:

結論都一個樣:

1:這個類應該是個幫助類或定義為static類。

2:內部應該(或大部分)是靜態方法。

悖論出來了:

我在園子里掃了一下,發現大部分的SqlHelper類或DbHelper在經過項目的實戰后,都知道該轉成實例方式提供。

可是,既然都轉成了實例,為啥還叫SqlHelper或DbHelper???

應該改名的!

為啥?為啥?為啥不改名呢?(那是我們從小就被教壞了。。。)

因果論:

因為:數據庫操作設計不應該為Static,同時Helper后綴的不該設計為實例類。

所以:在數據庫操作類設計里,SqlHelper和DBHelper不該存活。

 

總結:

過程很友善,結論很無情!

世事無絕對,存在即合理,人生的理由除了應不應該,還有喜不喜歡,值不值得,習不習慣,所以,樓下都在為它找一個合理存在的理由。

 

關於文章被侵權問題:

@dudu,@博客園 文章被今日頭條盜了,還沒注明作者和來源,怎么弄它?:

http://toutiao.com/i6315940257556595202/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM