V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
momuou
V2EX  ›  程序员

请问这段代码有什么问题?完全看不出有什么异常。。

  •  
  •   momuou · 2018-12-24 15:02:27 +08:00 · 4789 次点击
    这是一个创建于 2162 天前的主题,其中的信息可能已经有所发展或是发生改变。
    45 条回复    2018-12-25 14:39:01 +08:00
    momuou
        1
    momuou  
    OP
       2018-12-24 15:03:34 +08:00
    // 业务类型
    if (StringUtils.isNotBlank(countTypeId) && !"null".equals(countTypeId)) {
    paramMap.put("countTypeId", countTypeId.trim());
    // 日期
    if (StringUtils.isNotBlank(dealDate) && !"null".equals(dealDate)) {
    paramMap.put("dealDate", dealDate.trim());
    //地市编码
    if (StringUtils.isNotBlank(regionCode) && !"null".equals(regionCode)) {
    paramMap.put("regionCode", regionCode.trim());
    if (StringUtils.isNotBlank(payType) && !"null".equals(payType)) {
    //-支付类型( 0 待确认 1 通过 2 不通过
    paramMap.put("payType", payType.trim());
    try {
    int i = dataRecountService.updateDataPayType(paramMap);
    if (i > 0) {
    result.put("status", "1");
    result.put("msg", "提交成功");
    }
    } catch (Exception e) {
    logger.error(e.getMessage(), e);
    result.put("msg", "网络异常,请稍后再尝试。");
    }
    } else {
    result.put("msg", "选择的支付类型有误,请稍后重试");
    }
    } else {
    result.put("msg", "请选择确切地市进行查询后再进行审核");
    }
    } else {
    result.put("msg", "请选择确切日期进行查询后再进行审核.");
    }
    } else {
    result.put("msg", "业务类型不明,请联系管理员");
    }
    he583899772
        2
    he583899772  
       2018-12-24 15:06:50 +08:00
    一大推 if else 看到就头痛
    wsyzzz
        3
    wsyzzz  
       2018-12-24 15:08:52 +08:00
    跑一下看看报错呗,,看文本调试也太头疼了
    jingyulong
        4
    jingyulong  
       2018-12-24 15:10:17 +08:00
    现在哪里有报错吗?
    ukipoi
        5
    ukipoi  
       2018-12-24 15:13:25 +08:00
    countTypeId = " null";
    这样子是不是就不符合要求了
    Vegetable
        6
    Vegetable  
       2018-12-24 15:14:16 +08:00
    不是很合理哦,你上边是个 if,是不是"null "都能过?
    本身这个数据是哪来的我不要清楚,不过你是不是应该在 trim 后判空?
    Vegetable
        7
    Vegetable  
       2018-12-24 15:15:03 +08:00
    @Vegetable *要=>是
    jcsmallming
        8
    jcsmallming  
       2018-12-24 15:15:27 +08:00   ❤️ 1
    是有报错还是运行结果不符合预期?你直接贴这一段代码上来没有补充说明真的很难看啊
    misaka19000
        9
    misaka19000  
       2018-12-24 15:19:05 +08:00   ❤️ 2
    这个代码写的好烂,建议先重构下
    jorneyr
        10
    jorneyr  
       2018-12-24 15:23:14 +08:00
    这种数据校验, 我们会选择使用 hibernate validator 使用 @Valid 自动处理, 写代码太过麻烦
    nananqujava
        11
    nananqujava  
       2018-12-24 15:25:02 +08:00
    我靠 又是这种箭头型代码,这种代码也能通过审核?
    pipicat
        12
    pipicat  
       2018-12-24 15:47:31 +08:00
    每次校验的方法 StringUtils.isNotBlank(value) && !"null".equals(value) 应该可以合并成一个函数吧。而且代码都是有规律的,可以用反射字段名统一添加吧,搜了一下 @jorneyr 说的 hibernate validator 应该可以,原理应该类似
    kyuuseiryuu
        13
    kyuuseiryuu  
       2018-12-24 15:47:36 +08:00
    这个令人头痛的代码本身就是“异常”
    momuou
        14
    momuou  
    OP
       2018-12-24 16:06:38 +08:00
    @wsyzzz 不是报错--是想优化一下这种写法。。。
    momuou
        15
    momuou  
    OP
       2018-12-24 16:07:51 +08:00
    @jcsmallming 这种写法肯定是不符合预期的,其实一直都是写 if()else{return}这种的,可是参数多了就觉得麻烦,而且最后还是会走到事务里面去.
    momuou
        16
    momuou  
    OP
       2018-12-24 16:09:25 +08:00
    @misaka19000 这本身就是一段烂代码,就是想请教一下你怎么重构,瞎子都知道这种代码难维护,可是你要怎么写才能符合这种写法又优雅呢?
    momuou
        17
    momuou  
    OP
       2018-12-24 16:10:09 +08:00
    @kyuuseiryuu 就是本着我写着爽,维护的人想砍我的心态。。所以才放上来的。
    momuou
        18
    momuou  
    OP
       2018-12-24 16:11:00 +08:00
    @jorneyr 谢谢,我去查询一下。
    james2013
        19
    james2013  
       2018-12-24 16:14:42 +08:00
    问题:
    1)判断为空完善,应改为!"null".equals(countTypeId.trim())
    2)if else 嵌套太深,如下减少层级到 1 层:
    if (!StringUtils.isNotBlank(countTypeId)) {
    return;
    }
    if (!StringUtils.isNotBlank(dealDate)) {
    return;
    }
    ...
    momuou
        20
    momuou  
    OP
       2018-12-24 16:20:04 +08:00
    好吧,大背景就是本来写了一段自我感觉良好的代码,可是硬盘丢失了,代码只能重写,却写出这种后人难以维护的代码,感觉不太好,所以发上来请教一下各位。。刚刚上了个厕所,好像又记起来之前怎么写的了。
    if (StringUtils.isBlank(countTypeId) || "null".equals(countTypeId)) {
    // 业务类型
    result.put("msg", "业务类型不明,请联系管理员");
    }
    else if(StringUtils.isBlank(dealDate) || "null".equals(dealDate)){
    // 日期
    result.put("msg", "请选择确切日期进行查询后再进行审核.");
    }else if(StringUtils.isBlank(regionCode) || "null".equals(regionCode)){
    //地市编码
    result.put("msg", "请选择确切地市进行查询后再进行审核");
    }else if(StringUtils.isBlank(payType) || "null".equals(payType)){
    //-支付类型( 0 待确认 1 通过 2 不通过
    result.put("msg", "选择的支付类型有误,请稍后重试");
    }else{
    paramMap.put("countTypeId", countTypeId.trim());
    paramMap.put("dealDate", dealDate.trim());
    paramMap.put("regionCode", regionCode.trim());
    paramMap.put("payType", payType.trim());
    int i = dataRecountService.updateDataPayType(paramMap);
    if (i > 0) {
    result.put("status", "1");
    result.put("msg", "提交成功");
    }
    }
    return result;
    annielong
        21
    annielong  
       2018-12-24 16:21:02 +08:00
    反正个人写条件两种用 if,三种以上就换 switch,不过返回值提示这种可以定义字典,或者数组,可以统一维护
    momuou
        22
    momuou  
    OP
       2018-12-24 16:21:55 +08:00
    @james2013 这种写一两个还好,写多了容易烦躁
    momuou
        23
    momuou  
    OP
       2018-12-24 16:22:57 +08:00
    不会贴图,所以没什么贴上来没什么格式。。感谢提建议的各位。
    pipicat
        24
    pipicat  
       2018-12-24 18:24:29 +08:00   ❤️ 1
    写了一段,供你参考。
    public class Test {

    class Model {
    @Warning("业务类型不明,请联系管理员")
    public String countTypeId;
    @Warning("请选择确切日期进行查询后再进行审核")
    public String dealDate;
    @Warning("请选择确切地市进行查询后再进行审核")
    public String regionCode;
    @Warning("选择的支付类型有误,请稍后重试")
    public String payType;
    }


    public void Test(){

    Model model = new Model();
    HashMap<String,String> result = new HashMap<>();
    HashMap<String,String> paramMap = new HashMap<>();

    Field[] declaredFields = model.getClass().getDeclaredFields();
    boolean pass = true;

    for (Field field:declaredFields){
    if (field.getAnnotation(Warning.class)!=null){
    field.setAccessible(true);
    try {
    Object o = field.get(model);

    if (!isVaild(String.valueOf(o))) {
    pass = false;
    result.put(field.getName(),field.getAnnotation(Warning.class).value());
    break;
    } else {
    paramMap.put(field.getName(),String.valueOf(o).trim());
    }
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    }
    }
    }

    if (pass) {
    try {
    int i = dataRecountService.updateDataPayType(paramMap);
    if (i > 0) {
    result.put("status", "1");
    result.put("msg", "提交成功");
    }
    } catch (Exception e) {
    logger.error(e.getMessage(), e);
    result.put("msg", "网络异常,请稍后再尝试。");
    }
    } else {

    }

    }

    public boolean isVaild(String str){
    return StringUtils.isBlank(str) && !"null".equals(str);
    }

    }

    @Target(FIELD)
    @Retention(RUNTIME)
    @interface Warning{
    String value() default "";
    }

    具体细节可能还要调一下。
    lihongjie0209
        25
    lihongjie0209  
       2018-12-24 18:38:26 +08:00
    <iframe
    src="https://carbon.now.sh/embed/?bg=rgba(171%2C%20184%2C%20195%2C%201)&t=seti&wt=none&l=text%2Fx-java&ds=true&dsyoff=20px&dsblur=68px&wc=true&wa=true&pv=56px&ph=56px&ln=false&fm=Hack&fs=14px&lh=133%25&si=false&code=%257B%250A%250A%250A%2509%2509%252F%252F%2520%25E4%25B8%259A%25E5%258A%25A1%25E7%25B1%25BB%25E5%259E%258B%250A%2509%2509if%2520(StringUtils.isNotBlank(countTypeId)%2520%2526%2526%2520!%2522null%2522.equals(countTypeId))%2520%257B%250A%2509%2509%2509paramMap.put(%2522countTypeId%2522%252C%2520countTypeId.trim())%253B%250A%252F%252F%2520%25E6%2597%25A5%25E6%259C%259F%250A%2509%2509%2509if%2520(StringUtils.isNotBlank(dealDate)%2520%2526%2526%2520!%2522null%2522.equals(dealDate))%2520%257B%250A%2509%2509%2509%2509paramMap.put(%2522dealDate%2522%252C%2520dealDate.trim())%253B%250A%252F%252F%25E5%259C%25B0%25E5%25B8%2582%25E7%25BC%2596%25E7%25A0%2581%250A%2509%2509%2509%2509if%2520(StringUtils.isNotBlank(regionCode)%2520%2526%2526%2520!%2522null%2522.equals(regionCode))%2520%257B%250A%2509%2509%2509%2509%2509paramMap.put(%2522regionCode%2522%252C%2520regionCode.trim())%253B%250A%2509%2509%2509%2509%2509if%2520(StringUtils.isNotBlank(payType)%2520%2526%2526%2520!%2522null%2522.equals(payType))%2520%257B%250A%252F%252F-%25E6%2594%25AF%25E4%25BB%2598%25E7%25B1%25BB%25E5%259E%258B%25EF%25BC%2588%25200%2520%25E5%25BE%2585%25E7%25A1%25AE%25E8%25AE%25A4%25201%2520%25E9%2580%259A%25E8%25BF%2587%25202%2520%25E4%25B8%258D%25E9%2580%259A%25E8%25BF%2587%250A%2509%2509%2509%2509%2509%2509paramMap.put(%2522payType%2522%252C%2520payType.trim())%253B%250A%2509%2509%2509%2509%2509%2509try%2520%257B%250A%2509%2509%2509%2509%2509%2509%2509int%2520i%2520%253D%2520dataRecountService.updateDataPayType(paramMap)%253B%250A%2509%2509%2509%2509%2509%2509%2509if%2520(i%2520%253E%25200)%2520%257B%250A%2509%2509%2509%2509%2509%2509%2509%2509result.put(%2522status%2522%252C%2520%25221%2522)%253B%250A%2509%2509%2509%2509%2509%2509%2509%2509result.put(%2522msg%2522%252C%2520%2522%25E6%258F%2590%25E4%25BA%25A4%25E6%2588%2590%25E5%258A%259F%2522)%253B%250A%2509%2509%2509%2509%2509%2509%2509%257D%250A%2509%2509%2509%2509%2509%2509%257D%2520catch%2520(Exception%2520e)%2520%257B%250A%2509%2509%2509%2509%2509%2509%2509logger.error(e.getMessage()%252C%2520e)%253B%250A%2509%2509%2509%2509%2509%2509%2509result.put(%2522msg%2522%252C%2520%2522%25E7%25BD%2591%25E7%25BB%259C%25E5%25BC%2582%25E5%25B8%25B8%25EF%25BC%258C%25E8%25AF%25B7%25E7%25A8%258D%25E5%2590%258E%25E5%2586%258D%25E5%25B0%259D%25E8%25AF%2595%25E3%2580%2582%2522)%253B%250A%2509%2509%2509%2509%2509%2509%257D%250A%2509%2509%2509%2509%2509%257D%2520else%2520%257B%250A%2509%2509%2509%2509%2509%2509result.put(%2522msg%2522%252C%2520%2522%25E9%2580%2589%25E6%258B%25A9%25E7%259A%2584%25E6%2594%25AF%25E4%25BB%2598%25E7%25B1%25BB%25E5%259E%258B%25E6%259C%2589%25E8%25AF%25AF%25EF%25BC%258C%25E8%25AF%25B7%25E7%25A8%258D%25E5%2590%258E%25E9%2587%258D%25E8%25AF%2595%2522)%253B%250A%2509%2509%2509%2509%2509%257D%250A%2509%2509%2509%2509%257D%2520else%2520%257B%250A%2509%2509%2509%2509%2509result.put(%2522msg%2522%252C%2520%2522%25E8%25AF%25B7%25E9%2580%2589%25E6%258B%25A9%25E7%25A1%25AE%25E5%2588%2587%25E5%259C%25B0%25E5%25B8%2582%25E8%25BF%259B%25E8%25A1%258C%25E6%259F%25A5%25E8%25AF%25A2%25E5%2590%258E%25E5%2586%258D%25E8%25BF%259B%25E8%25A1%258C%25E5%25AE%25A1%25E6%25A0%25B8%2522)%253B%250A%2509%2509%2509%2509%257D%250A%2509%2509%2509%257D%2520else%2520%257B%250A%2509%2509%2509%2509result.put(%2522msg%2522%252C%2520%2522%25E8%25AF%25B7%25E9%2580%2589%25E6%258B%25A9%25E7%25A1%25AE%25E5%2588%2587%25E6%2597%25A5%25E6%259C%259F%25E8%25BF%259B%25E8%25A1%258C%25E6%259F%25A5%25E8%25AF%25A2%25E5%2590%258E%25E5%2586%258D%25E8%25BF%259B%25E8%25A1%258C%25E5%25AE%25A1%25E6%25A0%25B8.%2522)%253B%250A%2509%2509%2509%257D%250A%2509%2509%257D%2520else%2520%257B%250A%2509%2509%2509result.put(%2522msg%2522%252C%2520%2522%25E4%25B8%259A%25E5%258A%25A1%25E7%25B1%25BB%25E5%259E%258B%25E4%25B8%258D%25E6%2598%258E%25EF%25BC%258C%25E8%25AF%25B7%25E8%2581%2594%25E7%25B3%25BB%25E7%25AE%25A1%25E7%2590%2586%25E5%2591%2598%2522)%253B%250A%2509%2509%257D%250A%250A%2509%257D&es=2x&wm=false"
    style="transform:scale(0.7); width:1024px; height:473px; border:0; overflow:hidden;"
    sandbox="allow-scripts allow-same-origin">
    </iframe>
    lihongjie0209
        26
    lihongjie0209  
       2018-12-24 19:02:12 +08:00
    lihongjie0209
        27
    lihongjie0209  
       2018-12-24 19:07:29 +08:00   ❤️ 1
    laoyur
        28
    laoyur  
       2018-12-24 19:07:36 +08:00
    看到这样排版还肯帮忙的,是真的热心肠了
    lihongjie0209
        29
    lihongjie0209  
       2018-12-24 19:10:03 +08:00
    @laoyur 主要是想试一下 gif 录制工具 还有 在 v2 回复图片, 后者看来失败了
    devilyaos
        30
    devilyaos  
       2018-12-24 21:28:18 +08:00 via iPhone
    counttypeid 为 null (有空格)会进下面的逻辑吧?此时应该条件匹配不上?或者 null 是大写,大小写匹配可以用 equalsignore 嘛……
    iceheart
        31
    iceheart  
       2018-12-25 08:42:27 +08:00 via Android   ❤️ 2
    //抛块砖头,帮你重构了一下,java 语法不太熟,将就着写吧
    //重复的动作首先要封装一下
    bool check(string typeName string typeValue) {
    if (StringUtils.isBlank(typeValue) || "null".equals(typeValue)) {
    return false;
    }
    paramMap.put(typeName, typeValue.trim());
    return true;
    }
    ...
    //try catch 可以简化分支处理
    try {
    if (!check(countTypeId)) throw Exception("your message");
    if (!check(dealDate)) throw Exception("your message");
    if (!check(regionCode)) throw Exception("your message");
    if (!check(payType)) throw Exception("your message");
    int i = 0;
    try {
    i = dataRecountService.updateDataPayType(paramMap);
    }catch (Exception e) {
    logger.error(e.getMessage(), e);
    throw Exception("网络异常,请稍后再尝试。" );
    }
    if (i > 0) {
    result.put("status", "1");
    result.put("msg", "提交成功");
    }
    }cache(Exception e) {
    result.put(e.getMessage());
    }
    momuou
        32
    momuou  
    OP
       2018-12-25 09:14:32 +08:00
    @pipicat 谢谢
    momuou
        33
    momuou  
    OP
       2018-12-25 09:14:44 +08:00
    momuou
        34
    momuou  
    OP
       2018-12-25 09:16:06 +08:00
    @devilyaos 其实判断不是重点。。重点就是怎么优化这种多个判断的,不过还是很感谢
    momuou
        35
    momuou  
    OP
       2018-12-25 09:18:00 +08:00
    @iceheart 谢谢,抛异常这种考虑过,不过也是感觉太繁琐
    tingfang
        36
    tingfang  
       2018-12-25 09:34:51 +08:00
    这种 ifelse 建议使用卫语句。
    tingfang
        37
    tingfang  
       2018-12-25 09:36:31 +08:00
    if(!conditionA){
    return;
    }
    if(!conditionB){
    return;
    }
    if(!conditionC){
    return;
    }
    ...
    return;
    icop
        38
    icop  
       2018-12-25 09:43:54 +08:00
    debug 不行吗? IDEA 的 DEBUG 啊。
    aa514758835
        39
    aa514758835  
       2018-12-25 09:56:59 +08:00
    这是 java 吗~ 我看不懂
    wuchenl
        40
    wuchenl  
       2018-12-25 10:12:35 +08:00   ❤️ 1
    使用 equals 的时候,记得考虑空格的情况下。即.trim()。
    然后针对这种多个参数要判断是否为空的情况,建议弄一个 BO,接收。然后上面加注解等进行校验。这种可读性太差了。
    有 @NotNull,@NotEmpty 注解,搭配 message 属性使用即可;

    @NotEmpty(message="证件号不能为空!")
    private String certNo;


    具体使用时 Controller 层使用 @Valid 注解也可,方法内部进行校验也可。详细的可以自己了解下哦=0=
    public String test(@Valid User user){

    }
    zhaogaz
        41
    zhaogaz  
       2018-12-25 10:44:15 +08:00   ❤️ 1
    你把以上内容封装成一个对象,然后用 valid 验证的框架去做验证。验证内容都注解写就好了。。。
    momuou
        42
    momuou  
    OP
       2018-12-25 14:35:50 +08:00
    @tingfang 谢谢,不过这种写法我觉得太繁琐了,可以看看我 20L 写的最新的。也是感觉写的最方便的写法了
    momuou
        43
    momuou  
    OP
       2018-12-25 14:36:15 +08:00
    @icop 这不是执行问题,是优化问题。
    momuou
        44
    momuou  
    OP
       2018-12-25 14:37:52 +08:00
    @wuchenl 嗯,这位老哥的方法跟 24L 的有点相似,有空余时间我也要学习一下这种利用注解的方式.谢谢
    momuou
        45
    momuou  
    OP
       2018-12-25 14:39:01 +08:00
    @zhaogaz 嗯,楼上多次提及 vaild 校验,这个更多我在前端接触过,服务端的真要学习一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5980 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 02:19 · PVG 10:19 · LAX 18:19 · JFK 21:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.