怎样避免 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 ...
随机推荐
- ios 尺寸
pre iPhone5 Default.png (320x480px) – "iPhone Portrait iOS5,6 – 1x" Default@2x.png (640x96 ...
- Foundation框架—字符串
Foundation框架—字符串 一.Foundation框架中一些常用的类 字符串型: NSString:不可变字符串 NSMutableString:可变字符串 集合型: 1) NSArray:O ...
- iOS开发拓展篇—封装音频文件播放工具类
iOS开发拓展篇—封装音频文件播放工具类 一.简单说明 1.关于音乐播放的简单说明 (1)音乐播放用到一个叫做AVAudioPlayer的类 (2)AVAudioPlayer常用方法 加载音乐文件 - ...
- this kernel requires an x86-64 CPU, but only detected an i686 CPU. unable to boot - please ues a ker
http://blog.csdn.net/xiao_cs/article/details/7728529 this kernel requires an x86-64 CPU, but only de ...
- good
1,将NodeList 转化成 Arrayvar divs = Array.from(document.querySelectorAll('div'));2,将 arguments 转化成 Array ...
- Spark Streaming之旅
1. 打开spark-shell 2. 建立StreamingContext import org.apache.spark.streaming._ import org.apache.spark.s ...
- hdu 2059
ps:终于解决了....卡了我好久.最后用了DP.然后还有记忆化搜索优化了一下.终于AC了 思路:要计算dp[n](就是到第n个站的最短时间,也就是最优方案),必须知道dp[0]到dp[n-1] 设j ...
- Java基础小总结
1,Java事件处理机制 (1)三部分:事件源.事件(处理)对象.实现事件监听器: (2)事件处理程序:可以通过ActionEvent e,e.getSource确定是哪个事件触发了,然后通过类似JB ...
- 上载android应用的apk文件变成了zip-网下转载的解决方案
下载android应用的apk文件变成了zip--网上转载的解决方案 下载android应用的apk文件变成了zip--网上转载的解决方案 解决方案一. 最近把开发的android应用放在公司网站上, ...
- [转]LUA元表
lua元表和元方法 <lua程序设计> 13章 读书笔记 lua中每个值都有一个元表,talble和userdata可以有各自独立的元表,而其它类型的值则共享其类型所属的单一元表.lua在 ...