订单的电子商务底层设计 class

E-Commerce low level design of Order class

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

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顺序class有意义吗?或者我应该单独制作一个 OrderManager 来帮助完成所有与订单相关的事情并且订单将充当 pojo 吗?

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

关于扩展说明,如何确定 class 中的内容和不包含的内容?

在我看来,我认为:

1、如果Order class是一个数据class,你会用这个class存入数据库,我觉得你应该把函数移到:
public OrderStatus placeOrder();
public OrderStatus trackOrder();
public void addOrderLogs();
public PaymentInfo makePayment();
public int createShipment();

Order class 到 OrderManager class,因为要实现每个功能(即 placeOrder),您可能需要:

private OrderValidator orderValidator;
private OrderService orderService;

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

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

2. 如果 Order class 是这样的 composite class, maybe you can keep the functions in Order class and you don't need OrderManager class anymore, but you should combine your pattern with Factory pattern and Builder pattern
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();