繁体   English   中英

如何将 if-else 语句转换为 map 或其他使用 java 的语句

[英]How to convert if-else statement to map or other statement using java

我是 Java 的新手,我厌倦了 if else 语句我想重构我的代码并从 if-else 语句中解脱出来,而不是我无法减少我的代码,在我的代码中没有任何东西是 static 一切都来自用户端。 我分享我的代码供您参考。

if (orderDetail != null && item != null && !orderDetail.isUnitPriceModified()) {
  ItemSizeColorStyle itemSizeColorStyle = itemSizeColorStyleRepository.findByRecordID(orderDetail.getItemSCSID());

  if (origin != null && (origin.contains("b2baccess") || (origin.contains(".myappdev") && !origin.contains("apps.myappdev")))) {
    RepGroupManufacturer repGroupManufacturer = repGroupManufacturerRepository.findByRepGroupIDAndManufacturerIDAndRecordDeleted(repGroupID, manufacturerID, NOT_DELETED);
    if (repGroupManufacturer != null && repGroupManufacturer.getB2bItemPricingPolicy() != null && repGroupManufacturer.getB2bItemPricingPolicy().equalsIgnoreCase(ReptimeConstants.SHOWRETAILPRICE)) {
      if (orderDetail.getItemSCSID() == null && item.getRetailPrice() != null) {
        orderDetail.setUnitPrice(item.getRetailPrice());
      } else {
        //                        ItemSizeColorStyle itemSizeColorStyle = itemSizeColorStyleRepository.findByRecordID(orderDetail.getItemSCSID());
        if (itemSizeColorStyle != null && itemSizeColorStyle.getRetailPrice() != null) {
          orderDetail.setUnitPrice(itemSizeColorStyle.getRetailPrice());
        } else if (itemSizeColorStyle != null && itemSizeColorStyle.getRetailPrice() == null && item.getRetailPrice() != null) {
          orderDetail.setUnitPrice(item.getRetailPrice());
        } else if (itemSizeColorStyle != null && itemSizeColorStyle.getRetailPrice() == null && item.getRetailPrice() == null) {
          throw new NullPointerException("item price can not be null.");
        }
      }
    }
  }

如何将其转换为 map。

因为我不知道你返回的是什么类型以及什么类型的对象,所以我必须即兴创作一些变量,但这应该仍然有效,你只需要更改为正确的值

public static void main(String[] args) {
    setUnitPrice(orderDetail,origin);
}
public static void setUnitPrice(OrderDetail orderDetail,Origin origin){
    if (orderDetail == null && item == null && orderDetail.isUnitPriceModified()) return;
    if (origin == null && !origin.contains("b2baccess")  ||
            !origin.contains(".myappdev") && origin.contains("apps.myappdev")) return;
   
    RepGroupManufacturer repGroupManufacturer = repGroupManufacturerRepository
            .findByRepGroupIDAndManufacturerIDAndRecordDeleted(repGroupID, manufacturerID, NOT_DELETED);
    
    if (repGroupManufacturer == null &&
            repGroupManufacturer.getB2bItemPricingPolicy() == null &&
            !repGroupManufacturer.getB2bItemPricingPolicy().equalsIgnoreCase(ReptimeConstants.SHOWRETAILPRICE)) return;
    
    ItemSizeColorStyle itemSizeColorStyle = itemSizeColorStyleRepository.findByRecordID(orderDetail.getItemSCSID());
    orderDetail.setUnitPrice(getUnitPrice(itemSizeColorStyle,item,orderDetail));
}
public static int getUnitPrice(ItemSizeColorStyle itemSizeColorStyle, Item item, OrderDetail orderDetail) {
    if (orderDetail.getItemSCSID() == null && item.getRetailPrice() != null) return item.getRetailPrice();
    if (itemSizeColorStyle != null && itemSizeColorStyle.getRetailPrice() != null) return itemSizeColorStyle.getRetailPrice();
    if (itemSizeColorStyle != null && itemSizeColorStyle.getRetailPrice() == null && item.getRetailPrice() != null) return item.getRetailPrice();
    throw new NullPointerException("item price can not be null.");
}

至少分成多个小方法开始。 这将使if-else不那么可怕,易于理解。
还有一些区域/路径可以避免重复检查。

也许您也可以将验证检查的责任分解为不同的类。

import java.util.Optional;

import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;

class Scratch {
    private static String NOT_DELETED = "not-deleted";
    private ItemSizeColorStyleRepository itemSizeColorStyleRepository;
    private RepGroupManufacturerRepository repGroupManufacturerRepository;


    public void setUnitPrice(OrderDetail orderDetail, Item item, String origin, Integer repGroupID, Integer manufacturerID) {
        if (isValidOrderDetail(orderDetail) && nonNull(item)) {
            if (isValidOrigin(origin)) {
                if (isValidRepGroupManufacturer(repGroupID, manufacturerID)) {
                    if (isNull(orderDetail.getItemSCSID()) && nonNull(item.getRetailPrice())) {
                        orderDetail.setUnitPrice(item.getRetailPrice());
                    } else {
                        ItemSizeColorStyle itemSizeColorStyle = itemSizeColorStyleRepository.findByRecordID(orderDetail.getItemSCSID());
                        if (nonNull(itemSizeColorStyle)) {
                            if (nonNull(itemSizeColorStyle.getRetailPrice())) {
                                orderDetail.setUnitPrice(itemSizeColorStyle.getRetailPrice());
                            } else {
                                if (nonNull(item.getRetailPrice())) {
                                    orderDetail.setUnitPrice(item.getRetailPrice());
                                } else {
                                    throw new NullPointerException("item price can not be null.");
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    private boolean isValidOrderDetail(OrderDetail orderDetail) {
        return Optional
                .ofNullable(orderDetail)
                .map(e -> !e.isUnitPriceModified())
                .orElse(false);
    }

    private boolean isValidOrigin(String origin) {
        return nonNull(origin) &&
                (origin.contains("b2baccess") || (origin.contains(".myappdev") && !origin.contains("apps.myappdev")));
    }

    private boolean isValidRepGroupManufacturer(Integer repGroupID, Integer manufacturerID) {
        RepGroupManufacturer repGroupManufacturer = repGroupManufacturerRepository
                .findByRepGroupIDAndManufacturerIDAndRecordDeleted(repGroupID, manufacturerID, NOT_DELETED);
        return Optional
                .ofNullable(repGroupManufacturer)
                .flatMap(e -> Optional.ofNullable(e.getB2bItemPricingPolicy()))
                .map(e -> e.equalsIgnoreCase(ReptimeConstants.SHOWRETAILPRICE))
                .orElse(false);
    }
}

注意:我假设了某些数据类型,这对整体解决方案没有任何影响。

一些if-else语句表达的业务逻辑应该一点都不乏味。 您发布的代码似乎至少包含一些业务逻辑,但其编写方式使其难以阅读和维护。

在重构此类代码时,我遵循一些规则:

  1. “积极思考”- 避免if not语句,那是else的。
  2. 用函数替换嵌套的 if 语句。
  3. 尽可能懒惰,只在需要时查找值。
  4. 使用有意义的变量名。

在 1 上,替换这个

if (x is not null) {
  // more code
}

if (x is null) {
  return;
}
// more code

在 2 上,替换这个

if (x > 1 ) {
  // lots of code
}

if (x > 1) {
  updateStuff(x);
}

function updateStuff(int x) {
  // lots of code
}

这也打开了让 function 返回一个可以进一步使用的值的机会。

在 3 上,替换这个

x = queryDatabase(y);
if (y > 1) {
  // use x
}

if (y > 1) {
  x = queryDatabase(y);  
  // use x
}

最后,在 4 上,我有时会引入 boolean 个值来传达复杂条件的含义。 例如比较一下:

if ((x < 1 and y > 100) ||  (z not 0 and y < 1)) {
  // do stuff
}

boolean findPrice = (x < 1 and y > 100);
boolean findProduct = (z not 0 and y < 1);
if (findPrice || findProduct) {
  // do stuff
}

当应用所有这些规则时,阅读代码变得更加容易,也更容易维护和(单元)测试代码。

免责声明:完全不可能重新实现包含如此多逻辑和保证的代码块,您可以简单地复制粘贴它,而且它会工作得很好。

我可以给出的第一个建议是更改存储库中的返回类型并利用Optional API(仅此一项并不能解决所有问题,但会提供一些改进空间)。

其次,你需要将呈现的逻辑分解成独立的有意义的和平,并给它们命名。 当前的代码以非常明显的方式违反了 SOLID 的第一原则—— 单一责任原则 您如何测试它,或者如何在不从头开始重写的情况下更改此功能? 这样的代码很难维护。

这是我重新实现这个逻辑的尝试,假设两个存储库都会产生一个Optional作为结果:

public void foo(OrderDetail orderDetail, Item item) {
    if (!isValid(orderDetail, item, origin)) return;

    repGroupManufacturerRepository
        .findByRepGroupIDAndManufacturerIDAndRecordDeleted(repGroupID, manufacturerID, NOT_DELETED);
        .filter(manufacturer -> manufacturer.getB2bItemPricingPolicy() != null)
        .filter(manufacturer -> manufacturer.getB2bItemPricingPolicy().equalsIgnoreCase(ReptimeConstants.SHOWRETAILPRICE))
        .ifPresent(manufacturer -> itemSizeColorStyleRepository.findByRecordID(orderDetail.getItemSCSID())
            .filter(itemStyle -> itemSizeColorStyle.getRetailPrice() != null)
            .ifPresent(itemStyle -> {
                if (needToApplyItemPrice(orderDetail, item, itemStyle)) orderDetail.setUnitPrice(item.getRetailPrice());
                else if (needToApplyItemStylePrice(orderDetail, item, itemStyle)) orderDetail.setUnitPrice(item.getRetailPrice());
                else throw new NullPointerException("item price can not be null.");
            })
        );
}

public boolean isValid(OrderDetail orderDetail, Item item, Origin origin) {
    return orderDetail != null && item != null && !orderDetail.isUnitPriceModified()
        && origin != null
        && (origin.contains("b2baccess") || origin.contains(".myappdev") && !origin.contains("apps.myappdev"));
}

public boolean needToApplyItemPrice(OrderDetail orderDetail, Item item, ItemSizeColorStyle itemStyle) {
    return (orderDetail.getItemSCSID() == null || itemStyle.getRetailPrice() == null)
        && item.getRetailPrice() != null;
}

public boolean needToApplyItemStylePrice(OrderDetail orderDetail, Item item, ItemSizeColorStyle itemStyle) {
    return !(orderDetail.getItemSCSID() == null && item.getRetailPrice() != null)
        && itemStyle.getRetailPrice() != null;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM