有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

包含多个if条件的java重构代码

以下是我为保存UrlEntity而编写的一些代码:

public UrlEntity saveUrlEntity(String longUrl, LocalDate dateAdded) {

    int urlLength = longUrl.length();
    if (urlLength >= Constants.MAX_LONG_URL_LENGTH) {
        throw new LongUrlLengthExceededException("URL with length " + urlLength + " exceeds the max length of " + Constants.MAX_LONG_URL_LENGTH + " characters");
    } else {

        List<UrlEntity> urlEntity = urlRepository.findByLongUrl(longUrl);
        if (urlEntity.size() > 0) {
            return urlEntity.get(0);
        } else {
            final String shortUrl = urlShorten.shortenURL(longUrl);
            if (urlRepository.findFirstByShortUrl(shortUrl).isPresent()) {
                logger.error("A short short URL collision occured for long URL: " + longUrl + " with generated short URL" + shortUrl);
                throw new ShortUrlCollisionException("A short URL collision occured");
            } else {
                logger.info("Shortened URL: " + shortUrl);

                final UrlEntity urlEntityToSave = new UrlEntity(dateAdded, longUrl, shortUrl);

                return urlRepository.save(urlEntityToSave);
            }
        }
    }
}

上面的代码存在于服务类中,看起来非常复杂。我正在尝试重构,以使意图清晰。这是我写的一个基本重构:

public UrlEntity saveUrlEntity(String longUrl, LocalDate dateAdded) {

    int urlLength = longUrl.length();
    if (urlLength >= Constants.MAX_LONG_URL_LENGTH) {
        throw new LongUrlLengthExceededException("URL with length " + urlLength + " exceeds the max length of " + Constants.MAX_LONG_URL_LENGTH + " characters");
    } else {
        List<UrlEntity> urlEntity = urlRepository.findByLongUrl(longUrl);
        if (urlEntity.size() > 0) {
            return urlEntity.get(0);
        } else {
            return saveUrlEntityValue(longUrl, dateAdded);
        }
    }
}

private UrlEntity saveUrlEntityValue(String longUrl, LocalDate dateAdded){
    final String shortUrl = urlShorten.shortenURL(longUrl);
    if (urlRepository.findFirstByShortUrl(shortUrl).isPresent()) {
        logger.error("A short short URL collision occured for long URL: " + longUrl + " with generated short URL" + shortUrl);
        throw new ShortUrlCollisionException("A short URL collision occured");
    } else {
        logger.info("Shortened URL: " + shortUrl);

        final UrlEntity urlEntityToSave = new UrlEntity(dateAdded, longUrl, shortUrl);

        return urlRepository.save(urlEntityToSave);
    }
}

这种重构并没有实质性地改进代码。有没有代码模式或惯用方法来重构方法saveUrlEntity?我正在使用Java11


共 (2) 个答案

  1. # 1 楼答案

    这是非常主观的,但是。。。由于大多数if语句都是保护/短路子句,它们是throwreturn,因此不需要使用else。我认为这个简单的更改使代码更具可读性

    public UrlEntity saveUrlEntity(String longUrl, LocalDate dateAdded) {
    
        final int urlLength = longUrl.length();
        if (urlLength >= Constants.MAX_LONG_URL_LENGTH) {
            throw new LongUrlLengthExceededException("URL with length " + urlLength + " exceeds the max length of " + Constants.MAX_LONG_URL_LENGTH + " characters");
        }
    
        final List<UrlEntity> urlEntity = urlRepository.findByLongUrl(longUrl);
        if (urlEntity.size() > 0) {
            return urlEntity.get(0);
        }
    
        final String shortUrl = urlShorten.shortenURL(longUrl);
        if (urlRepository.findFirstByShortUrl(shortUrl).isPresent()) {
            logger.error("A short short URL collision occured for long URL: " + longUrl + " with generated short URL" + shortUrl);
            throw new ShortUrlCollisionException("A short URL collision occured");
        }
    
        logger.info("Shortened URL: " + shortUrl);
        final UrlEntity urlEntityToSave = new UrlEntity(dateAdded, longUrl, shortUrl);
        return urlRepository.save(urlEntityToSave);
    }
    

    我还建议将urlEntity.size() > 0替换为!urlEntity.isEmpty()

    这种方法似乎确实在做几件事,这违反了单一责任原则;你可能想更好地解决这个问题

  2. # 2 楼答案

    如果使用throw newreturn,则不需要else条件,因为该方法以

    public UrlEntity saveUrlEntity(String longUrl, LocalDate dateAdded) {
    
        int urlLength = longUrl.length();
        if (urlLength >= Constants.MAX_LONG_URL_LENGTH) {
            throw new LongUrlLengthExceededException("URL with length " + urlLength + " exceeds the max length of " + Constants.MAX_LONG_URL_LENGTH + " characters");
        }
        
        List<UrlEntity> urlEntity = urlRepository.findByLongUrl(longUrl);
        if (urlEntity.size() > 0) {
            return urlEntity.get(0);
        }
        
        final String shortUrl = urlShorten.shortenURL(longUrl);
        if (urlRepository.findFirstByShortUrl(shortUrl).isPresent()) {
            logger.error("A short short URL collision occured for long URL: " + longUrl + " with generated short URL" + shortUrl);
            throw new ShortUrlCollisionException("A short URL collision occured");
        }
        
        logger.info("Shortened URL: " + shortUrl);
        final UrlEntity urlEntityToSave = new UrlEntity(dateAdded, longUrl, shortUrl);
        return urlRepository.save(urlEntityToSave);
    }