首页 > 其他分享 >系统熵增是怎么产生的?————数据对象模型里添加属性欠思考

系统熵增是怎么产生的?————数据对象模型里添加属性欠思考

时间:2023-09-09 23:34:29浏览次数:44  
标签:增是 OrderVO orderVO 添加 支付 prevPayStatus Order 属性

熵增定律指出,在没有外力作用下的封闭系统中,熵(或混乱度)总是增加的。就是说,任何封闭系统中、在没有外力作用下,都会陷入混乱。

屋子不收拾会变乱;人不自律会懒散;生活不规律或无节制,人就会出现健康问题;同样,对于我们的信息系统,一旦缺乏规范和管控,就会越来越难于迭代和维护。

这些例子都展示了在缺乏积极干预的情况下,事物往往会趋向于混乱和无序。因此,对于个人和社会来说,重要的是意识到这种趋势,并积极采取适当的措施来对抗熵增,即具有熵减的能力,来维持秩序、管理事物并保持整体的稳定和有序。 

 

我们系统中调用通道查询订单支付结果的逻辑,我结合伪代码表示如下。

public void queryOrderPayResult(orderNo){
    ...
    // 从数据库里取出来的订单数据记录
    Order entity = orderMapper.selectById(orderNo);
    // 订单当前支付状态已经是终态,终止
    if (isFinalState(entity.getPayStatus()) return;
    ...
    OrderVO orderVO = BeanMapper.map(entity, OrderVO.class);
    
    调用下游通道,执行查单逻辑
    
    orderVO.setPrevPayStatus(orderVO.getPayStatus());
    if (查单返回支付成功) {
        orderVO.setPayStatus(SUCCESS);
        orderVO.setCompleteTime(xxx);
    } else(查单返回支付失败) {
        orderVO.setPayStatus(FAIL);
    } else{
        // 查单返回支付中,无操作,直接return
        return;
    }
    updatePayQueryResult(orderVO);
}

private void updatePayQueryResult(OrderVO orderVO){
    Order updateEntity = new Order()
        .setPayStatus(orderVO.getPayStatus())
        .setCompleteTime(orderVO.getCompleteTime())
        .setUpdateTime(new Date());
    
    LambdaQueryWrapper<Order> updateWrapper = new LambdaQueryWrapper<Order>()
        .eq(Order::getOrderNo, orderVO.getOrderNo())
        .eq(Order::getOrderStatus, OrderVO.getPrevPayStatus());
    // 持久化更新支付状态
    orderMapper.update(OrderUpdate, updateWrapper);
}

其中,Order代表订单数据实体,OrderVO是Order的值对象表示形式,在程序方法及交互中使用。订单对象包含有 订单号orderNo、支付状态payStatus、完成时间completeTime 等属性,OrderVO也定义对应的属性。

这里要说的是OrderVO的prevPayStatus属性。prevPayStatus,见名知意,表示“前一个支付状态”。上面这段代码中,为了在更新订单的支付状态时使用状态锁,而在OrderVO上定义了 prevPayStatus 属性。我们系统中对订单的操作逻辑较多,为了满足相关操作在这个OrderVO中也定义了诸如 createTimeBegin、createTimeEnd、prevVerifyStatus等属性。这种程序设计,我认为,就产生了系统熵增。如果不加以约束和控制,OrderVO在日后迭代中会有更多类似属性。

消除熵增的办法就是将这些属性从OrderVO中去掉,保持OrderVO的干净整洁。

 

那么,基于示例中的场景,我们如何去掉 OrderVO#prevPayStatus 呢?

更新订单支付状态,尤其要注意状态机控制。假定支付状态流转为 待支付INIT→支付中PAYING→支付成功SUCCESS/支付失败FAIL。那么一笔交易,在更新为支付终态(SUCCESS/FAIL)时,前提条件一定是PAYING。

因此,我们完全可以去掉 prevPayStatus 属性。queryOrderPayResult方法中,去掉 prevPayStatus的赋值;updatePayQueryResult方法中, updateWrapper直接设置orderStatus为PAYING。

 

标签:增是,OrderVO,orderVO,添加,支付,prevPayStatus,Order,属性
From: https://www.cnblogs.com/buguge/p/17690432.html

相关文章

  • Spartacus 如何动态将 SmartEdit attribute 添加到 DOM 里,单步调试
    从Spartacus发起的basesiteocc请求的response获取当前site的数据:从CMSpage的response结果里得到的properties:使用renderer往DOM元素上添加attribute:在这个DynamicAttributeService里设置断点。Angular是一种流行的前端框架,它提供了一套强大的工具......
  • 9.9续8.31java添加图片
    JLabel管理区域:图片,文字API帮助文档:方法的用法宽高(单位:像素),边框 将图片文件夹粘贴到idea当前模块(最大)下 Imagelcon图片对象:ImageIcon对象名=newImageIcon(图片地址);JLabel对象名=newJLabel(图片对象名);  //管理容器的创建add(管理对象名);  //位置确定后再调用......
  • 通过feeds添加新设备的支持
    打包一个新的平台构建目标并将其无缝集成到构建过程这或许是我找到的最有用的一个帖子了。我一直是主线openwrt的支持者,三大系统, leanlienolimmortalwrt各有千秋,但是源码支持比官方主线还是差一些,又各玩花活。但是从我玩mt7621开始,就一直是希望使用主线代码编译固件,外挂平......
  • 2.11 PE结构:添加新的节区
    在可执行PE文件中,节(section)是文件的组成部分之一,用于存储特定类型的数据。每个节都具有特定的作用和属性,通常来说一个正常的程序在被编译器创建后会生成一些固定的节,通过将数据组织在不同的节中,可执行文件可以更好地管理和区分不同类型的数据,并为运行时提供必要的信息和功能。节的......
  • 2.11 PE结构:添加新的节区
    在可执行PE文件中,节(section)是文件的组成部分之一,用于存储特定类型的数据。每个节都具有特定的作用和属性,通常来说一个正常的程序在被编译器创建后会生成一些固定的节,通过将数据组织在不同的节中,可执行文件可以更好地管理和区分不同类型的数据,并为运行时提供必要的信息和功能。节的......
  • 空指针产生的条件 null对象调用属性
    null对象调用属性 e.gpublicclassStudent{Integerage;Stringname;Stringaddress;Useruser;}Studentstudent=newStudent();12:student.getUser().getName()Exceptioninthread"main"java.lang.NullPointerException atpatter......
  • 使用反射修改bean的属性值报错
    前段时间在使用spring的ReflectionUtils工具类中的doWithFields()方法时,报了一个无法修改private修饰的字段的错误,报错信息如下:java.util.concurrent.ExecutionException:java.lang.IllegalStateException:Notallowedtoaccessfield'xxx':java.lang.IllegalAccessException......
  • 2023-09-08 小程序之启用组件按需注入 ==》 添加一行代码:"lazyCodeLoading": "require
    在manifest.json文件里面的mp-weix对象添加代码:"lazyCodeLoading":"requiredComponents"可实现组件按需注入,引用官方说法就是:启用按需注入后,小程序仅注入当前访问页面所需的自定义组件和页面代码。未访问的页面、当前页面未声明的自定义组件不会被加载和初始化,对应代码文件将不被......
  • 为什么el-table-column的type属性不能动态变化?
    在ElementUI中,`el-table-column`组件的`type`属性无法动态变化,而`el-button`组件的`disabled`属性可以动态变化,这是因为这两个属性在实现上有所不同,涉及到了Vue组件的属性绑定方式和属性的响应性。`el-table-column`组件的`type`属性是静态属性,是在组件初始化阶段就确定的,无法通......
  • Oracle数据库添加索引注意事项
    1、确定是否有专门的索引空间。--查看表所在的表空间SELECT*FROMuser_tablestWHEREt.table_name='TABLENAME';--查看索引所在的索引空间SELECTTABLESPACE_NAMEFROMDBA_INDEXESWHEREINDEX_NAME='INDEXNAME';2、预估建立索引所需的空间大小。3、查看表空间剩余或者索......