业务开发中的归纳与总结,实现业务场景从繁琐到简单的蜕变【前端业务实践】

举报
叶一一 发表于 2024/01/28 21:35:35 2024/01/28
【摘要】 背景即便是已经开发过数不清的业务功能,在遇到下面这种情况的时候,第一感觉还是“一个头两个大”。得想个办法先简化功能内容,再进行方案设计,方能实现务场景从繁琐到简单的蜕变。简单的思维转换越是繁琐的业务场景越需要梳理经络,经络捋顺清楚,开发方案也就八九不离十了。操作按钮展示规则通过需要判断的值的数组、逻辑运算符、关系运算符,最终确定是否展示布尔值。1、逻辑运算符将逻辑运算转换成数组对应的方法||...

背景

即便是已经开发过数不清的业务功能,在遇到下面这种情况的时候,第一感觉还是“一个头两个大”。

得想个办法先简化功能内容,再进行方案设计,方能实现务场景从繁琐到简单的蜕变。

简单的思维转换

越是繁琐的业务场景越需要梳理经络,经络捋顺清楚,开发方案也就八九不离十了。

操作按钮展示规则

通过需要判断的值的数组、逻辑运算符、关系运算符,最终确定是否展示布尔值。

1、逻辑运算符

将逻辑运算转换成数组对应的方法

|| (或运算):多个判断值中有一个符合条件即可,所以使用数组的some方法得到最终的布尔值

&& (与运算):多个判断值中必须都符合条件即可,所以使用数组的every方法得到最终的布尔值

if (expressionType === 'or') {
  flag = list.some(item => {
    return this.getResByInequalityType(item, record[key], inequalityType);
  });
}
if (expressionType === 'and') {
  flag = list.every(item => {
    return this.getResByInequalityType(item, record[key], inequalityType);
  });
}

2、关系运算符

关系运算符因为有多种,所以使用switch表达式更加清晰。

/**
   * 根据不同的操作符获取不同的结果
   * @param {any} item 可能的值
   * @param {any} value 被判断的值
   * @param {string} type 操作运算符
   */
 getResByInequalityType(item, value, type) {
  switch (type) {
    case '!==':
      return value !== item;
    case '>':
      return value > item;
    case '<':
      return value < item;
    case '>=':
      return value >= item;
    case '<=':
      return value <= item;
    case '==':
      return value == item;
    case '!=':
      return value != item;
    default:
      return value === item;
  }
}

3、注意事项

该方法仅支持单个判断值、同类型逻辑运算符、同类型关系运算符。

嵌套交互的处理

1、为什么要特别处理嵌套交互?

  • 会让业务和代码更加清晰,可读性更高。
  • 未来需要在中间插入流程时会方便快捷

2、流程图

必要时,流程图可以帮助简化功能

06.png

3、实现方案

最初想借助中间件设计模式,但是中间件无法满足单步操作中止并返回的功能。所以在中间件的基础上增加了中止返回的功能。

  • 当flag的值是next时,进入下一步;
  • 当flag的值是suspend时,中止方法数组继续循环。此时当前方法可进行一些操作比如提示之类;
/**
   * 嵌套交互方法组合 flag的值:suspend-中止,next-进入下一步
   * @param {Array} funcList 列表数据
   */
  nestedInteractionCompose(funcList) {
    let next;
    while (funcList.length > 0) {
      let middle = funcList.shift();
      let flag = middle();
      console.log(flag, 'flag');
      // flag需要存在值 因为可能有些方法是异步的
      if (flag && flag === 'next') {
        next = middle;
      } else {
        // 中止方法列表继续循环
        break;
      }
    }
    return next;
  },

多重支付优惠设置

该功能的 RP 罗列的十分详细,一目了然。但是我们在做开发设计的时候,是需要进行归纳的。

1、功能介绍

用户类型

订单类型

支付优惠方式

普通用户

普通

优惠配置-普通

普通用户

拼团

优惠配置-拼团

会员用户

普通

优惠配置-普通

会员用户

拼团

优惠配置-拼团

尊享用户

普通

优惠配置-普通、尊享优惠

尊享用户

拼团

优惠配置-拼团、尊享优惠

企业用户

普通

优惠配置-普通、企业优惠

企业用户

拼团

优惠配置-拼团、企业优惠

这时候,功能说明就排上用场了。上面这个详细的表格,归纳成功能说明,就是下面的三句话,一目了然。

1、所有用户根据用户类型和订单类型配置对应支付优惠方式;

2、如果用户类型是尊享用户,则需要新增“尊享优惠”的支付优惠方式;

3、如果用户类型是企业用户,则需要新增“企业优惠”的支付优惠方式

2、实现方案

实现方案可以帮助保障代码质量,同时也帮助前后端提前了解并确定数据的结构。最好包含功能实现的伪代码,有助于阐述逻辑

上面支付优惠的伪代码:

/**
   * 通过不同订单和用户类型的优惠方式
   * @param {Object} param 订单和用户信息
   * @return {Array} 返回的支付优惠方式
   */
  getEmployerPayTypeListByData(param) {
    const { orderType, userType, configPayDiscountMap } = param;
    let payDiscountTypeList = configPayDiscountMap[orderType][userType];
    const customizedMap = {
      exclusive: 3, // 3-尊享优惠
      enterprise:4, // 3-企业优惠
    }
    // 如果用户类型是尊享用户或企业用户 优惠方式需要新增一种
    if (userType === 'exclusive' || userType === 'enterprise') {
      const customizedDiscountTyp = customizedMap[userType];
      payDiscountTypeList.push(customizedDiscountTyp)
      
    }
    return payDiscountTypeList;
  }

总结

对于复杂的业务场景,无论是UI还是逻辑,都可以通过总结与归纳,将功能拆解,然后在整合,进而剔除冗余的内容,实现从繁琐到简单的蜕变。


作者介绍

非职业「传道授业解惑」的开发者叶一一。

《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。

如果看完文章有所收获,欢迎点赞👍 | 收藏️ | 留言📝

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。