当前位置: 首页 > 科技观察

3Rs软件架构介绍,代码质量的四个阶段之一

时间:2023-03-13 13:47:10 科技观察

说到代码质量,我们可能会想到:代码风格、命名、内聚、耦合、重复码率、圈复杂度等。对于代码优化,我们可能会想到代码风格规范、高内聚、低耦合、单一职责、开放封闭原则、约定优于配置、单元测试等等。给定一段代码,能否简单描述一下当前代码的质量,并提出优化方向?如果觉得难,可以参考3Rs软件架构[1]。3Rs软件架构对代码质量进行分层并提供代码优化方向:可读性=>可重用性=>可重新配置。下面我们来详细了解一下每一层代码的特点和优化方法。第四阶段:难以维护的代码这个阶段的代码是难以维护的,俗称shi代码。这个阶段的代码很难阅读和修改。这个阶段的代码很难阅读。例如:不一致的代码风格。缩进、空格不一致。神秘的命名。很长的函数。许多分支,深度嵌套的条件语句。在此阶段更改代码也很困难。例如:大量重复的代码导致一处出现问题,需要多处改。高耦合的代码导致改变一个模块,这将改变许多相关的模块。密切相关但相距甚远的代码。改变很累。第三阶段:代码可读性(Readability)这个阶段的代码可读性好。可读性是另一种说法,它很容易阅读。它具有以下特点:一致的编码风格。空格、缩进、命名风格(驼峰式、破折号等)在整个项目中保持一致。合理命名。“观其名,知其义”。必要的注意事项。当代码本身没有明确说明作者的意图时写注释。没有代码行数很多(超过1k行)的特征:文件、组件、函数等。函数的参数个数不超过4个。没有圈复杂度高的代码。高圈复杂度通常意味着许多分支或深层嵌套。如何到达那里到达这个阶段相对容易。代码检查工具可以保证代码风格的统一。代码检查工具还可以检查:函数的参数个数、圈复杂度[2]等。工具包括:ESLint[3]、CSSLint[4]等。代码改动后,必须通过该工具检查后方可提交。使用代码格式化工具,您可以自动修复存在代码风格问题的代码。这些工具包括Prettier[5]等。这个阶段最困难的部分是命名。好的命名是“观其名知其义”,直白而意味深长。推荐使用紫禁城命名法[6]。有关更多命名技术,请参见[7]。第二阶段:可重用代码(Reusability)这个阶段的代码就是可重用代码。本阶段代码的特点:单一职责。每个模块只有一个责任。不必要的代码重复是最小的。重复的代码会导致一个地方出现问题,需要在很多地方进行更改。但如果过分追求没有重复,也会导致可读性差,不灵活。模块具有低耦合和高内聚性。如何实现这个阶段需要在做代码设计的时候设计好模块之间的边界和API,做到职责清晰,高内聚,低耦合。进入此阶段的建议:编写更多代码。查看以前编写的代码。阅读更多优秀的代码,向好的地方学习。学习设计原则、设计模式。学习一些具体的技术:函数式编程、反应式编程、面向领域编程等。第一阶段:可重构代码(Refactorability)这一阶段的代码是可重构的。这意味着当你重构某段代码时(不修改外部API),其他代码仍然可以正常工作而不改变其他代码。这个阶段的代码必须是低耦合的。模块之间的连接就像乐高一样。如何到达那里要到达这个阶段,您需要:隔离副作用。测试。静态打字。让我们具体一点。隔离副作用副作用是指在模块外修改数据。例如:修改全局变量,修改DOM等。在模块代码中,混入副作用代码会导致以下问题:副作用使代码难以测试。当模块依赖的外部数据发生变化时,模块的返回值可能会发生变化。这使得模块返回不稳定。副作用导致模块之间的耦合。如果多个模块依赖于一些外部数据,那么这些外部模块就是耦合的。多个模块可以更改外部数据,数据流非常混乱。副作用使我们的系统不可预测。如果一个模块改变了外部数据,它可能会影响整个系统。如何隔离副作用?答案是在一个统一的地方管理应用程序的全局数据。例如,使用Redux[8]或Vuex[9]。测试这里的测试是指白盒测试。测试确保对代码的更改不会影响测试所涵盖部分的功能。对于前端,需要编写单元测试和端到端测试。每次提交代码时,都需要运行所有测试。静态类型使用静态类型可以避免许多低级的语法和逻辑错误,例如传递较少的参数。目前前端静态类型的主流是使用TypeScript[10]。参考文献[1]3Rs软件架构:https://github.com/ryanmcdermott/3rs-of-software-architecture[2]圈复杂度:http://eslint.cn/docs/rules/complexity[3]ESLint:https://eslint.org/[4]CSSLint:http://csslint.net/[5]Prettier:https://prettier.io/[6]紫禁城命名法:https://juejin.cn/post/6844903913892610061[7]这里:https://www.yuque.com/fegogogo/fe/wup00n[8]Redux:https://redux.js.org/[9]Vuex:https://vuex。vuejs.org/zh/guide/[10]TypeScript:https://www.typescriptlang.org/