代码之家  ›  专栏  ›  技术社区  ›  ip696

重构方法时选择什么方法,以便它响应干净代码的原则?

  •  1
  • ip696  · 技术社区  · 7 年前

    我有这个方法签名:

    public User getActiveUser(String personId, User mainUser) throws MyExceptions {
    
        if (personId== null) return mainUser;
    
            User innerUser = userRepository.getByPersonId(personId);
    
            checkForNull(innerUser);
            checkIsActive(innerUser);
    
            return innerUser;
    
     }
    
        private void checkForNull(User innerUser) throws UNPExceptions {
            if (innerUser == null) throw new MyExceptions(USER_NOT_FOUND);
        }
    
        private void checkIsActive(User innerUser) throws UNPExceptions {
            if (!innerUser.getIsActive()) throw new MyExceptions(USER_BLOCKED);
        }
    

    我把这个方法从不同的地方叫做:

    User user = userService.getActive(userRequest.getPersonId(), requestEntity.getUser());
    

    我不喜欢这个代码,因为:

    getActiveUser(String personId, User mainUser)

    mainUser 始终返回如果 personId 为空。我可以在方法内部移动这个检查,但是每次调用方法之前都必须这样做。这个方法是从很多地方调用的。所以我把支票移到了一个地方。但它看起来歪歪扭扭的,我不知道怎么绕过它。在复制这个方法之前,不要检查每个方法,但是我想在复制前检查这个方法。我不知道哪个解决方案更好。也许还有别的解决办法。

    2) 方法名称- getActiveUser 是在撒谎。因为在里面我会做更多的检查。但我不知道怎么称呼它- getActiveUserAndCheck

    3) 有必要把支票分成不同的方法吗? checkForNull(innerUser); checkIsActive(innerUser);

    2 回复  |  直到 7 年前
        1
  •  0
  •   Nenad    7 年前

    如果mainUser始终是同一个用户,则无需将其作为方法参数传递,则可以将其存储为实例字段,并在适当时对其进行初始化。

        2
  •  0
  •   Naman    7 年前

    使用Java8+,您可以简单地替换

    checkForNull(innerUser);
    checkIsActive(innerUser);
    return innerUser;
    

    Optional ,作为:

    return Optional.ofNullable(innerUser)
                   .filter(User::getIsActive)
                   .orElseThrow(() -> new MyExceptions(""));
    

    如果你想默认 mainUser

    return Optional.ofNullable(personId) // check for person 'null'
                   .map(p -> userRepository.getByPersonId(personId)) if present evaluate 'innerUser'
                   .filter(Objects::nonNull) // check if innerUser is null
                   .filter(User::getIsActive) // check if innerUser is active
                   .orElse(defaultUser); if any of above fails return defaultUser