Java靜態方法可能會產生代碼異味

代碼氣味的定義 (來自維基百科):

“程序源代碼中任何可能表明存在更深層問題的癥狀。”

在Java中, 靜態方法允許您在“類范圍”內執行代碼,而不是像成員方法這樣的實例范圍。 這意味著,它們依賴于類級別的變量(如果有),傳遞給靜態方法的參數或任何其他全局可訪問的數據。 它們不是面向對象的。 對象具有與之關聯的狀態,并且只能通過實現該對象“行為”的方法進行操作。 靜態方法不在狀態上操作,它們不是面向對象的,實際上它們是過程式的。

這不好嗎?

不會。盡管Java是面向對象的,但有時還是需要和/或首選Java中的類似于過程的編程。 任何面向對象的語言的真正威力在于能夠在代碼中緊密實現現實生活中的系統模型的能力(請參閱我有關面向對象建模的文章 )。 但是,即使在最核心的對象模型中,也很可能會有一些粘合代碼或將以過程樣式實現的基礎結構代碼。

因此,如果Java中的類似于過程的編程不是“那么糟糕”并且靜態方法是過程編程的一種形式,那么靜態方法是否不好?

嗯……答案并不像是“是”或“否”那么簡單,無論您在其他博客上會讀到什么,但我可能會不斷爭論著為什么這實際上是必須在上下文中做出的決定,因此,讓我們重點關注一下我在Michael Minella博客的“如何模擬靜態方法”中遇到的一組語句:

“已經成為該語言基礎知識的部分(您要做的只是看一下Apache Commons項目以了解這一點)非常糟糕,以測試為名必須不惜一切代價避免。 Gosling(或其團隊中的某人)出于某種原因將其放入語言中,并且僅由于您的工具集不支持對它的測試是無稽之談而避免使用這些語言。 是時候獲得新的工具集了。”

首先,我想指出的是,僅僅因為某種東西已經成為一種語言的基本組成部分,并不意味著它就是“好”或應該做的事情。 查看已檢查的異常以供參考。 我記得EJB 1.x和2.x在過去成為Java EE的“基礎”部分,因此也請參考一下。

其次,盡管我在理論上確實同意Michael的觀點,即由于您的工具不支持某種特定的語言功能而使其愚蠢,但他的前提是靜態方法。 避免使用靜態方法是因為您的工具不支持靜態方法,這根本不是胡說。 實際上,由一些好的測試和/或模擬框架( Mockito是我最喜歡的框架)引起的阻抗類型 :) )和靜態方法可以確定地識別為代碼異味。 這并不意味著我們不應該這樣做,而是應該付出更多的努力來理解我們為什么這樣做,并在存在“更深層次的問題”時探索替代方法。

我想指出,至少有兩種類型的靜態方法通常不會在測試/模擬框架中表現出太大的阻力。 第一種類型是用作實用程序方法的靜態方法,就像在許多apache commons庫或您自己的內部commons庫中找到的方法一樣。 這些通常是支持特定方法目標的例程,并且將它們模擬/存根到單元測試之外是沒有意義的。 它們是實現的一部分,因此應進行測試。 第二種類型是靜態方法,用于代替構造函數,如Joshua Bloch在他的書《 Effective Java》中所展示的。 靜態方法的這種使用使您可以使用名稱具有非常描述性的方法來構造新對象,以及其他一些優點。 第二種靜態方法的分支可能包括工廠方法,但這取決于上下文。

當單元依靠靜態方法執行超出該單元職責范圍的邏輯時,由于靜態方法和測試框架阻抗而產生的最明顯的代碼異味。 在這些情況下,您的測試框架將對您不利,因為您無法對范圍外的邏輯進行存根/模擬,因為它是通過靜態方法“硬編碼”的。 這可以被視為“更深層的問題”,并且是大多數博客的焦點,這些博客告訴您不要使用靜態方法,因為測試變得異常困難或不可能。 更改設計方法以遵循依賴性反轉原則是另一種選擇。 對如何測試單元的更好的理解是另一個。

我強烈斷言,在使用靜態方法的情況下,您可能會從測試框架中得到的回退表示代碼有氣味,而不是您需要嘗試找到一個使用復雜的欺騙手段并將類加載器重新映射作為解決方案的框架。 應該準備評估一種特殊方法在其設計中的用途和基本缺陷。 Michael的博客文章使讀者太容易采用新的工具/框架,僅因為Java支持靜態方法并且您當前的測試框架闡明了一個阻抗-在這種情況下,阻抗反映了代碼的味道,需要一些更深入,更批判性的思考。

參考: Java靜態方法可能是 JCG合作伙伴 Christian Posta在Christian Posta Software博客上的代碼味道 。


翻譯自: https://www.javacodegeeks.com/2012/05/java-static-methods-can-be-code-smell.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373093.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373093.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373093.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android json 解析圖片,JSON解析并獲取android中的圖像

我想解析包含字符串和圖像的JSON對象。我的代碼正在工作,但它加載圖像太慢。我想加載另一個asynctask或服務的圖像,以減少加載時間。我怎樣才能做到這一點?哪一個是最好的方法使用asynctask或服務?這里是我的代碼JSON解析并獲取an…

Node Express4.x 片段視圖 partials

1.在Express 4.x使用片段視圖,需要引入partials模塊 步驟: 1.在全局中安裝express-partials模塊: 2.在本地模塊中安裝express-partials,將模塊安裝到package.json中: 3.在入口文件(如:app.js)中引入模塊: v…

bzoj1690:[Usaco2007 Dec]奶牛的旅行(分數規劃+spfa判負環)

PS:此題數組名皆引用:戳我 題目大意:有n個點m條有向邊的圖,邊上有花費,點上有收益,點可以多次經過,但是收益不疊加,邊也可以多次經過,但是費用疊加。求一個環使得收益和/花費和最大&…

安全密碼存儲–請勿做的事和Java示例

安全存儲密碼的重要性 作為軟件開發人員,我們最重要的職責之一就是保護用戶的個人信息。 沒有我們應用程序的技術知識,用戶別無選擇,只能相信我們正在履行這一責任。 令人遺憾的是,在密碼方面,軟件開發社區的記錄不一。…

紅米note4x Android7,紅米Note4X能升級安卓7.0嗎?紅米Note4X如何升級Android7.0?

歡迎來到PPL網站的行業資訊知識分類,你現在觀看的這篇文章要和大家分享的是關于紅米Note4X能升級安卓7.0嗎?紅米Note4X如何升級Android7.0?的一些相關內容,希望大家能夠感興趣,并且希望我們能夠幫助到你!在…

java基礎----數字簽名算法的介紹

數字簽名(又稱公鑰數字簽名)是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領域的技術實現,用于鑒別數字信息的方法。關于數字簽名的介紹,可以參見百度百科:http://baike.baidu.com/view/7626.htm…

Android宮格自動換行,九宮格視圖的布局及展示(相冊選擇)

上周一個朋友帶的項目出了點問題,招的ios開發人員在實現選取相冊圖片后用九宮格的樣式展示時遇到了瓶頸,花了將近2周都沒有解決。后來在跟我交流的過程中他把項目的圖片發給我看了下,看完我就笑了,這就只是個算法的問題&#xff0…

具有LCS方法的通用文本比較工具

常見的問題是檢測并顯示兩個文本(尤其是幾百行或幾千行)的差異。 使用純java.lang.String類方法可能是一種解決方案,但是對于此類操作最重要的問題是,“性能”將不能令人滿意。 我們需要一種有效的解決方案,其可能具有…

eclipse 開發 scala

(環境:jdk1.7,scala插件scala-2.1.1.2-site.zip) 1:下載scala插件 http://download.scala-ide.org/sdk/helium/e38/scala211/stable/site2:解壓到本地將這兩個文件里的jar包全部復制到eclipse的安裝目錄對應的文件夾里三:重啟eclipse這時會提…

關于這個博客

博客主要打算寫關于游戲制作方面的內容,包括directx,實時圖形知識等等方面的內容,作為一個渣暫時都是一些簡單的東西,努力找工作中...... 開這個博客主要目的是為了對自己做的事有個記錄吧,并且關于directx方面的東西本…

Quartz Scheduler失火指令說明

有時,Quartz無法在您需要的時間運行您的工作。 這有三個原因: 所有工作線程都忙于運行其他作業(可能具有更高的優先級) 調度程序本身已關閉 該作業是在過去的開始時間安排的(可能是編碼錯誤) 您可以通過…

android 代碼獲取屏幕圖像,安卓獲取屏幕以及獲得像素點 ~ 大樹洞

由于一些不可告人的需求,所以開始尋找各種可以實現安卓實時獲得屏幕上某個像素點的功能首先,將需求進行拆解,分別為1、獲得屏幕2、獲得屏幕上一個像素點獲得屏幕獲得屏幕分為比較多種的方式,在以前大致分為adb screencap 獲取當前…

海量端口掃描工具masscan

海量端口掃描工具masscanmasscan號稱是互聯網上最快的端口掃描工具,可以6分鐘掃描整個互聯網,每秒可以發送一百萬個數據包。為了提高處理速度,masscan定制了TCP/IP棧,從而不影響本地其他TCP/IP的數據傳輸。masscan提供較為豐富的選…

改進租房練習

代碼基本沒有改動&#xff0c;函數有變化&#xff0c;老師只用了一個函數&#xff0c;自己做寫了4個function&#xff0c;減少了代碼量 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio…

Google App Engine JAX-RS REST服務

在本文中&#xff0c;您將學習如何使用JAX-RS參考實現&#xff08;Jersey&#xff09;創建REST服務并將其部署在Google AppEngine上。 先決條件 對于本教程&#xff0c;您將需要&#xff1a; Google AppEngine帳戶 Eclipse Galileo&#xff08;3.5.x&#xff09; 適用于Java的…

libnids校驗和引起回放包不能正常捕捉

如題 取消校驗和校驗即可&#xff1a; struct nids_chksum_ctl temp;temp.netaddr 0;temp.mask 0;temp.action 1;nids_register_chksum_ctl(&temp,1); 在init之前。轉載于:https://www.cnblogs.com/yaoyuanfeixing/p/6308067.html

鴻蒙系統的全面開源,華為:打造全球的操作系統,鴻蒙今日全面開源!

原標題&#xff1a;華為&#xff1a;打造全球的操作系統&#xff0c;鴻蒙今日全面開源&#xff01;今日下午&#xff0c;2019華為全球開發者大會在華為松山湖基地正式開幕。華為正式對外推出了自研操作系統——鴻蒙系統(Harmony OS)。華為消費者業務CEO余承東指出&#xff0c;鴻…

android 獲取路徑目錄方法以及判斷目錄是否存在,創建目錄

Environment 常用方法&#xff1a; * 方法&#xff1a;getDataDirectory()解釋&#xff1a;返回 File &#xff0c;獲取 Android 數據目錄。* 方法&#xff1a;getDownloadCacheDirectory()解釋&#xff1a;返回 File &#xff0c;獲取 Android 下載/緩存內容目錄。* 方法&…

Maven不會吮吸。 。 。 但是Maven文件會

我不會參加整個Maven辯論&#xff0c;但是可以說我是所有最佳實踐的有力支持者&#xff0c;對我而言&#xff0c;Maven是最佳實踐的體現。 我的意思是說&#xff0c;Maven是圍繞特定的最佳實踐構建方法構建的。 注意&#xff0c;我說了一種特定的最佳實踐構建方法。 在現實世界…

html5 游戲制作教程,html5一步步實現超級瑪麗游戲制作(新手教程源碼)

【實例簡介】【實例截圖】【核心代碼】My first Gamebody {border:none 0px;margin:0px;padding:10px;font-size : 16px;background-color : #f3f3f3;}canvas {border : 1px solid blue;}// 頁面初始化函數function init(){//加載圖片,并存入全局變量 ImgCache,// 加載完成后,調…