Offensive Coding

2024-01-14 18:38
文章标签 coding offensive

本文主要是介绍Offensive Coding,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考自:http://www.artima.com/weblogs/viewpost.jsp?thread=168511

   一直以来只知道防御式编程,《代码大全》中也专门有一章讲述防御式编程,防御式编程又称被动编程。有一个比喻是说开车时司机只遵守交通规则是远远不够的,还得时刻提防其他意外因素,如马路杀手、其他醉酒的司机等等。对应在编程中就是“不能信任用户的输入,必须执行相应的参数检查”。

   而offensive coding则与此相反,它的中文意思是攻击式编程或者主动编程。

   先看一段简单的代码:

private void addResolution(List<Flag> flags) {if (flags != null) {if (supportedAdapters.contains(Adapter.LOW) || supportedAdapters.contains(Adapter.MEDIUM)) {flags.add(new ResolutionFlag(ADAPTED));} }
} 

   这段代码有啥问题?也许有人的第一反应是这段代码应该使用Guard Clause,即改成下面这样:

private void addResolution(List<Flag> flags) {if(flags == null)return;if (supportedAdapters.contains(Adapter.LOW) || supportedAdapters.contains(Adapter.MEDIUM)) {flags.add(new ResolutionFlag(ADAPTED));}
} 

   但其实问题不在于此,而在于这一行代码:

if(flags == null) {...

   既然是private方法,那么完全可以在类内部自己保证传入的参数flags不为null,而不用进行多余的null check。

滥用null check是糟糕代码的标识。

   null check是不可或缺的。如果你在你的代码中到处传递null,那么接收参数并处理的方法进行null check是必要的。但是这也意味着你的代码很糟糕。你在给自己增加额外负担(所有有参数的方法开头都必须进行null check),你的代码也很难复用。

   另外一个例子:

public String [] getParameters() {if (intParms.length  == 0) {return null;}String [] result = new String[intParms.length];for(int n = 0; n < intParms.length; n++) {result[n] = "parameter " + intParms[n];}return result;
}

   这段代码有什么问题呢?如果这个方法被你自己在同一个项目中其他地方使用还好,你知道返回值可能为null,所以你会进行null check。而如果是你的同事在使用这段代码,或者这段代码被打包在Jar中被世界上某个角落的另一个程序员使用呢?他们不会像你一样对你的代码这么熟悉。他们很可能忘记null check,比如如下:

// 世界上某个角落的其他程序员Fork在使用你的Jar包中的getParameters方法
public void foo() {...int len = new ConcreteService().getParameters().length;...
}

   很可能这段代码在大部分情况下都能正常运行,而不会抛出NullPointerException,于是这位程序员又将这段代码打包到他的Jar包里,之后又有第三个程序员John来使用Fork的Jar包中的foo()方法,如下:

// John使用Fork的Jar包中的代码
public void bar() {...new Delegator().foo();...
}

   OK,问题来了,大部分时候这段代码也执行正常,但是某一天bar()突然抛出NullPointerException,你最初挖的“坑”潜伏这么久,终于有人掉进去了。John只能骂一句“好坑!”或者“Oh, shift!”了。那么最初的getParameters()方法该怎么写才好呢?很简单,像下面这样即可:

public String [] getParameters() {String [] result = new String[intParms.length];for(int n = 0; n < intParms.length; n++) {result[n] = "parameter " + intParms[n];}return result;
}

    现在如果intParms是一个空数组的话,返回的也是一个空数组。但如果intParms是null怎么办呢?很简单,intParms显然是类变量或者类成员,你只需要保证intParms始终不为null即可,比如这样:

private int[] intParms = new int[0];

    然后任何对intParms的修改都不能将其设为null,但可以把它重置为空数组。这样当前类内部的处理负担可能加重了,但其他类的负担却大大减轻,别人也将更乐意使用你的代码。

 

这篇关于Offensive Coding的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/606137

相关文章

【算法:二分查找】java算法二分查找,如何通过二分查找找到重复元素的第一个,coding

二分查找算法,是基于有序的结果集进行查询的 二分查找的时间复杂度是O(logN) 写一段二分查询的代码: public static void main(String[] args) {int[] data = new int[]{1, 2, 3, 3, 5, 5, 6, 8, 9, 9, 10};int queryData = 5;int index = queryDataIndex(qu

《WEB开发-HEXO博客搭建》第4章 同步到Coding

笔者博客地址 1.注册Coding.net账号 Coding官网:https://coding.net/ 【注意】如果不想花钱的话要绑定腾讯云可以免费升级,笔者使用的是绑定腾讯云升级的。 图1 2.新建项目 注意项目名与注册用的账户名一致,这里我用的是ouxiaolong。 图2 图3 3.添加公钥 上面设置完毕之后点击创建项目,然后点击设置->部署公钥->新建

代码规范工具大比拼---Alibaba Java Coding Guidelines

代码规范工具大比拼---Alibaba Java Coding Guidelines   一,序言        对于代码规范的工具,市场上有很多很多, 我们常常说:”工欲善其事必先利其器”, 一个非常强大的代码检查工具, 能让很多代码实践者减少很多多不必要的小错误,尤其是对于一个团队来说,能较好的统一代码规则.   二,详情    1,Sonar

【Git】更新拉取Coding子仓库代码 及 过程中用户名密码输什么 git submodule

背景: 克隆拉取完主仓库,没有初始化子仓库 主仓库目录下有.gitmodules文件,存储了子仓库路径和url [submodule "aa"]path = aaurl = git@e.coding.net:aa.git[submodule "bb"]path = bburl = git@e.coding.net:bb.git 在主仓库目录下输入以下命令拉取更新子仓库代码 git s

sublime text3 安装插件,以及Zen Coding 写法简单了解

参考的文章 1、 http://blog.csdn.net/admin_yi/article/details/53608965 2、 http://www.cnblogs.com/tinyphp/p/3217457.html 安装说明 3、 http://www.cnblogs.com/Rising/p/3741116.html 需要安装的插件的说明 4、 http://www.xia

iOS OC底层面试题(KVC(Key-value coding)

KVC(Key-value coding) -(id)valueForKey:(NSString *)key;-(void)setValue:(id)value forKey:(NSString *)key; KVC就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值。而不需要调用明确的存取方法。这样就可以在运行时动态地访问和修改对象的属性。而不是在编译时

coding algorithm

迪杰斯特拉算法原理Dijkstra - 云+社区 - 腾讯云 (tencent.com)

eclipse开发提高coding 效率

请大家不要忽略编码效率对生产效率的提高影响,有点心得,跟大家分享下。 细节决定成败-6sigma。 btw:请大家不要跟我讨论编码效率的重要性,我同意有很多事情更重要。 麻烦投入门贴的朋友给点建议,谢谢。 写程序是一个创造过程,如同写文章,如果把思路理清楚,剩下的事情就是coding了。 纯coding的过程是很枯燥的,如何想办法把这个过程变得爽一点呢。 几个方面: 1.提

{ Cracking The Coding Interview: 150 programming QA } --- Arrays and Strings

Hashtable, ArrayList (Dynamically resizing array, providing O(1) access), StringBuffer (do string concatenation) 1. 判断string是否有重复字符,不允许使用其他数据结构。 Step 1: 问清楚限制,string的编码是ASCII还是Unicode a. 如果可以用其他数

Coding创建远程分支,并本地拉取远程新分支

第一步 进入项目的分支管理,点击创建分支 第二步 创建成功后,我们就可以看到成功创建的远程分支 第三步 android studio执行查看所有分支命令,发现新创建的分支没有(此时本地分支是master) 第四步: 此时需要执行git fetch命令 第五步: 再次执行 git branch -a,会发现此时的远程分支已经包含我们新创建的分支 第六步 执行git c