沉思滥用:“强力使用,破坏滥用”

英国前首相本杰明·迪斯雷利(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.mzph.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;文…