程序员进阶工程师必备的十大技能之业务深度理解与建模能力(三)

简介: 教程来源 https://qcycj.cn/ 本文介绍业务建模的三大工程实践:①建模文档化——用代码、注释与状态图清晰表达订单等核心概念与规则;②模型验证——通过单元测试保障业务规则正确性;③数据库映射——借助Repository模式实现领域模型与持久化的解耦。强调以业务为中心建模,让代码成为业务的精准数字映射。

六、业务建模的工程实践

6.1 建模文档化
用代码 + 注释 + 可视化图表来描述模型:

# 订单模型说明

## 核心概念
- Order(订单):一次交易的记录
- OrderItem(订单项):订单中的商品快照
- OrderStatus(订单状态):订单生命周期中的状态

## 状态机
[待支付] -> (支付) -> [已支付] -> (发货) -> [已发货] -> (确认收货) -> [已完成]
          |
          v
       [支付失败] -> (重新支付) -> [待支付]
          |
          v
       [已取消]

## 业务规则
1. 订单总金额 <= 0 时不能创建订单
2. 已支付的订单不能取消(需联系客服)
3. 订单商品数量不能超过库存
4. 订单价格以下单时刻为准(快照)

## 使用示例
\```python
order = Order.create(user_id, items)
order.pay(PaymentInfo(amount=order.total))
order.ship("SF1234567890")
\
**6.2 模型验证**
通过单元测试来验证业务规则:

import pytest
from decimal import Decimal

class TestOrderModel:

def test_order_creation_with_valid_data(self):
    """测试:使用有效数据创建订单"""
    user_id = "user_001"
    items = [OrderItem(Product("p1", "商品1", Decimal('100')), 2)]

    order = Order.create(user_id, items)

    assert order.user_id == user_id
    assert order.status == OrderStatus.PENDING
    assert order.subtotal == Decimal('200')

def test_order_creation_with_empty_items(self):
    """测试:空订单不能创建"""
    with pytest.raises(EmptyOrderError):
        Order.create("user_001", [])

def test_pay_increases_status_to_paid(self):
    """测试:支付成功后状态变为已支付"""
    order = create_test_order()

    order.pay(PaymentResult(success=True))

    assert order.status == OrderStatus.PAID

def test_cannot_pay_twice(self):
    """测试:不能重复支付同一个订单"""
    order = create_test_order()
    order.pay(PaymentResult(success=True))

    with pytest.raises(InvalidOrderStateError):
        order.pay(PaymentResult(success=True))

def test_cannot_modify_paid_order(self):
    """测试:已支付的订单不能修改商品"""
    order = create_test_order()
    order.pay(PaymentResult(success=True))

    with pytest.raises(OrderAlreadyPaidError):
        order.add_item(Product("p2", "新商品", Decimal('50')), 1)

def test_domain_events_are_emitted(self):
    """测试:领域事件正确触发"""
    order = create_test_order()

    order.pay(PaymentResult(success=True))

    events = order.domain_events
    assert len(events) == 1
    assert isinstance(events[0], OrderPaidEvent)
    assert events[0].order_id == order.order_id
**6.3 与数据库的映射**
业务模型与持久化存储的映射策略:

使用 Repository 模式隔离模型与存储

class OrderRepository:
def init(self, db_session):
self.db_session = db_session

def save(self, order: Order):
    """保存订单聚合"""
    # 保存订单主表
    order_po = OrderPO(
        order_id=order.order_id,
        user_id=order.user_id,
        status=order.status.value,
        original_total=order.original_total,
        final_total=order.final_total,
        created_at=order.created_at
    )
    self.db_session.merge(order_po)

    # 保存订单商品表
    for item in order.items:
        item_po = OrderItemPO(
            order_id=order.order_id,
            product_id=item.product_id,
            product_name=item.product_name,
            price_at_order=item.price_at_order,
            quantity=item.quantity
        )
        self.db_session.merge(item_po)

    # 保存领域事件(如果需要持久化)
    for event in order.domain_events:
        event_po = DomainEventPO(
            event_id=event.event_id,
            order_id=order.order_id,
            event_type=type(event).__name__,
            event_data=json.dumps(asdict(event)),
            occurred_at=event.occurred_at
        )
        self.db_session.add(event_po)

def find_by_id(self, order_id: str) -> Optional[Order]:
    """根据ID查询订单"""
    order_po = self.db_session.query(OrderPO).filter_by(order_id=order_id).first()
    if not order_po:
        return None

    # 查询订单商品
    item_pos = self.db_session.query(OrderItemPO).filter_by(order_id=order_id).all()

    # 重建订单聚合
    order = Order._reconstruct(
        order_id=order_po.order_id,
        user_id=order_po.user_id,
        status=OrderStatus(order_po.status),
        items=[OrderItem._reconstruct(
            product_id=ip.product_id,
            product_name=ip.product_name,
            price_at_order=ip.price_at_order,
            quantity=ip.quantity
        ) for ip in item_pos],
        original_total=order_po.original_total,
        final_total=order_po.final_total,
        created_at=order_po.created_at
    )

    return order

```
总结
业务深度理解与建模能力是将程序员与工程师区分开的关键能力。它不仅要求我们写出能运行的代码,更要求我们写出能准确表达业务的代码。

核心要点回顾:

从业务出发:理解业务方真正想要什么

用模型思考:在写代码前先建立概念模型

代码即模型:让代码直接反映业务概念

保护业务规则:业务逻辑封装在模型中

持续演进:模型随着业务理解深入不断优化

记住:你不是在写代码,你是在用代码构建一个和业务世界平行的数字世界。这个世界越贴近真实业务,你的价值就越大。
来源:
https://oieaw.cn/

相关文章
|
5天前
|
人工智能 安全 搜索推荐
我用 PAI/Codex 理解 Harness Engineering:Agent 工作环境到底怎么搭
从工程师视角出发,带你过一遍 Harness Engineering
208 2
 我用 PAI/Codex 理解 Harness Engineering:Agent 工作环境到底怎么搭
|
5天前
|
编解码 自然语言处理 文字识别
HiDream-O1开源:8B参数像素级统一Transformer
HiDream-O1-Image是HiDream.ai开源的8B参数像素级统一生成模型,摒弃VAE与分离文本编码器,首创UiT架构实现文本、图像、任务条件在共享token空间端到端联合建模。支持2048×2048高清生成、多镜头/多语言渲染、指令编辑与主体个性化,在GenEval等基准刷新SOTA。含50步未蒸馏版与28步Dev加速版,并集成推理驱动提示代理。
386 0
|
5天前
|
SQL 网络协议 NoSQL
软件开发新手入门五大核心技能之计算机基础常识(五)
教程来源 http://vbzcj.cn/ 本章系统讲解网络与数据库核心知识:涵盖OSI/TCP/IP模型、IP/端口、TCP三次握手/四次挥手、HTTP协议、DNS解析;以及SQL基础、索引优化、ACID事务、NoSQL(如Redis)等,理论结合Python实战示例。
|
5天前
|
存储 程序员 调度
程序员必备的十大技能(进阶版)之底层计算机原理(一)
教程来源 http://zlpow.cn/ 本文深入计算机底层原理,涵盖体系结构、CPU微架构、内存层次、I/O、操作系统、汇编、编译链接等十大维度,揭示代码如何在硬件上高效运行,助开发者写出更可靠、高性能的程序。
|
5天前
|
机器学习/深度学习 算法 关系型数据库
图解强化学习 |手算PG算法
PG(Policy Gradient)策略梯度算法直接优化策略网络,输出动作概率而非价值,适用于离散/连续动作空间。需整回合采样后计算折扣回报Gₜ,以-logπ·G为损失函数更新参数,提升高回报动作概率。可引入基线(如平均回报)构建优势函数,提升训练稳定性与效率。(239字)
1665 1
|
5天前
|
Java 程序员 测试技术
程序员必备的十大技能(进阶版)之网络与高并发原理(五)
教程来源 https://tmywi.cn/ 本节系统讲解高并发场景下的操作系统与JVM深度调优:涵盖Linux网络内核参数(BBR拥塞控制、缓冲区、连接队列)、进程资源限制、JVM G1GC优化及性能压测与瓶颈定位方法,并以百万级WebSocket推送系统为实战案例,体现无锁化、异步非阻塞等高性能设计原则。
|
5天前
|
人工智能 监控 安全
少儿AI 英语背单词 APP的开发
专为少儿设计的AI英语背单词APP,聚焦注意力易散、趣味性不足等核心痛点。通过动态语境生成、多模态语音评测、游戏化UI(IP闯关/手势互动)、安全RAG知识库及家长监控后台五大维度,打造“学得进、记得住、家长信”的轻量化MVP产品。(239字)
|
5天前
|
人工智能 搜索推荐 安全
AI 会站在你这边吗?Anthropic 用 100 万条对话研究了这个问题
用户要的往往不是一个标准答案,而是一种判断、一种情感陪伴,甚至是一种选择确认。这也给 AI 带来了一个新问题:当用户带着情绪和立场来求助时,是应该安慰,还是应该反驳?
115 0
AI 会站在你这边吗?Anthropic 用 100 万条对话研究了这个问题
|
30天前
|
Linux 程序员 网络安全
初级程序员必备的十大技能之基础 Linux 命令(一)
教程来源 https://qcycj.cn/ 本文系统讲解程序员必备的Linux核心命令,涵盖文件操作、文本处理、权限管理、进程与网络工具等,结合原理、参数详解及实战案例,助你高效部署、排查与运维——无论用Windows还是macOS,Linux都是程序员不可或缺的“第二操作系统”。
|
5天前
|
设计模式 算法 程序员
程序员必备的十大技能(进阶版)之设计模式与架构思维(三)
教程来源 https://wkmsa.cn/ 行为型模式聚焦对象间职责分配与通信协作。含策略(算法可插拔)、观察者(事件自动通知)、责任链(请求逐级处理)、模板方法(算法骨架复用)、状态(行为随状态切换)等核心模式,提升系统灵活性与可维护性。