hxtao001 2013-09-03 12:05
浏览 1455
已采纳

像这样多层if嵌套的代码如何优化

感觉自己看起来都费劲( ⊙ o ⊙ ),

[code="java"]
public String login() {
boolean loginpass = false;
Pckey pckey = null;
int validate = 0; // 密码验证标识
Integer keyright = 1;
HttpServletRequest request = ServletActionContext.getRequest();
String remoteIp = request.getRemoteAddr();
String localIp = request.getLocalAddr();
String passFlag = request.getParameter("validate");
if (StringUtils.isNotEmpty(passFlag)) {
validate = Integer.parseInt(passFlag);
}
if (StringUtils.isNotEmpty(username)) {
keyright = Integer.parseInt(userright);
pckey = pckeyService.findKey(username, keyright);
}
if (pckey != null) {
boolean locked = pckeyService.isLocked(pckey);
if (!locked) { // 没锁定

            if (pckeyService.reachMaxCount(pckey)) {
                pckeyService.clearErrorCount(pckey);
            }
            // 验证密码标识
            if (validate == 100) {
                pckeyService.clearErrorCount(pckey);
                HttpSession session = ServletActionContext.getRequest()
                        .getSession();
                session.setAttribute("keyname", username); // 登录名
                session.setAttribute("keyright", userright); // 登录权限
                Calendar c = Calendar.getInstance();
                c.add(Calendar.HOUR_OF_DAY, 10);
                session.setAttribute("logintime", c.getTime().toString()); // 登录时间
                loginpass = true;
            } else {

                int errorCount = pckeyService.addErrorCount(pckey);
                if (errorCount > 0) {
                    msg = "用户名或密码错误,剩余" + errorCount + "次key将被锁定";
                } else {
                    msg = "用户名或密码错误,此key已被限制登陆!";
                    pckeyService.setLockDate(pckey);
                }
            }
        } else {
            // 锁定
            msg = "此key已经被锁定,您无法登陆系统";
        }
    } else {
        // key 不合法
        msg = "请插入合法key";
    }

    // 添加审计日志
    auditlogService.addAuditlog(remoteIp, username, localIp, 1, 1,
            loginpass == true ? "登录系统成功!" : "登陆系统失败", 1);
    return loginpass == true ? SUCCESS : "error";
}

[/code]
[code="java"]
private List queryFromlist(List list) {
List sublist = new ArrayList();
if (list == null || list.size() == 0) {
return null;
}
for (AuditlogVO vo : list) {
if (StringUtils.isNotEmpty(startTime)) {
long starttime = DateUtils.date2LongNumber(startTime);
long createdate = DateUtils.date2LongNumber(vo.getCreatedate());
if (starttime > createdate)
continue;
}
if (StringUtils.isNotEmpty(endTime)) {
long endtime = DateUtils.date2LongNumber(endTime);
long createdate = DateUtils.date2LongNumber(vo.getCreatedate());
if (createdate > endtime)
continue;
}

        if (StringUtils.isEmpty(logType) || logType.equals("全部")
                || logType.equals(vo.getTypename())) {
            if (StringUtils.isEmpty(logaction) || logaction.equals("全部")
                    || logaction.equals(vo.getActionname())) {
                if (StringUtils.isEmpty(logLevel) || logLevel.equals("全部")
                        || logLevel.equals(vo.getLevelname())) {
                    if (StringUtils.isEmpty(logResult)
                            || logResult.equals("全部")
                            || logResult.equals(vo.getResult())) {
                        if (StringUtils.isEmpty(subname)
                                || subname.equals(vo.getSubname())) {
                            if (StringUtils.isEmpty(from)
                                    || from.equals(vo.getAddress())) {
                                if (StringUtils.isEmpty(targetIp)
                                        || targetIp.equals(vo.getObjname())) {
                                    sublist.add(vo);

                                }
                            }
                        }

                    }
                }
            }
        }

    }

    return sublist;
}

[/code]

  • 写回答

3条回答 默认 最新

  • chenqisdfx 2013-09-03 15:24
    关注

    第一个就不说了,如果不拆分的话,也是可以接受的。至于第二个,也就是private List queryFromlist(List list)方法中的for循环体,我倒是觉得有必要处理一下。
    比如,for中的第一第二个if语句可以提取为一个返回值为boolean的方法。这要for循环中就好看一点,然后第三个if语句不用提取函数,直接定义一个boolean变量,如下格式:
    boolean b = (StringUtils.isEmpty(logType) || logType.equals("全部") || logType.equals(vo.getTypename())) ;
    b &= (StringUtils.isEmpty(logaction) || logaction.equals("全部") || logaction.equals(vo.getActionname()));
    b &= (StringUtils.isEmpty(logLevel) || logLevel.equals("全部") || logLevel.equals(vo.getLevelname())) ;
    ....

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 PFENet的预训练权重
  • ¥15 程序哪有错误怎么改?
  • ¥15 交换机和交换机之间的链路带宽以及主机带宽的理解
  • ¥15 ai创想家对战模式代码
  • ¥15 集合A由3个2行4列二维数组构成,从集合A中任意取一个二维数组元素、如果该二维数组元素的对应列位置的上、下两数都是奇数,而且仅有2个列是奇数/奇数,则该数组有意义,并放入集合B中打印输出。
  • ¥15 电信IPV6 无法外网访问吗
  • ¥15 有偿求效果比较好的遥感影像匹配的c++代码
  • ¥15 博主,你好,我下载了你的智能网联汽车辅助驾驶安全信息检测系统,现在不会运行,可以教我吗,
  • ¥15 怎么在excle输入下列公式
  • ¥15 Arduino,利用modbus的RS485协议,进行对外置的温湿度传感器进行数据读取