像盖房子一样写代码

更新日期: 2018-09-22 阅读: 2.5k 标签: 代码

当我写一个功能模块方法时,我在想些什么

// 无论什么方法,都是这样一个结构
const fn = () => {

};

比比如,我要写一个接口,查询组织下的设备列表 /api/device/list


地基

const deviceList = (params) => { // 传入一些参数
  return []; // 返回一个列表
};

我需要哪些参数:

  • 用户基本信息(主要是用户 id,用户的组织 id)
  • 用户对应的组织基本信息(主要是组织 id,组织管理员 id,层级关系,以及权限逻辑)

输出结果很简单,为一个数组。


浇筑

第一步分析,存在成功和错误(错误类型先不考虑)两种类型的结果。

// 成功
// 错误
const deviceList = async (ctx) => {
  // 错误
  if(someError) {
    // 返回错误结果
  }
  // 成功
  return getDevicesByOid(oid);
};

这是一个大概的设想,没有必要将代码写出来。然后润化该思路,写出第一段框架


主体结构

首先,传入的参数为组织 oid,用户的信息可以通过 session(或其他方式)从内部获得。


可能的一种思路

// 成功
// 错误
// 错误1:用户未加入组织
// 错误2:传入参数组织不存在
// 错误3:用户无组织权限

// 传入参数: 要查询的组织 oid
// 能够通过 session 取到的信息: user
const deviceList = async (ctx) => {
  // 用户信息 ctx.user
  // 判断用户是否有组织
  if (ctx.user.oid === 0) {
    // 错误1:用户未加入组织
  }

  // 如果不传该参数,查询当前用户组织的设备
  const { oid = ctx.user.oid } = ctx.request.body;
  if (oid === ctx.user.oid) {
    // 成功
    return getDevicesByOid(oid);
  }

  // 根据oid查询组织信息
  // 错误2:传入参数组织不存在
  // 判断是否有权限
  const checkRights = await checkUserOrgRights(ctx.user.uid, oid);
  if (!checkRights) {
    // 错误3:用户无组织权限
  }
  // 成功
  return getDevicesByOid(oid);
};


推荐的实现方式

// 成功
// 错误
// 错误1:用户未加入组织
// 错误2:传入参数组织不存在
// 错误3:用户无组织权限

// 传入参数: 要查询的组织 oid
// 能够通过 session 取到的信息: user
const deviceList = async (ctx) => {
  // 用户信息 ctx.user
  // 判断用户是否有组织
  if (ctx.user.oid === 0) {
    // 错误1:用户未加入组织
  }

  // 如果不传该参数,查询当前用户组织的设备
  const { oid = ctx.user.oid } = ctx.request.body;
  if (oid !== ctx.user.oid) {
    // 为什么这里不用等于判断:如果等于的话,则当时就需要返回出去,这样的话该方法会有两个成功的 return
    // 根据oid查询组织信息
    // 错误2:传入参数组织不存在
    // 判断是否有权限
    const checkRights = await checkUserOrgRights(ctx.user.uid, oid);
    if (!checkRights) {
      // 错误3:用户无组织权限
    }
  }
  // 成功
  return getDevicesByOid(oid);
};


封顶

完成其他的业务代码。


当我写一段测试的时候,我在想些什么

按照上面推荐方式完成代码后,需要进行代码的测试。

首先需要明确业务的流程,理清测试的思路。

  • 成功
  • 错误

    • 错误1:用户未加入组织
    • 错误2:传入参数组织不存在
    • 错误3:用户无组织权限

主要有两种设计思路:

设计思路

思路一

  1. 完成测试用例,覆盖成功的所有情况
  2. 完成测试用例,覆盖错误1的所有情况
  3. 完成测试用例,覆盖错误2的所有情况
  4. 完成测试用例,覆盖错误3的所有情况

这是传统的单元测试衍生而来的 BDD 测试方式。

这里测试用例的个数应该为8次:

  • 成功:

    • 1.当前组织的用户有传入组织 oid
    • 2.当前组织的用户未传入组织 oid
    • 3-5.上级组织,上上级组织,根级组织的管理员用户传入组织 oid
  • 6.失败1:用户未加入组织
  • 7.失败2:传入参数组织不存在
  • 8.失败3:用户无组织权限

其中,测试3-5可以优化为一次测试(即根据所有管理员 uid 的数组比较是否包含当前用户 uid),最终优化后的结果应当为6次。

但由于该思路中不明确用户,所以用户行为无法准确表达,在创建测试数据的时候较为困难,不仔细思考分析,无法优化需要创建多少条测试数据。


思路二

而实际上 BDD 测试为用户行为测试,可以以几类用户的情形分别进行测试。

  1. 模拟一个用户的数据,覆盖成功和可能错误(有可能无法涵盖到所有错误)的所有情况
  2. 根据未覆盖的部分,再模拟另一个用户的数据,覆盖成功和可能错误(有可能无法涵盖到所有错误)的所有情况

以此循环,直至覆盖所有。

  • 用户1(非组织管理员,查询自己的组织)

    • 1.成功(未传入组织 oid)(组织1)
    • 2.成功(传入组织 oid)
    • 3.失败2:传入参数组织不存在
    • 4.失败3:用户无组织权限(组织2)
  • 用户2(上级某组织管理员)(组织3)

    • 5.成功
  • 用户3(未加入组织用户)

    • 6.失败1:用户未加入组织

非常简洁明了的关系,需要3个测试用户,3个组织(上下级关系进行数据复用,一个无权限的组织),即可涵盖所有范围。

最终优化版设计:

  • 用户1(某组织管理员,有下级组织)

    • 1.成功(未传入组织 oid,查询自己的组织)
    • 2.成功(传入当前的组织 oid(组织1))
    • 3.成功(传入下级的组织 oid(组织2))
    • 4.失败2:传入参数组织不存在
    • 5.失败3:用户无组织权限
  • 用户2(未加入组织用户)

    • 6.失败1:用户未加入组织(组织3)

两个用户,三个组织。完成所有覆盖。


当我以测试驱动开发的时候,我在想些什么

可以从上述测试思路二中进行反推。

实际上思路可能是在写代码或者写测试的过程中不断的改进和完善的。

  • 如果已经写好了测试正在写代码,可以及时回过头来调整测试;
  • 如果功能写好了又再重新测试,可以在测试优化后再去看逻辑代码是否还有优化的空间。

更多关注: https://leader.js.cool/#/expe...


本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/2514

相关推荐

减少嵌套,降低代码复杂度

减少嵌套会让代码可读性更好,同时也能更容易的找出bug,开发人员可以更快的迭代,程序也会越来越稳定。简化代码,让编程更轻松!

js高亮显示关键词_页面、搜索关键词高亮显示

页面实现关键词高亮显示:在项目期间遇到一个需求,就是搜索关键词时需要高亮显示,主要通过正则匹配来实现页面关键词高亮显示。在搜索结果中高亮显示关键词:有一组关键词数组,在数组中筛选出符合关键字的内容并将关键字高亮

Js代码压缩工具推荐

JavaScript 代码压缩是指去除源代码里的所有不必要的字符,而不改变其功能的过程。这些不必要的字符通常包括空格字符,换行字符,注释以及块分隔符等用来增加可读性的代码,但并不需要它来执行。

源代码是什么意思

源代码(也称源程序),是指一系列人类可读的计算机语言指令。 在现代程序语言中,源代码可以是以书籍或者磁带的形式出现,但最为常用的格式是文本文件,这种典型格式的目的是为了编译出计算机程序。

tinymce与prism代码高亮实现及汉化的配置

TinyMCE是一个轻量级的基于浏览器的所见即所得编辑器,由JavaScript写成。它对IE6+和Firefox1.5+都有着非常良好的支持。功能方强大,并且功能配置灵活简单。另一特点是加载速度非常快的。

Google内部在代码质量上的实践

良好的编程习惯涉及到很多方面,但在软件行业内,大多数的公司或组织都不会把良好的编程习惯列为主要关注点。 例如,具有可读性和可维护性的代码比编写好的测试代码或使用正确的工具更有意义,前者的意义在于可以让代码更易于理解和修改。

接手代码太烂,要不要辞职?

朋友发表了一条说说:入职新公司,从重构代码到放弃”,我就问他怎么了?他说,刚进一家新公司,接手代码太烂,领导让我先熟悉业务逻辑,然后去修复之前项目中遗留的bug,实在不行就重构

网站加入收藏、设为首页Js代码(兼容各种浏览器)

这里虽然说是兼容,但是有些浏览器的设置就是不支持用js来把页面设为首页,加入收藏夹,只能让用户手动去在浏览器或者按键去设置这些功能,这里说的兼容是指当浏览器有这个设置的时候js会有提示

提升JavaScript代码质量的最佳实践

在JavaScript编程中,代码质量优化是一项重要的技能。它可以帮助我们提高代码的可读性、可维护性和性能。本文将通过一些实际优化过程中的案例,展示如何通过一些技巧和最佳实践,使我们的代码更加优雅。

javascript代码语句结束要不要加分号?

在 C 语言中,分号是语句结束的标志,在语句结束的地方一定要以分号结束。而 JavaScript 的分号却是可选的,若语句都各占一行,则可以省略分号。avaScript 中的 ASI 机制,允许我们省略分号。ASI 机制不是说在解析过程中解析器自动把分号添加到代码中

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!