如何解决评估N个对象上的条件集的最佳方法取决于它们的状态
考虑两个对象:
-
Order
-
Bag
每个对象都有一个状态字段:
Order: [INITIALIZED,PICKED_UP,IN_TRANSIT,DELIVERED]
Bag: [INITIALIZED,ACQUIRED,DAMAGED,DELIVERED]
最后,每个订单都分配了一组行李。
在更新Order
对象的状态时,我需要检查是否遵守N
条件,例如:当将Order
状态更新为"PICKED_UP"
时,所有关联的旅行袋必须依次处于"ACQUIRED"
状态。
这是我可以做的最简单的示例,但我正在寻找有关这些主题的一些提示:
- 编写易于维护的代码,而无需重写整个条件集(条件有时可以嵌套!)
- 避免长列“如果,否则,如果……”
- 将所有评估中涉及的所有逻辑都放在同一个班级中,以使正在阅读代码的人员可以快速了解代码的目的,以及在情况下如何实现新的逻辑。
我希望这个问题不要太笼统! 谢谢!
解决方法
对此建模的一种方法是将是否允许某个订单处于某个状态的决定委托给该状态。在下面,OrderStatus枚举具有方法'isValidStatusForOrder(Order)',如果可以将订单移至该状态,则该方法返回true。然后,Order类具有moveOrderToStatus方法,该方法首先在移动状态之前检查是否可以移动它。
public static class Order
{
public List<Bag> bags = new ArrayList<>();
public OrderStatus currentStatus = OrderStatus.INITIALIZED;
public void moveOrderToStatus(OrderStatus status)
{
if(!status.isValidStatusForOrder(this)) throw new IllegalStateException("Invalid status");
currentStatus = status;
}
}
public static class Bag
{
public BagStatus status = BagStatus.INITIALIZED;
}
public enum OrderStatus
{
INITIALIZED(order -> { throw new UnsupportedOperationException(); }),PICKED_UP(order -> { return order.bags.stream().allMatch(bag -> bag.status == BagStatus.ACQUIRED); }),IN_TRANSIT(order -> { throw new UnsupportedOperationException(); }),DELIVERED(order -> { throw new UnsupportedOperationException(); });
private final OperationValidator validator;
OrderStatus(OperationValidator validator){ this.validator = validator; }
public boolean isValidStatusForOrder(Order order){ return validator.isValid(order); }
}
public enum BagStatus { INITIALIZED,ACQUIRED,DAMAGED,DELIVERED }
@FunctionalInterface
public interface OperationValidator{ boolean isValid(Order order); }
或者,可以在不同的类中对订单状态进行建模。例如:使用InitializedOrder,PickedUpOrder,InTransitOrder等代表不同的订单阶段。这样可以更容易地防止错误使用订单/输入无效逻辑。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。