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

滥用static

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

滥用static

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358298.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cobalt strike加载插件出现乱码

问题描述 插件 加载成功出现乱码 解决方法 在Cobalt strike目录下执行命令指定编码打开客户端解决。 java -Dfile.encodingutf-8 -XX:ParallelGCThreads4 -XX:AggressiveHeap -XX:UseParallelGC -Xms512M -Xmx1024M -jar cobaltstrike.jar1 成功解决

新网站链接提交入口攻略

很多网站没有被收录,也没有排名,经常有SEO站长向我抱怨。其实提升网站收录有方法和诀窍的。下面我详细的为大家分享,如何向百度提交链接,提升网站被的机率。 很多新手站长,网站上线后没有主动的向搜索引擎提交,spider在短期内无法第一时间发现新网站,这个时候我们 需要…

MariaDb数据库管理系统的学习(一)安装示意图

MariaDB数据库管理系统是MySQL的一个分支。主要由开源社区在维护,採用GPL授权许可。开发这个分支的原因之中的一个是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区採用分支的方式来避开这个风险。 MariaDB的目的是全…

内置序列化技术

本文是我们名为“ 高级Java ”的学院课程的一部分。 本课程旨在帮助您最有效地使用Java。 它讨论了高级主题,包括对象创建,并发,序列化,反射等。 它将指导您完成Java掌握的过程! 在这里查看 ! 目录 1.简…

初级前端工程师笔试技巧总结,祝你顺利拿高分

某大型外包公司安排新人去某大型保险公司驻场开发,简单粗暴的衡量一个工程师的水平就是笔试,这个环节是必不可少的,必须要过了笔试题才能算正式的驻场开发,不然只能是支持,消耗公司资源的废柴,一般笔试会有两次机会,我特殊情况考了三次,一套安全题(10题选择题共100分,…

HDU 5439 Aggregated Counting

题目大意: 由1开始不断往数组中添加数 就是按照当前所在位置所在的数表示的个数添加这个数目的数 1 2 2 3 3 后面因为要填4,而4号位置为3,说明之后要填3个4 问题就是给定一个n,找到n出现的最后位置p,再找p出现的最后位…

Ubuntu 安装msfconsole

Ubuntu 安装msfconsole 1.进入到opt目录下 cd /opt/1 2.下载安装文件 msfupdate.erb sudo wget https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb1 3.将文件msfupdate.erb重命名为msfinstal…

域名解析是否生效实时检测(阿里云DNS检测)

测试域名解析生效的方法有以下四类 域名解析生效测试本地域名解析生效测试测试命令dig或nslookup全国各地运营商解析生效测试域名解析生效测试 可帮助用户快速排查域名、DNS、网站问题,点击下方蓝色字体立即测试。 阿里云DNS检测 本地域名解析生效测试 此查询工具可以检测…

为什么需要多线程

对于这个问题可能很多朋友会说是为了高性能,个人觉得这是误解,多线程不等于高性能,从cpu(单核)的角度上看单线程才能带来最高性能。 对于单纯的运算任务来说一条线程依次执行到底肯定是最快速的(因为线程间…

PhpMyAdmin后台getshell

PhpMyAdmin简介 PhpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库。借由此Web接口可以成为一个简易方式输入繁杂SQL语法的较佳途径,尤其要处理大量资料的汇入及汇出…

app mvc框架_Google App Engine上的Spring MVC和REST

app mvc框架前段时间,我写了一篇关于如何使用Spring MVC实现Restful Web API的文章 。 阅读我以前的文章以了解它。 在那篇文章中,它开发了一个简单的Rest示例。 为了测试该应用程序,将文件复制到Web服务器(例如Tomcat &#xff0…

谷歌浏览器如何将繁体字设置成中文?

今天刚拿到公司发给我的电脑,这个电脑是戴尔的,不知道用了多少年啦,处理器是i3的,CPU8+50O还行,总体感觉一般,不卡顿,办公的地方网速跟蜗牛一样,整个电脑应该是重置过的或者重装了系统,作为开发下载常用的浏览器(谷歌、火狐、IE)、编译器、IM工具等还是很有必要的,…

Python学习笔记 -- 第一章

本笔记参考廖雪峰的Python教程 简介 Python是一种计算机高级程序设计语言. 用Python可以做什么? 可以做日常任务,比如自动备份你的MP3;可以做网站,很多著名的网站包括YouTube就是Python写的;可以做网络游戏的后台等等&…

红队技巧-域渗透的协议利用

1.pth(hash传递) 1.1 PTH简介 哈希传递(pth)攻击是指攻击者可以通过捕获密码的hash值(对应着密码的值),然后简单地将其传递来进行身份验证,以此来横向访问其他网络系统,攻击者无须通过解密hash值来获取明文密码,因为对于每个Session hash值都…

你这么喜欢敲代码,那么技术的乐趣在哪里?

在中国的技术圈子里,流行着这样一种说法:过了三十五岁,就一定得改行。在技术飞速发展的今天,只要稍不留神,就会掉下队来。因此,诸多技术工作者在仔细权衡利弊之后,终于还是决定跳离技术这个是非之地,将工作机会让给那些更青春更朝气的年轻一辈们。 当然,还是有相当一部…

将数据库日志添加到JUnit3

在过去的十年中,我们已经编写了成千上万的JUnit3测试,现在正尝试将结果合并到数据库中,而不是分散的日志文件中。 事实证明,扩展TestCase类非常容易做到这一点。 注意:这种方法并不直接适用于JUnit4或其他测试框架&…

make and make bzImage

2.6内核 make make bzImage make modules 无非是改下Makefile而已 2.4 内核 01.make menuconfig 02.make dep 03.make bzimage 04.make modules 05.make modules_install 06.make install 2.6 内核 01.make menuconfig 02.make 03.make modules_install 04.make install转载于…

谈一谈我对前端的学习路线及方法的一些心得

到现在为止,前端工程师已经成为研发体系中的重要岗位之一。可是,与此相对的是,我发现极少或者几乎没有大学的计算机专业愿意开设前端课程,更没有系统性的教学方案出现。大部分前端工程师的知识,其实都是来自于实践和工作中零散的学习。 首先是前端的基础知识,常常有一些工作多…

Veil生成免杀payload 渗透win10 获取靶机shell

一:实验环境 两台机器处于同网段 攻击机:kali 192.168.115.134 靶机:win10 192.168.115.1 二:Veil下载、安装、使用 kali里默认没有安装Veil,我们通过命令行安装: apt-get update && apt-get inst…

在使用Gradle构建的Spring Boot应用程序中覆盖Spring Framework版本

如果要使用或仅通过Spring Boot检查Spring的最新版本,但当前的Spring Boot版本取决于旧的Spring版本,则需要稍微调整Gradle构建配置。 例如,在撰写本文时,Spring 4.2.1和Spring Boot 1.2.5是当前版本。 Spring Boot 1.2.5依赖于S…