良好的注释可以帮助开发人员理解代码的逻辑、功能和实现方式,减少维护成本,提高代码质量和可维护性。
以下是一些前端代码注释的最佳实践:
可以在vscode的插件市场,下载koroFileHeader 进行安装,可以一键生成注释格式。
统一的前端代码风格规范可以使前端开发更加高效和易于维护。通过遵循一致的缩进和空格、行宽限制、语句结束符、语句块、命名规则、注释、文件命名、模块化和组件化等规范,可以使前端开发更加规范化、易于阅读和维护。同时,使用代码质量检查工具(如ESLint)也可以帮助团队发现和修复代码中的问题,提高代码质量。
以下是一些统一前端代码风格规范的最佳实践:
一般常见的命名规范如下:
在编程中,函数是我们进行模块化、复用代码的重要工具。保持函数的整洁和可读性对于代码的可维护性和可扩展性至关重要。以下是一些关于如何保持函数整洁的最佳实践:
写代码也是一个表达的过程,虽然表现形式不同,但是如果我们能够采用符合人类自然语言习惯的表达习惯来写代码,对阅读代码的人理解我们的代码是很有帮助的。
在判断一些正负逻辑的时候,建议使用if(result)而不是if(!result)。
在写if/else语句的时候,可能会有很多不同的互斥情况(好多个elseif)。那么这些互斥的情况可以遵循哪些顺序呢?
在一个函数或是方法里,可能有一些情况是比较特殊或者极端的,对结果的产生影响很大(甚至是终止继续进行)。如果存在这些情况,我们应该把他们写在前面,用return来提前返回(或者返回需要返回的返回值)。
这样做的好处是可以减少if/else语句的嵌套,也可以明确体现出:“哪些情况是引起异常的”。
对于魔法数,应该用一个枚举对象或一个常量来赋予其可见的意义。这样,你在用到的时候,就能够明确的知道它代表的是什么意思
而且,当需求变化的时候,只需要改变一个地方即
- const LOGIN_SUCCESS = '3756'; // 为业务常量命个名,看起来就非常清晰易读
- if (res.code === LOGIN_SUCCESS) {
- // todos
- }
将复杂的逻辑块封装到单独的函数或者方法中。这不仅可以使你的主程序更加简洁,还可以使你的代码更加模块化,易于维护和测试。
- // not-recommended ❌
- // 下面这个if里面的判断条件,需要花一番精力才能知道作者要表达的是什么;
-
- let getPrice = function( price ){
- let date = new Date();
- if ( date.getMonth() >= 6 && date.getMonth() <= 9 ){ // 夏天
- return price * 0.8;
- }
- return price;
- };
-
- // recommended ✅
- // 提炼成单独的函数就能做到一目了然了;
- let isSummer = function(){
- let date = new Date();
- return date.getMonth() >= 6 && date.getMonth() <= 9;
- };
- let getPrice = function( price ){
- if (isSummer() ){ // 夏天
- return price * 0.8;
- }
- return price;
- };
为完成一个功能每个程序员都会有不同的算法或者说写法,通常来说越清晰的算法可维护性越高。当发现做一件事可以有更清晰的方式,你就就应该用比较清晰的方式取代复杂的方式。
- function foundPerson(people) {
- for(let i = 0; i < people.length; i++) {
- if (people[i] === "Don") {
- return "Don";
- }
- if (people[i] === "John") {
- return "John";
- }
- if (people[i] === "Kent") {
- return "Kent";
- }
- }
- return "";
- }
我们其实并不需要这些条件语句:
- function foundPerson(people) {
- const candidates = ["Don", "John", "Kent"];
- return people.find(p => candidates.includes(p)) || '';
- }
- function commandHandle(command){
- if(command === 'install'){
- install()
- }else if(command === 'start'){
- start()
- }else if(command === 'restart'){
- restart()
- }else{
- showToast('未知命令')
- }
- }
switch比较适合这种判断条件比较单一的情况,如判断是否等于某个字符串或者数字,如果if条件存在3个及以上,使用switch相对来说结构更加清晰。
- function commandHandle(command){
- switch (command){
- case 'install':
- install();
- break;
- case 'start':
- start();
- break;
- case 'restart':
- restart();
- break
- default:{
- showToast('未知命令')
- }
- }
- }
还可以进行更进一步的优化,通过一个map来指定每个命令对应的动作。
可以利用策略模式来做进一层的优化
- function commandHandle(command) {
- let commandHandleMap = {
- install,
- start,
- restart,
- default: () => showToast('未知命令')
- }
- let handle = commandHandleMap[command] || commandHandleMap['default']
- handle()
- }
-
如果某个条件极其罕见,就应该单独检查该条件,并在该条件为真时立刻从函数中返回。这样的单独检查常常被称为“卫语句
- function getPayAmount() {
- let result;
- if (isDead)
- result = deadAmount();
- else {
- if (isSeparated)
- result = separatedAmount();
- else {
- if (isRetired)
- result = retiredAmount();
- else
- result = normalPayAmount();
- }
- }
- return result;
- }
使用卫语句可以大大减少嵌套语句的数量,增强可读性:
- function getPayAmount() {
- if (isDead) return deadAmount();
- if (isSeparated) return separatedAmount();
- if (isRetired) return retiredAmount();
-
- return normalPayAmount();
- }