不該活著的SqlHelper和DBHelper

来源:http://www.cnblogs.com/cyq1162/archive/2016/08/07/5745325.html
-Advertisement-
Play Games

還記得剛學ADO.NET的情景麽?還記得當年是怎麼從ADO.NET被忽悠到用SqlHelper的麽?話說從入門到走上工作崗位那些年,我們就一直被純純地教導或引導,ADO.NET太原始,得封裝成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/

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • nodejs windows下的調用方法: C:\Users\owen>node helloworld.jsHello WorldHello: 25 C:\Users\owen>node getmodule.jsHello BYVoid C:\Users\owen>node app.jsHTTP S ...
  • 在Eclipse 創建動態WEB 工程,在src 下 創建 config.xml: 提示Error: Content is not allowed in prolog 查看為DOM 解析xml error, 查看網上加入 dom4j.jar,refrensh並無效果; // 解決辦法: 用記事本創建 ...
  • 實例運行結果如下 實例運行結果如下 ...
  • 今天寫了個java類連接oracle,拋出了這個問題 java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:@127.0.0.1:1521:orcl; 很顯然是URL錯誤,以前碰到過類似的問題,故一起總結一下。 以前 ...
  • 前言:關於EL表示式開發用的非常多,現在我們回顧一下關於如果去操作EL表達式 1:EL表達式語法 所有EL表達式都是由{開始}結束,表達式中用.和[]操作符來訪問數據比喻${user.userName}、${user["userName"]}是等效的。 2:幾個重要的操作符 算術,邏輯,關係操作符和 ...
  • 學習設計模式的過程中,發現相關的作者們都會用UML類圖來表示一個模式的整體脈絡,這種方式確實直觀明瞭,既能體現巨集觀思路、又能兼顧實現細節。真的是很妙的工具。在開始正式學習設計模式之前,有必要對UML有個大概的掌握。然後,日後有望解鎖更多關於UML方面的技能,比如說:建模。哈哈,有點小興奮呢。 UML ...
  • 一、概述 外觀模式提供了一個統一的介面,用來訪問子系統中的一群介面。外觀定義了一個高層介面,讓子系統更容易使用。 二、解決問題 在上一講中,我們學習了適配器模式,它是用來轉換一個介面的,而外觀模式可以理解為轉換一群介面,客戶只要調用一個介面,而不用調用多個介面就可以達到目的。想想現實生活中例子,我們 ...
  • 一、概述 適配器模式將一個類的介面,轉換為客戶期望的另一個介面。適配器讓原本不相容的類可以合作無間 二、解決問題 從模式的定義中,我們看到適配器模式就是用來轉換介面,解決不相容問題的。想想我們現實生活中的適配器,最常用的就是手機充電器了,也叫做電源適配器,它把家用交流強電轉換為手機用的直流弱電。其中 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...