天天看點

不該活着的SqlHelper和DBHelper前言:1:定義Static變量需要考量的兩個因素:記憶體和并發:2:資料庫操作類不應該為設計為static:3:關于XXXHepler或XXXUtility的思維定義:悖論出來了:總結:關于文章被侵權問題:

還記得剛學ado.net的情景麼?

還記得當年是怎麼從ado.net被忽悠到用sqlhelper的麼?

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

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

在寫架構的前幾年,我也一直延續着這種思維,早期cyq.data的源碼裡,也有sqlhelper,我也分享過sqlhelper類的源碼......

後來架構寫久了,開始對架構的命名有講究了,就默默低調的把sqlhelper給改名了...

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

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

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

不該活着的SqlHelper和DBHelper前言:1:定義Static變量需要考量的兩個因素:記憶體和并發:2:資料庫操作類不應該為設計為static:3:關于XXXHepler或XXXUtility的思維定義:悖論出來了:總結:關于文章被侵權問題:

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

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

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

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

1:資源隻能用一個。

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

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

----------------------------------以上内容隻是引子和分享點知識,和标題要陳述的内容無關--------------------------------

評論的問題在于:

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

b:把範圍擴大到static和helper去評論,不知道文章說的是sqlhelper或dbhelper,是針對資料庫的麼?

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

在現實的項目中,資料庫的并發和事務是一件很自然就存在的事情。

是以:

1:并發的存在:意味着資料庫操作類(ado.net)對象不能設定為static。(把特意把對象加粗,這裡不是說方法)

2:事務的存在:意味着資料庫操作類不能将方法定義為static。(這裡才是說方法)

是以,資料庫操作類合适的方式,應該設計成執行個體方式。

1:通過在static裡方法産生執行個體,可以避免線程問題,但對象不能複用,事務沒法用。

2:把對象提升為參數,外部執行個體後傳入:能複用對象和事務,但根據業務場景需要不斷增加重載方法,修改方法以适用,是以這種設計也不合理。

比如你需要增加參數來達到複用:執行的時候是否關閉連結、事務是否送出、參數是否清除、datareader傳回的參數重載等n種場景。

再簡化解釋:

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

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

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

我們可以用reflector在微軟的内庫裡搜helper或utitliy結尾定義的類,可以随便挑着看:

不該活着的SqlHelper和DBHelper前言:1:定義Static變量需要考量的兩個因素:記憶體和并發:2:資料庫操作類不應該為設計為static:3:關于XXXHepler或XXXUtility的思維定義:悖論出來了:總結:關于文章被侵權問題:
不該活着的SqlHelper和DBHelper前言:1:定義Static變量需要考量的兩個因素:記憶體和并發:2:資料庫操作類不應該為設計為static:3:關于XXXHepler或XXXUtility的思維定義:悖論出來了:總結:關于文章被侵權問題:

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

2:内部應該(或大部分)是靜态方法。

我在園子裡掃了一下,發現大部分的sqlhelper類或dbhelper在經過項目的實戰後,都知道該轉成執行個體方式提供。

可是,既然都轉成了執行個體,為啥還叫sqlhelper或dbhelper???

應該改名的!

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

因為:資料庫操作設計不應該為static,同時helper字尾的不該設計為執行個體類。

是以:在資料庫操作類設計裡,sqlhelper和dbhelper不該存活。

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

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

@dudu,@部落格園 文章被今日頭條盜了,還沒注明作者和來源,怎麼弄它?:

<a href="http://toutiao.com/i6315940257556595202/">http://toutiao.com/i6315940257556595202/</a>

不該活着的SqlHelper和DBHelper前言:1:定義Static變量需要考量的兩個因素:記憶體和并發:2:資料庫操作類不應該為設計為static:3:關于XXXHepler或XXXUtility的思維定義:悖論出來了:總結:關于文章被侵權問題:

本文原創發表于部落格園,作者為路過秋天,原文連結:http://www.cnblogs.com/cyq1162/p/5745325.html