3.1 重新理解业务、对象、数据之间的关系
codingapi
编辑于 2023年06月12日 07:05
收录于文集
共29篇

需求简述

    为了简化理解业务、对象、数据之间的关系,下面我们以商品下单功能举例说明:

需求描述

    用户将购物车选择的商品,点击支付然后完成下单,商品下单以后需要通知商家接单。

功能要求:

用户:

   下单

   支付

   查看订单状态

   查看订单详情

商家:

   订单列表

   待接单列表

   接单

   发货

平台:

   订单列表

   用户列表

   商家列表

   订单统计

       当日订单总数

       总支付金额

划分介绍

哪些是业务,哪些是功能,哪些是通过模型完成的,哪些是通过数据完成的。

如下的功能将会涉及到业务模型:

下单、支付、接单、发货

如下的功能只是涉及到数据:

查看订单状态、查看订单详情、订单列表、商家列表、订单统计

关系介绍

功能包含了 业务功能与数据功能

业务功能是由业务模型参与完成的

业务模型的参与过程中产生数据

代码演示

代码演示

业务对象代码

代码块
JavaScript
自动换行
复制代码


import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class Bill {

    private String billNo;
    private int money;
    private long timestamp;
    private Order order;
    private User user;


    public Bill(Order order, User user) {
        this.billNo = String.format("NO%s",System.currentTimeMillis());
        this.order = order;
        this.user = user;
        this.timestamp = System.currentTimeMillis();
    }
}


import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class Merchant {

    private long id;
    private String name;

    public Merchant(String name) {
        this.name = name;
        this.id = System.currentTimeMillis();
    }
}

import com.codingapi.crankycode.event.OrderPayEvent;
import com.codingapi.springboot.framework.event.EventPusher;
import lombok.Getter;
import lombok.Setter;

import java.util.List;

@Setter
@Getter
public class Order {

    private final User user;

    private final long createTime;

    private final List<Product> products;

    private State state;


    public enum State{
        CREATE,PAYED,
    }

    public Order(User user, List<Product> products) {
        this.user = user;
        this.products = products;
        this.createTime = System.currentTimeMillis();

        this.verify();
    }


    private void verify(){
        if(user==null){
            throw new RuntimeException("user must not null.");
        }
        if(products==null||products.size()==0){
            throw new RuntimeException("products must not null.");
        }
    }


    public void pay(){
        state = State.PAYED;
        EventPusher.push(new OrderPayEvent(this));
    }

}

import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class Product {

    private long id;
    private String name;
    private Merchant merchant;

    public Product(String name, Merchant merchant) {
        this.name = name;
        this.merchant = merchant;
        this.id = System.currentTimeMillis();
    }
}

import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class User {

    private String username;
    private String password;

    public User(String username) {
        this.username = username;
    }
}

复制成功

业务场景代码

代码块
JavaScript
自动换行
复制代码
import com.codingapi.crankycode.command.OrderCommand;
import com.codingapi.crankycode.domain.Order;
import com.codingapi.crankycode.domain.Product;
import com.codingapi.crankycode.domain.User;
import com.codingapi.crankycode.repository.ProductRepository;
import com.codingapi.crankycode.repository.UserRepository;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
@AllArgsConstructor
public class OrderExecutor {

    private final UserRepository userRepository;
    private final ProductRepository productRepository;


    public void createOrder(OrderCommand.CreateCommand command){
        User user = userRepository.getUserByName(command.getUsername());
        Product product = productRepository.getProductByName(command.getProductName());
        Order order = new Order(user, List.of(product));
        order.pay();
    }

}
复制成功

执行日志:

代码块
JavaScript
自动换行
复制代码
2023-06-08T12:29:09.352+08:00  INFO 9031 --- [           main] c.c.c.handler.OrderPayBillHandler        : order pay event:com.codingapi.crankycode.event.OrderPayEvent@7a1b8a46
2023-06-08T12:29:09.353+08:00  INFO 9031 --- [           main] c.c.c.r.impl.BillRepositoryImpl          : save bill==>com.codingapi.crankycode.domain.Bill@59fc6d05
复制成功

代码地址:

https://github.com/codingapi/cranky-code/tree/main/demo3.1