怎样避免 i f 判断过多,全复杂度较高,代码不美观的问题?
没有什么好的设计方式可以实现,减少一个方法中出现几十个 if 匹配的判断?
现在要做一个判断客户是否通过验证的接口。
一共有30多个验证规则的判断, 每个规则对应一个规则号;
这个接口只需要返回是否验证通过 接口参数是一个数组,数组里面放入的是需要验证哪些规则的规则号;
我想到的比较原始的方法可能是
/**
* 验证客户是否通过验证
* @param rules 需要验证的多条规则的对应码的数组
/
public boolean checkPass(int[] rules){
boolean isPass = true;
for(int rule:rules){
if(!isPass){
break;//前一项不通过直接结束;
}
if(1==rule){
isPass = doCheck_1();
}
if(2==rule){
isPass = doCheck_2();
}
if(3==rule){
isPass = doCheck_3();
}
/
*
*/
if(39==rule){
isPass = doCheck_39();
}
}
return isPass;
}
但是这样代码写出来圈复杂度肯定超的不知道哪去了。。。
请教大家有什么方法或是用什么设计模式解决这样的问题比较好?
changchang 写道
可以通过map的方式来对这种if-else的情况进行解偶。
用一个接口把验证操作抽象出来。
public interface CheckRule {
public boolean doCheck();
}
然后定义具体的验证规则类实现这个接口:
public class CheckRule1 implements CheckRule {
public boolean doCheck() {
//doCheck1
...
}
}
在验证服务类初始化的时候,建立起一个规则号到规则类的映射。
Map rules = new HashMap();
rules.put(1, new CheckRule1());
这工作部分可以放在配置文件(如,spring)中完成,这样以后需要增减修改规则的时候会比较方便。
最后把checkPass改写一下就可以了。
public boolean checkPass(int[] ruleCodes){
for(int ruleCode : ruleCodes) {
if(!rules.get(ruleCode).doCheck()) {
return false;
}
}
return true;
}
怎样避免 i f 判断过多,全复杂度较高,代码不美观的问题?的更多相关文章
- 判断字符串中是否有SQL攻击代码
判断一个输入框中是否有SQL攻击代码 public const string SQLSTR2 = @"exec|cast|convert|set|insert|select|delete|u ...
- 一款jQuery仿海尔官网全屏焦点图特效代码
一款jQuery仿海尔官网全屏焦点图特效代码,带有左右箭头的jQuery焦点图切换特效. 当焦点图切换时,下方的三块小图也相对应的进行切换.并且特效还兼容头疼的IE6.赶快去和谐了它吧! 适用浏览器: ...
- C# WinForm中 让控件全屏显示的实现代码
夏荣全 ( lyout(at)163.com )原文 C#中让控件全屏显示的实现代码(WinForm) 有时候需要让窗口中某一块的内容全屏显示,比如视频播放.地图等等.经过摸索,暂时发现两种可行方法, ...
- C#进行回文检测,判断字符串是否是回文的代码
下面代码内容是关于C#进行回文检测,判断字符串是否是回文的代码,应该是对各位朋友有些好处. Console.WriteLine("算法1:请输入一个字符串!");string st ...
- 基于jQuery带进度条全屏图片轮播代码
基于jQuery带进度条全屏图片轮播代码.这是一款基于jQuery实现的oppo手机官网首页带进度条全屏图片轮播特效.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div ...
- 判断字符串中是否包含Emoji表情代码
判断字符串中是否包含Emoji表情代码: + (BOOL)stringContainsEmoji:(NSString *)string { __block BOOL returnValue = NO; ...
- JavaScript判断是否全为中文,是否含有中文
来源于:http://blog.csdn.net/yenange/article/details/7463897 第一种代码(全为中文则返回"true",不全为中文则返回" ...
- jquery控制动态生成的gridview中多列checkbox的全选反选及自动判断是否全选状态
动态生成的Gridview的前台html代码如下: <table class="usertableborder" cellspacing="0" ...
- OSG addEventHandler W键显示网格 L键控制光照 F键切换全屏窗口 S键显示统计数据 事件处理器
#include <osgGA/StateSetManipulator> #include <osgViewer/ViewerEventHandlers> // add the ...
随机推荐
- [转]JAVA虚拟机的生命周期
JAVA虚拟机体系结构 JAVA虚拟机的生命周期 一个运行时的Java虚拟机实例的天职是:负责运行一个java程序.当启动一个Java程序时,一个虚拟机实例也就诞生了.当该程序关闭退出,这个虚拟机实例 ...
- 原生态AJAX详解和jquery对AJAX的封装
AJAX: A :Asynchronous [eI`sinkrenes] 异步 J :JavaScript JavaScript脚本语言 A: And X :XML 可扩展标记语言 AJAX现在 ...
- sourceTree 更新svn提示can't locate SVN/Core.pm
装了sourceTree一直没有怎么用,今天试着用用,居然报错 can't locate SVN/Core.pm 详细报错如下: Can't locate SVN/Core.pm in @INC (y ...
- 收藏的牛人的Backbone分享教程
http://yujianshenbing.iteye.com/category/256978 感谢御剑神兵,目前正在看,为源码分析做准备. 今天是2015年4月13号,看了前两篇,
- bicycle
http://bj.ganji.com/zixingchemaimai/611076069x.htm
- Http协议访问DataSnap Rest 服务器
用TIDHttp访问DataSnap Rest服务器,在服务器采用了用户验证的情况下,客户端需要注意下面的细节,否则不能正常连接. 假如服务器有如下的用户验证: procedure TSC.DSAut ...
- SecureCRT清屏
Ctrl + l:清屏Ctrl + c:终止命令Ctrl + z:挂起命令
- 《C++primer》v5 第1章 开始 读书笔记 习题答案
从今天开始在博客里写C++primer的文字.主要以后面的习题作业为主,会有必要的知识点补充. 本人也是菜鸟,可能有不对之处,还望指出. 前期内容可能会比较水. 1.1略 1.2略 1.3 cin和c ...
- excel具有制作甘特图的功能
1.Excel最大功能:数据处理.统计分析. 2.数据有效性验证: 长数字输入方法,文本前面加英文"'"(单引号)或使用文本转换. 身份证号:数据.数据有效性.文本长度. 性别:数 ...
- 【Android】配置APK开发环境
1.安装java jdk去oracle公司下载jdk-7u15-windows-i586.exehttp://www.oracle.com/technetwork/cn/java/javase/dow ...