代码规范(以后会补充)

目录

为什么要规范代码

不规范的代码有什么特点

 ​编辑

 不规范的坏处

规范代码是什么样的

如何规范代码

 1.代码中不要出现莫名其妙的数字

 2.深度嵌套

 3.注释

4.避免创建大函数

 5.重复代码

 6.变量命名

7.函数命名

8.命名时注意动词的使用

9. 常量值所有都大写

10. 避免变量使用字母


为什么要规范代码

 

1.提升个人形象。在保证满足需求的同时,如果还符合代码规范,既可以减少愚蠢错误,也可以提升个人形象。

2.代码是需要维护的。无论是自己维护,还是其他人维护,都需要阅读代码(长时间后自己的代码也会忘记)。符合规范的代码,能减少理解成本。按照规范设计的代码能够减少思维阅读的负担。

3.团队合作。项目往往不是一个人完成。符合规范的代码方便团队合作,并且尽量减少愚蠢错误。在离开岗位(升职,换岗,换项目,辞职)时,方便团队成员接手代码。降低团队合作过程中的阻力

4.赏心悦目。规范的代码就像整洁的桌面;摆放整齐的书架;井井有条的卧室。能给人一种很舒服的感觉。

不规范的代码有什么特点

 

代码重复

  • 实现逻辑相同、执行流程相同

方法过长

  • 方法中的语句不在同一个抽象层级
  • 逻辑难以理解,需要大量的注释
  • 面向过程编程而非面向对象

过大的类

  • 类做了太多的事情
  • 包含过多的实例变量和方法
  • 类的命名不足以描述所做的事情

逻辑分散

  • 发散式变化:某个类经常因为不同的原因在不同的方向上发生变化
  • 散弹式修改:发生某种变化时,需要在多个类中做修改

严重的情结依恋

  • 某个类的方法过多的使用其他类的成员

数据泥团/基本类型偏执

  • 两个类、方法签名中包含相同的字段或参数
  • 应该使用类但使用基本类型,比如表示数值与币种的Money类、起始值与结束值的Range类

不合理的继承体系

  • 继承打破了封装性,子类依赖其父类中特定功能的实现细节
  • 子类必须跟着其父类的更新而演变,除非父类是专门为了扩展而设计,并且有很好的文档说明

过多的条件判断

过长的参数列

临时变量过多

令人迷惑的暂时字段

  • 某个实例变量仅为某种特定情况而设置
  • 将实例变量与相应的方法提取到新的类中

纯数据类

  • 仅包含字段和访问(读写)这些字段的方法
  • 此类被称为数据容器,应保持最小可变性

不恰当的命名

  • 命名无法准确描述做的事情
  • 命名不符合约定俗称的惯例

过多的注释

 不规范的坏处

  • 难以复用
  • 系统关联性过多,导致很难分离可重用部分
  • 难于变化
  • 一处变化导致其他很多部分的修改,不利于系统稳定
  • 难于理解
  • 命名杂乱,结构混乱,难于阅读和理解
  • 难以测试
  • 分支、依赖较多,难以覆盖全面

规范代码是什么样的

借鉴博客

  • 代码逻辑直截了当,缺陷难以隐藏
  • 尽量减少依赖,便于维护,便于阅读
  • 分层战略完善代码逻辑,不冗余
  • 有单元测试,性能调优
  • 只提供一种做一件事的途径

如何规范代码

参考博客

 1.代码中不要出现莫名其妙的数字

很多程序员在实现功能的时候会分配一个没有明确意义的数字,用于特定的目的,写完这个数字后没有即使去做注释,然后过两天当程序出现问题时,翻看代码碰到这个数字,连自己都忘了它的意义。当程序需要固定的数值参与时,给予特定的名称。

//错误的示范:
 for(let i = 0; i < 50; i++){
  //do something
 }
//正确的示范:
 let NUMBER_OF_STUDENTS= 50
 for(let i = 0; i < NUMBER_OF_STUDENTS; i++){
  //do something
 }

 2.深度嵌套

有些程序需要使用到无数次的嵌套循环,看着看着就晕了,这时可以将所有循环提取到单独的函数中。

假设有一个包含两层嵌套的数组,想要拿到最后一个数组的值?一般情况下开发者都会使用嵌套循环,但不是最佳的办法。可以尝试使用函数的反复调用来完成操作执行相同操作的,这样一来代码重复性更小,更易于阅读、重用性高。

// 错误示范
 const array = [ [ ['Shoaib Mehedi'] ] ]
 array.forEach((firstArr) =>{
  firstArr.forEach((secondArr) => {
  secondArr.forEach((element) => {
  console.log(element);
  })
  })
 })

// 正确示范
 const array = [ [ ['Shoaib Mehedi'] ] ]
 const getValuesOfNestedArray = (element) => {
  if(Array.isArray(element)){
  return getValuesOfNestedArray(element[0])
  }
  return element
 }
 getValuesOfNestedArray(array)

 3.注释

注释是一个老生常谈的话题,很多人不重视,为了快速完成项目忽略注释,导致后期修改和复用出现很大问题,得不偿失。参考博客

   1.1 项目开发中,尽量保持代码注释规范和统一。 
   1.2 注释方便了代码的阅读和维护。 
   1.3 边写代码边注释,修改代码时要相应修改注释,保证注释和代码的一致性。 
   1.4 注释要简洁明确,不要出现形容词。  
   1.5 通过注释可以快速知道所写函数的功能,返回值,参数的使用。
   1.6 一般情况下,源程序有效注释量必须在20%以上。 注释不宜太多、不宜太少,准确易懂简洁。
   

4.避免创建大函数

当一个函数或一个类需要实现的功能太多时,建议将其分成多个小的函数。

假设我们需要加减两个数字。我们可以用一个功能做到这一点。但是好的做法是将它们分为两部分。如果有单独的功能,则可以在整个应用程序中重复使用。

// 错误示范
 const addSub = (a,b) => {
  // add
  const addition = a+b
  // sub
  const sub = a-b
  // returning as a string
  return `${addition}${sub}`
 }
//正确示范
// add
 const add = (a,b) => {
  return a+b
 }
 // sub
 const sub = (a,b) => {
  return a-b
 }
 

 5.重复代码

重复代码也是常见的问题,如遇到此情况,将重复代码提取到函数中。

继续用上面的第2点“深层嵌套”中的例子来举例。

// 错误示范
 const array = [ [ ['Shoaib Mehedi'] ] ]
 array.forEach((firstArr) =>{
  firstArr.forEach((secondArr) => {
  secondArr.forEach((element) => {
  console.log(element);
  })
  })
 })
 
// 正确示范
 const array = [ [ ['Shoaib Mehedi'] ] ]
 const getValuesOfNestedArray = (element) => {
  if(Array.isArray(element)){
  return getValuesOfNestedArray(element[0])
  }
  return element
 }
 getValuesOfNestedArray(array)

 6.变量命名

变量命名也是有讲究的,好的变量命名可以让代码更加通俗易懂,一般来说命名遵循以下标准,名称以小写字母开头,之后的每一个单词首字母都用大写,比如骆驼的大小写为camelCase 

函数和变量都必须遵循此规则。

7.函数命名

函数的命名基本与上述提到的变量命名规则基本一样,但需要注意的是,命名尽量注意详细,比如我们需要一个能够获取用户银行信息的功能,那么要尽量将命名具体化,如下

错误的示范:getUserInfo。

正确的示范:getUserBankInfo

8.命名时注意动词的使用

比如我们需要从数据库中获取用户信息,函数的名称可以是userInfo,user或者fetchUser,但我推荐使用含有动词的命名 getUser。

9. 常量值所有都大写

常量命名都使用全大写的名称,并用下划线分割所有单词

10. 避免变量使用字母

在功能性的命名中尽量避免使用单个字母,不过如果在循环中,可以忽略这一点

//错误示范
const q = () => {
 //....
}
//正确示范
const query = () => {
 //....
}//this is also okay
for(let i = 0;i < 10; i++){
 //...
}

其他规范可以参考这个

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/7928.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PMP备考资料:如何掌握PMP应考中的计算题?

计算题总体来说考得非常简单&#xff0c;题量也少&#xff0c;有时候只考3道、4道简单计算。所以这部分内容大家要细心严谨&#xff0c;不要因为粗心而丢掉分数。 01三点估算 通过考虑估算中的不确定性和风险&#xff0c;可以提高活动持续时间估算的准确性。这个概念源自计划…

映射的概念以及用法

映射的概念以及用法前言映射的定义映射的应用前言 在数学里&#xff0c;映射是个术语&#xff0c;指两个元素的集之间元素相互 “对应”的关系&#xff0c;为名词。映射&#xff0c;或者射影&#xff0c;在数学及相关的领域经常等同于函数&#xff0c;函数是从非空数集到非空数…

PyCharm解决Git冲突

技术背景 在前面的一篇博客中&#xff0c;我们介绍了Fork到自己名下的本地仓库如何与远程原始仓库创建链接的方法。在这篇文章中&#xff0c;我们将要讲解如何应对在这种异步开发的过程中经常有可能会遇到的Git冲突问题&#xff0c;在Pycharm这个专业的Python开发工具中集成了一…

网络基础概念

本文目标&#xff1a; ①了解网络发展背景, 对局域网/广域网的概念有基本认识; ②了解网络协议的意义, 重点理解TCP/IP五层结构模型; ③学习网络传输的基本流程, 理解封装和分用; 1.计算机网络背景 OS与网络 在整个计算机体系中&#xff0c;是先由操作系统&#xff0c;再有网…

Windows下使用SSH密钥实现免密登陆Linux服务器

工具&#xff1a; win10、WinSCP 生成ssh密钥&#xff1a; 打开终端&#xff0c;使账号密码登录&#xff0c;输入命令 ssh-keygen -t rsa 会提示密钥存放路径&#xff0c;一般存放在默认路径&#xff0c;直接回车即可&#xff0c;中间会提示输入密码&#xff0c;这里需要注…

CC攻击原理以及如何防御策略

CC攻击原理以及如何防御策略 CC 攻击是一种 DDoS&#xff08;分布式拒绝服务&#xff09;&#xff0c;它似乎比其他 DDoS 攻击更具技术性。在这种攻击中&#xff0c;看不到假IP&#xff0c;看不到特别大的异常流量&#xff0c;但会导致服务器无法正常连接。 很多创业公司辛辛苦…

你是真的“C”——C语言测评总结

你是真的“C”——C语言测评总结&#x1f60e;前言&#x1f64c;BC146 添加逗号总结撒花&#x1f49e;&#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神贯注的上吧&#xff01;&#xff01;&#xff01; &#x1f60a;作者简介&#xf…

TreEnhance: A Tree Search Method For Low-Light Image Enhancement 论文阅读笔记

这是2023年PR这个期刊的论文主要思想是&#xff0c;利用一系列预定义好的操作序列来进行增强&#xff0c;然后利用强化学习来学习增强序列的预测。所以训练阶段有两个交替进行的阶段&#xff0c;一个是蒙特卡洛树搜索阶段&#xff0c;第二个是训练深度强化学习的阶段。而测试的…

中级软件设计师备考---计算机组成与体系结构3

目录①磁盘工作原理②计算机总线③系统可靠性分析④校验码CRC循环校验码海明校验码①磁盘工作原理 计算题 ②计算机总线 概念题 ③系统可靠性分析 计算可靠度 ④校验码 码距&#xff1a;是指两个码字之间的不同位数。例如&#xff0c;1010和1111之间的码距是2&#xff0c…

160. 相交链表 ——【Leetcode每日一题】

160. 相交链表 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c…

生成式人工智能所面临的问题有哪些?

在生成式人工智能中工作需要混合技术、创造性和协作技能。通过发展这些技能&#xff0c;您将能够在这个令人兴奋且快速发展的领域应对具有挑战性的问题。 生成式人工智能是指一类机器学习技术&#xff0c;旨在生成与训练数据相似但不完全相同的新数据。 换句话说&#xff0c;…

【二分—STL】lower_bound()函数upper_bound()函数的使用总结

目录一、基本用法&#xff1a;二、具体到题目中如何应用1、数的范围2、递增三元组3、数组元素的目标和一、基本用法&#xff1a; lower_bound() 用于二分查找区间内第一个 大于等于某值(> x) 的迭代器位置 upper_bound() 用于二分查找区间内第一个 大于某值(> x) 的迭代器…

IP协议以及相关技术

这里写目录标题前言正文IP基本认识IP的作用IP和MAC的关系IP地址的基础知识IP地址定义IP地址分类(IPv4)无分类IP地址CIDR子网掩码IPv6基础知识相关技术DNS域名解析ARPDHCPNATICMPIGMP总结参考连接前言 大家好&#xff0c;我是练习两年半的Java练习生&#xff0c;今天我们来讲一…

Meta AI Segment Anything Model (SAM)初体验

最近Meta AI发布了Segment Anything模型&#xff0c;可以直接分割任何图片。我趁热乎体验了一下。 文章目录进入官网 & 上传图片Hover & Click——截取物体Box——框选物体Everything——提取所有物体Cut-Outs——提取结果进入官网 & 上传图片 打开Segment Anythi…

JMP指令寻址方式总结,JMP BX指令寻址方式是什么

jmp 指令的几种寻址方式 jmp short 标号 段间跳转 -128-127 jmp far ptr 标号 超段转移 跳转包含目标地址jmp reg 16位寄存器 jmp word ptr 内存单元地址 段内转移 jmp dword ptr 内存单元地址 ( 段间转移) 高字地址存放cs 低字节存放ip jmp指令用法总结 1.直接用法(只能在Deb…

hadoop3.2.4 集群环境搭建

本文介绍hadoop3.2.4集群环境搭建看本文之前最好先看看伪分布式的 搭建文章链接如下&#xff0c;因为有些问题是伪分布式的时候遇到的&#xff0c;这里就不重复展示解决办法了。 链接&#xff1a;伪分布式搭建 文章目录前言一、准备机器二、linux环境准备工作2.1 修改主机名2.2…

超详细从入门到精通,pytest自动化测试框架实战-钩子函数(五)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 pytest这个框架提供…

政务云建设与应用解决方案

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除 政府信息化趋势-四大四新-政务云需求 大平台共享-新设施&#xff1a;打造形成“覆盖全市、统筹利用、统一投入”的大平台&#xff0c;有力促进政务信息系统整合&#xff1b; 大…

面试官:说一说mysql的varchar字段最大长度?

在mysql建表sql里&#xff0c;我们经常会有定义字符串类型的需求。 CREATE TABLE user (name varchar(100) NOT NULL DEFAULT COMMENT 名字 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 ;比方说user表里的名字&#xff0c;就是个字符串。mysql里有两个类型比较适合这个场景。 ch…

【Maven】2—命令行创建Web工程依赖排除

⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; 如果文章对你有所帮助&#xff0c;可以点赞&#x1f44d;…