沉思濫用:“強力使用,破壞濫用”

英國前首相本杰明·迪斯雷利(Benjamin Disraeli)曾有一個古老的說法,說謊言分為三種:“謊言,該死的謊言和統計數據”。 這里的暗示是統計數據很容易彌補它們是不可靠的。 但是,統計學在經驗科學中得到了廣泛的應用,因此它們肯定具有某些優點嗎? 實際上,它們有很多優點。 但僅當正確使用它們時。 問題是它們很容易被濫用。 當被濫用時,會出現錯誤信息,進而弊大于利。

在軟件工程領域中,與這種敘述有很強的相似之處。 面向對象的語言引入了繼承的概念,這是促進代碼重用的聰明的主意。 但是,繼承(如果被濫用)很容易導致復雜的層次結構,并且很難更改對象。 濫用繼承會造成嚴重破壞,并且由于使用繼承(在Java中)只需要能夠拼寫“擴展”一詞,因此如果您不知道自己在做什么,就很容易就可以破壞這種破壞。 類似的故事可以通過多態和設計模式來講述。 我們都知道有人陷入地獄而致力于使用一種模式,而不是他們試圖解決的問題,而更多地思考該模式。 即使他們了解網橋和適配器之間的區別,架構的某些部分還是很有可能被過度設計。 也許值得記住的是,GOF設計模式中的每一個都已經在JDK中了 ,因此,如果您確實希望在您的體系結構中使用它,則不必看起來太遠-否則僅在有意義時使用它。

這種“強大的使用,破壞性的濫用”反模式在Java系統中無處不在。 Servlet過濾器是用于處理請求和響應的非常方便的功能,但這僅是它們要做的。 語言中沒有什么可以阻止開發人員將過濾器視為經典對象,而是向過濾器添加公共API和業務邏輯。 當然,決不要以這種方式使用過濾器,并且在出現故障時不可避免地會發生這種情況。 但是關鍵是,開發人員可以輕松地利用如此強大的功能,濫用它并破壞體系結構。 在Aspects中,甚至在異常(我們都已經看到拋出異常的情況下,僅返回布爾值會更有意義)以及其他許多功能中,“強大的使用,破壞性的濫用”的發生非常容易。

當容易犯錯誤時,不可避免地會發生錯誤。 Java編譯器不會說-“等等,您真的了解這個概念嗎?” 和代碼樣式工具還不夠復雜,無法發現對高級概念的濫用。 此外,沒有公司有時間讓最高級的人來檢查每一行代碼。 即使是最高級的工程師也會犯錯。

現在,這里寫的很多東西都是顯而易見的,并且已經被很好地記錄在案。 強大的功能通常必須很好地理解才能正確使用。 我認為值得一問的問題是,在以Java為中心的體系結構中是否有任何功能不那么容易濫用的強大功能或工程概念? 我建議至少有一個,即:封裝。 首先,讓我們考慮一下封裝是否不存在。 一切都將是公共的或全局的(如Javascript)。 一旦訪問范圍縮小,就會發生封裝,這通常是一件好事。 通過封裝行為是否會使架構更糟? 好吧,很難想到一個可能的情況。 如果將方法設為私有,則可能難以進行單元測試。 但這是真的嗎? 對調用它的方法進行單元測試總是很容易的,它將在同一類和邏輯單元中。

這里有個教訓要學習。 一旦設計了其他用途的東西,無論它是體系結構中的核心組件,實用程序庫類還是REST API,您都將要向世人介紹一下,請問自己:

  1. 人們濫用它有多容易? 它處于繼承的風險級別還是封裝的安全級別?
  2. 濫用的后果是什么?
  3. 您如何做才能最大程度地減少濫用及其后果?

旨在增加“強大的使用”并最大程度地減少“破壞性濫用”!

參考: 濫用的思考: 都柏林技術博客博客上的JCG合作伙伴 Alex Staveley的“強大使用,破壞濫用” 。

相關文章 :

  • Java 7功能概述
  • Java SE 7、8、9 –推進Java
  • 回收對象以提高性能
  • Java Secret:加載和卸載靜態字段
  • Java最佳實踐系列
  • 軟件設計法則

翻譯自: https://www.javacodegeeks.com/2011/12/musing-on-mis-usings-powerful-use.html

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

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

相關文章

centos和ubuntu下使用cron設置定時任務

1.啟動cron工具[ps:使用root權限] centos啟動cron兩種方式 a) /etc/init.d/crond start b) service crond start ubuntu啟動cron兩種方式 a) /etc/init.d/cron start b) service cron start(推薦) 2.添加定時任務[每個整點執行ls命令] centos crontab -e命令打開文件 添加一行:…

算法與數據結構(一)

這里的許多資源,有時間可用多看看,寫一下。 http://download.csdn.net/album/detail/3249/2 這個哥們的博客還不錯:http://u.cxyblog.com/2/articles-3.html轉載于:https://www.cnblogs.com/oxspirt/p/5805409.html

protected訪問權限_權限修飾符 /重寫

一 權限修飾符 private內容不能被繼承類:只有public / default 可以修飾 ,且default 默認出現protected訪問權限1.同包下的類2.不同包的子類,只能通過子父類關系訪問,只有子類中才可以使用.權限修飾符只能修飾成員,成員修飾符(成員變量|成員方法)二 重寫重寫和重載的區別:(都指…

NYOJ 26 孿生素數問題

孿生素數問題 時間限制:3000ms | 內存限制:65535KB難度:3描述寫一個程序,找出給出素數范圍內的所有孿生素數的組數。一般來說,孿生素數就是指兩個素數距離為2,近的不能再近的相鄰素數。有些童鞋一看到題就…

python importlib_importlib --- import 的實現 — Python 3.10.0a2 文檔

3.7 新版功能.這個模塊使得Python的導入系統提供了訪問*包*內的*資源*的功能。如果能夠導入一個包,那么就能夠訪問那個包里面的資源。資源可以以二進制或文本模式方式被打開或讀取。資源非常類似于目錄內部的文件,要牢記的是這僅僅是一個比喻。資源和包不…

原生js使用forEach()與jquery使用each遍歷數組,return false 的區別

原生js使用forEach()與jquery使用each()遍歷數組,return false 的區別: 1、使用each()遍歷數組a,如下: var a[20,21,22,23,24];$.each(a, function(index,val) {console.log(indexindex);if(index2){return false;}console.log(valval);}); …

配置Java EE應用程序或“將Bien付諸實踐”

過去,有關應用程序配置的討論很多。 我不知道誰拉開了辯論的序幕,但是最基礎的閱讀(著眼于未來的Java EE 7及更高版本)是Antonio Goncalves的帖子[辯論] – Java EE 7中的配置如何 ? 事實是,使用香草Java E…

HTML5 Canvas入門

HTML5的canvas&#xff08;畫布&#xff09;元素使用JavaScript在網頁上繪制圖像。下面以一個簡單例子及其效果圖&#xff08;圖1&#xff09;開始&#xff1a; <!DOCTYPE HTML> <html><head><style type"text/css"> canvas{border:dashed 2…

NYOJ 27 大數階乘

大數階乘 時間限制&#xff1a;3000ms | 內存限制&#xff1a;65535KB難度&#xff1a;3描述我們都知道如何計算一個數的階乘&#xff0c;可是&#xff0c;如果這個數很大呢&#xff0c;我們該如何去計算它并輸出它&#xff1f; 輸入輸入一個整數m(0<m<5000)輸出輸出m的…

泄漏:Oracle WebLogic Server 12g

JavaOne已經比我們落后了將近一個星期&#xff0c;我仍在撰寫有關它的詳細博客文章 。 我真的很驚訝的事實是&#xff0c;我沒有看到任何提及我最喜歡的應用程序服務器更新的事實。 是的&#xff0c;我喜歡WebLogic產品。 從一開始。 自從收購BEA以來&#xff0c;甲骨文一直對我…

畫家問題

【題目描述】 有一個正方形的墻&#xff0c;由N*N個正方形的磚組成&#xff0c;其中一些磚是白色的&#xff0c;另外一些磚是黃色的。Bob是個畫家&#xff0c;想把全部的磚都涂成黃色。但他的畫筆不好使。當他用畫筆涂畫第(i,j)個位置的磚時&#xff0c;位置(i-1,j)、(i1,j)、(…

8-IO總結

3、 4、 5、 轉載于:https://www.cnblogs.com/fubaizhaizhuren/p/5026207.html

NYOJ 36 ??最長公共子序列

最長公共子序列 時間限制&#xff1a;3000ms | 內存限制&#xff1a;65535KB難度&#xff1a;3描述咱們就不拐彎抹角了&#xff0c;如題&#xff0c;需要你做的就是寫一個程序&#xff0c;得出最長公共子序列。tip&#xff1a;最長公共子序列也稱作最長公共子串(不要求連續)&…

python 發郵件_python發郵件

smtplibPython提供smtplib模塊&#xff0c;該模塊定義了一個SMTP客戶端會話對象&#xff0c;可用于使用SMTP或ESMTP偵聽器守護程序向任何互聯網機器發送郵件。這是一個簡單的語法&#xff0c;用來創建一個SMTP對象&#xff0c;稍后將演示如何用它來發送電子郵件 import smtplib…

Java SE 7、8、9 –推進Java

今天&#xff08;注&#xff1a;2011年10月4日&#xff09;是主題演講日。 JavaOne Keynote將于今早從上午8:30到10:30進行&#xff0c;而我的新聞通行證又一次讓我很早就開始了。 因此&#xff0c;我有時間在所有關鍵球員準備就緒并可能感到緊張的同時為其拍攝一些非常個性化的…

Ferguson游戲

考慮一個簡單的游戲&#xff1a; 有兩個盒子&#xff0c;其中一個裝有m顆糖、另一個裝有n顆糖&#xff0c;將這樣的狀態記為(m,n)。每次的移動是將其中一個盒子清空&#xff0c;把另一個盒子的一些糖拿到被清空的盒子里使得兩個盒子至少各有一顆糖。兩個操作者輪流進行操作&…

undefined和NUll的區別

Undefined類型只有一個值 即特殊的undefined 在使用var聲明變量但未對其加以初始化時 這個變量的值就是undefined var messagealert(message undefined); //true此例子聲明message 但未對其進行初始化&#xff0c;比較這個變量的自變量與undefined字面量 結果表明他們是相等的…

NYOJ 106 背包問題

背包問題 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB難度&#xff1a;3描述現在有很多物品&#xff08;它們是可以分割的&#xff09;&#xff0c;我們知道它們每個物品的單位重量的價值v和重量w&#xff08;1<v,w<10&#xff09;&#xff1b;如果給…

python數據挖掘與機器學習實戰_Python數據挖掘與機器學習技術入門實戰(1)

什么是數據挖掘?數據挖掘指的是對現有的一些數據進行相應的處理和分析&#xff0c;最終得到數據與數據之間深層次關系的一種技術。例如在對超市貨品進行擺放時&#xff0c;牛奶到底是和面包擺放在一起銷量更高&#xff0c;還是和其他商品擺在一起銷量更高。作者&#xff1a;韋…

使用Spring 3.1和基于Java的配置構建RESTful Web服務,第2部分

1.概述 本文介紹了如何在Spring中設置REST –控制器和HTTP響應代碼&#xff0c;有效負載編組配置和內容協商。 2.在Spring了解REST Spring框架支持兩種創建RESTful服務的方式&#xff1a; 與ModelAndView一起使用MVC 使用HTTP消息轉換器 ModelAndView方法較舊&#xff0c;文…