如何重构这个java代码段

t9aqgxwy  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(439)

出于某种原因,我不得不看到这段代码中存在冗余。有谁能帮我把它重构得更具可读性和简洁?

if (cachedParty == null || !cachedParty.equals(partyDto)) {
    if (cachedParty == null 
        && partyDto.getSellerStatusCode()
            .equalsIgnoreCase(SellerStatusEnum.ACTIVE.getCode())) 
    {
        pricingControlList.add(convertPartyDtoToPricingControl(partyDto));
    } else if (!cachedParty.equals(partyDto) 
        && cachedParty.getSellerStatusCode()
            .equalsIgnoreCase(SellerStatusEnum.ACTIVE.getCode()) 
        && !partyDto.getSellerStatusCode()
            .equalsIgnoreCase(SellerStatusEnum.ACTIVE.getCode())
    ) {
        pricingControlList.add(convertPartyDtoToPricingControl(partyDto));
    }

    partyCache.put(partyDto.getSellerServicerNumber(), partyDto);
    partiesToSaveOrUpdate.add(partyDto);
}
2ledvvac

2ledvvac1#

我建议你做个助手 isActive(party) 它回来了 partyDto.getSellerStatusCode().equalsIgnoreCase(SellerStatusEnum.ACTIVE.getCode() . 另外,当 cachedParty == null 因为 !cachedParty.equals(partyDto) 正在呼叫 equals 为了 null . 所以,考虑到这一点 partyDto 永远不会 null ,这可以简化为 !partyDto.equals(cachedParty) .
另外,在中调用相同的方法 if(x) else if (y) 语句,因此可以将其缩减为一个if语句 x or y 检查。那么,让我们重写你的陈述:

if (A or B) {
    if ((A and C) or (B and D and !C)) { F() }

    G()
}

我们在第一段决定, A or B = B . 所以现在的表情看起来像

if (B) {
    if ((A and C) or (B and D and !C)) { F() }

    G()
}

// and because inside first if statement B = true, we can remove B from nested if:

if (B) {
    if ((A and C) or (D and !C)) { F() }

    G()
}

因此,通过这些优化,我们可以得到:

if (!partyDto.equals(cachedParty)) {

    if (cachedParty == null && isActive(partyDto) || (isActive(cachedParty) && !isActive(partyDto)) {
        pricingControlList.add(convertPartyDtoToPricingControl(partyDto));
    }

    partyCache.put(partyDto.getSellerServicerNumber(), partyDto);
    partiesToSaveOrUpdate.add(partyDto);
}

我注意到没有 cachedParty != null 签入嵌套if,最终结果如下所示:

if (!partyDto.equals(cachedParty)) {
    if (cachedParty == null && isActive(partyDto) || (cachedParty != null && isActive(cachedParty) && !isActive(partyDto)) {
        pricingControlList.add(convertPartyDtoToPricingControl(partyDto));
    }

    partyCache.put(partyDto.getSellerServicerNumber(), partyDto);
    partiesToSaveOrUpdate.add(partyDto);
}
efzxgjgh

efzxgjgh2#

与…的比较 SellerStatusEnum.ACTIVE 可以作为接受 Supplier<String> 顶层比较可以简化为删除 cachedParty == null -从代码中假设 partyDto 不为null,因此检查就足够了 !partyDto.equals(cachedParty) 示例实现:

Function<Supplier<String>, Boolean> active = x -> SellerStatusEnum.ACTIVE.getCode().equalsIgnoreCase(x.get());

if (!partyDto.equals(cachedParty)) {
    boolean partyActive = active.apply(partyDto::getSellerStatusCode);
    if (null == cachedParty && partyActive 
        || null != cachedParty && !partyActive && active.apply(cachedParty::getSellerStatusCode)
    ) {
        pricingControlList.add(convertPartyDtoToPricingControl(partyDto));
    }
    partyCache.put(partyDto.getSellerServicerNumber(), partyDto);
    partiesToSaveOrUpdate.add(partyDto);
}

相关问题