![](/img/trans.png)
[英]How do I convert this if-else statement into a switch statement in 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
语句表达的业务逻辑应该一点都不乏味。 您发布的代码似乎至少包含一些业务逻辑,但其编写方式使其难以阅读和维护。
在重构此类代码时,我遵循一些规则:
if not
语句,那是else
的。在 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.