【问题标题】:E-Commerce low level design of Order classOrder类的电子商务底层设计
【发布时间】:2021-05-26 00:45:27
【问题描述】:

我正在设计购物网站。截至目前,我被困在某一点上,需要一点反馈。假设我有一个订单类定义如下:

class Order {

    Payment payment;
    Address ShippingAddress
    int orderId;
    List<Item> orderItem;
    double orderValue;  
    Buyer buyer;
    Date orderDate;
    NotificationService notificationService;
    Shipment shipment;
    
    List<OrderLog> orderLog;

    public OrderStatus placeOrder();
    public OrderStatus trackOrder();
    public void addOrderLogs();
    public PaymentInfo makePayment();
    public int createShipment();

}

在订单类中有placeOrder()makePayment() 等API 有意义吗?或者我应该创建一个单独的OrderManager 来帮助处理所有与订单相关的事情,并且订单将充当 pojo?

对我来说,第一个似乎是正确的,因为 placeOrder()makePayment() 在我看来是秩序行为,它们应该在秩序类中,但在其他类中,我认为对于秩序类来说太多了。我我采用一种方法而不是另一种方法违反了一些 SOLID 原则?由于 OrderManager 也将执行我们在此类中添加的相同操作,因此将其移出是否有意义? placeOrder()makePayment() 等,对我来说似乎是秩序。有什么想法吗?

在扩展笔记中,如何自信地决定什么会留在课堂上,什么不会?

【问题讨论】:

  • 创建一个单独的 OrderManager 类。 Order 类应该只包含有关订单的信息。下订单会结合客户和订单信息。收款与订单无关,尽管支付过程需要平衡支付与订单。接受付款结合了客户和付款信息。随着您获得经验,您将更好地确定您的系统对象。您获得的业务经验越多越好。
  • 但我正在阅读一些关于管理器类不好的文章,它们对管理器类的介绍可能是不良架构的标志:softwareengineering.stackexchange.com/questions/129537/…,虽然我们在日常生活中使用它们。但我开始阅读关于 SOLID 和良好的设计实践,然后我开始产生一些疑问。

标签: java oop design-patterns api-design


【解决方案1】:

在我看来,我认为:

1.如果Order类是一个数据类,你会使用这个类来存储到数据库,我认为你应该移动函数:
public OrderStatus placeOrder();
public OrderStatus trackOrder();
public void addOrderLogs();
public PaymentInfo makePayment();
public int createShipment();

Order 类到OrderManager 类,因为要实现每个功能(即placeOrder)也许你需要:

private OrderValidator orderValidator;
private OrderService orderService;

public OrderStatus placeOrder() {
    if(orderValidator.validateOrder(this)) {
        orderService.saveOrder(this);
        return OrderStatus.OK;
    }
    return OrderStatus.NOK
}

但是当您使用像HibernateSpring JPA 这样的JPA(实体)框架时,它们将从数据库加载数据并且没有orderValidatororderService 的信息设置为Order 对象。而且你需要用@Transient注解orderValidtororderService,这会让你的源代码很复杂

2. 如果Order 类是composite 类,也许你可以保留Order 类中的函数,你不再需要OrderManager 类,但是你应该将你的模式与Factory pattern 和@987654325 结合起来@ 像这样:
interface IOrder {
    Payment getPayment();
    Address getShippingAddress();
    //....
}

interface OrderValidator {
    boolean validateOrder(IOrder order);
}

interface OrderService {
    void saveOrder(IOrder order);
}

class OrderBuilder {
    private OrderValidator orderValidator;
    private OrderService orderService;
    private Payment payment;
    // other fields

    public OrderBuilder orderValidator(OrderValidator orderValidator) {
        this.orderValidator = orderValidator;
        return this;
    }

    public OrderBuilder orderService(OrderService orderService) {
        this.orderService = orderService;
        return this;
    }
    public OrderBuilder payment(Payment payment) {
        this.payment = payment;
        return this;
    }

    public Order build() {
        Order order = new Order();
        order.setOrderService(orderService);
        order.setOrderValidator(orderValidator);
        order.setPayment(payment);
        //set others
        return order;
    }
}

// Singleton
class OrderFactory {
    private OrderValidator orderValidator;
    private OrderService orderService;
    
    public OrderFactory(OrderValidator orderValidator, OrderService orderService) {
        this.orderValidator = orderValidator;
        this.orderService = orderService;
    }

    public OrderBuilder newOrderBuilder() {
        return new OrderBuilder()
                .orderValidator(orderValidator)
                .orderService(orderService);
    }
}

@Setter
@Getter
class Order implements IOrder

// usage
OrderFactory orderFactory = new OrderFactory(orderValidator, orderService);
Order order1 = orderFactory.newOrderBuilder()
        .payment(payment)
        // set others
        .build();
order1.placeOrder();
Order order2 = orderFactory.newOrderBuilder()
       .payment(payment)
       // set others
       .build();
order2.placeOrder();

【讨论】:

    猜你喜欢
    • 2019-07-03
    • 2010-11-21
    • 1970-01-01
    • 2014-07-29
    • 2018-09-03
    • 2016-12-06
    • 2020-01-28
    • 2013-10-27
    • 1970-01-01
    相关资源
    最近更新 更多