软件工程的代码规范

代码规范

在这里插入图片描述

编程过程与规范

  • 软件编程工作
    • 软件编程是一个复杂而迭代的过程,它不仅仅是编写代码,还应该包括代码审查、单元测试、代码优化、集成调试等一系列工作。
      在这里插入图片描述
  • 软件编程规范
    • 软件编程规范是与特定语言相关的描写如何编写代码的规则集合。
    • 目的:
      • 提高编码质量,避免不必要的程序错误。
      • 增强程序代码的可读性、可重用性和可移植性
    • 现实:
      • 软件全生命周期的70%成本是维护
      • 软件在其生命周期中很少由原编写人员进行维护
    • 推荐阅读、学习、并遵守Google公司的编制的规范,链接https://github.com/google/styleguide
      在这里插入图片描述
  • 编程规范:注释
    • 好的注释解释为什么,而不是怎么样
    • 不要再注释中重复描述代码
    • 当自己在编写密密麻麻的注释来解释代码时,需要停下来看是否存在更大的问题
    • 想一想在注释中写什么,不要不动脑经就输入
    • 写完注释之后要在代码的上下文中回顾一下,它们是否包含正确的信息?
    • 当修改代码时,维护代码周围的所有注释
  • 编程规范:命名
    • 编写自文档化的代码
      • 唯一能完整并正确地描述代码的文档是代码本身
      • 编写可以阅读的代码,其本身简单易懂
    • 编写自文档代码的关键是要有清晰的代码结构,规范的命名

良好的编程实践

  • 软件开发的工程思维
    • 1.分析问题
    • 2.初步设计
    • 3.模型评估与测量
    • 4.搭建框架
    • 5.建造
    • 6.测试与验收
  • 模块化设计
    • ==基本思想:==将一个大的程序按照功能分拆成一系列的小模块
    • 作用:
      • 降低程序设计的复杂性
      • 提高模块的可靠性和复用性
      • 缩短产品的开发周期
      • 易于维护和功能扩展
  • 错误与异常处理
    • 错误是导致程序崩溃的问题,例如语法错误(解析错误)或者未捕获的异常(运行错误)等。
    • 异常是运行时期检测到的错误,即使一条语句或者表达式在语法上是正确的,当视图执行它时,也可能会引发错误。

代码静态检查

  • 代码审查
    • 代码审查(Code Review)是一种用来确认方案设计和代码实现的质量保证机制,它通过阅读代码来检查源代码与编码规范的符合性以及代码的质量。
  • 代码审查的作用
    • 检查设计的合理性
    • 互为Backup
    • 分享知识、设计、技术
    • 增加代码可读性
    • 处理代码中的“地雷区”
  • 缺陷检查表
    • 编程规范
      • 按照具体编程语言的编码规范进行检查,包括命名规则、程序注释缩进排版、声明与初始化、语句格式等。
    • 面向对象设计
      • 类的设计和抽象是否合适
      • 是否符合面向接口编程的思想
      • 是否使用合适的设计模式
    • 性能方面
      • 在出现海量数据时,队列、表、文件在传输、上载等方面是否会出现问题,是否控制如分配的内存块大小、队列长度等
      • 对Hashtable、Vector等集合类数据结构的选择和设置是否合适
      • 有无滥用String对象的现象
      • 是否采用通用的线程池、对象池等高速缓存技术以提高性能
      • 类的接口是否定义良好,如参数类型等应避免内部转换
      • 是否采用内存或硬盘缓冲机制以提高效率?
      • 并发访问时的应对策略
      • I/O方面是否使用了合适的类或采用良好的方法以提高性能(如减少序列化、使用buffer类封装流等)
      • 同步方法的使用是否得当,是否过度使用?
      • 递归方法中的迭代次数是否合适(应保证在合理的栈空间范围内)
      • 如果调用了阻塞方法,是否考虑了保证性能的措施
      • 避免过度优化,对性能要求高的代码是否使用profile工具
    • 资源释放处理
      • 分配的内存是否释放,尤其在错误处理路径上(如CIC++)
      • 错误发生时是否所有对象被释放,如数据库连接、Socket、文件等
      • 是否同一个对象被释放多次(如CIC++ )
      • 代码是否保存准确的对象引用计数
    • 程序流程
      • 循环结束条件是否准确
      • 是否避免了死循环的产生
      • 对循环的处理是否合适,因考虑到性能方面的影响
    • 线程安全
      • 代码中所有的全局变量是否是线程安全的
      • 需要被多个线程访问的对象是否线程安全,检查有无通过同步方法保护
      • 同步对象上的锁是否按相同的顺序获得和释放以避免死锁,注意错误处理代码
      • 是否存在可能的死锁或是竞争,当用到多个锁时,避免出现类似情况:线程A获得锁1,然后锁2,线程B获得锁2,然后锁1
      • 在保证线程安全的同时,注意避免过度使用同步,导致性能降低
    • 数据库处理
      • 数据库设计或SQL语句是否便于移植(主义与性能会存在冲突)
      • 数据库资源是否正常关闭和释放
      • 数据库访问模块是否正确封装,便于管理和提高性能
      • 是否采用合适的事务隔离级别
      • 是否采用存储过程以提高性能
      • 是否采用PreparedStatement以提高性能
    • 通讯方面
      • Socket通讯是否存在长期阻塞问题
      • 发送接收的数据流是否采用缓冲机制
      • Socket超时处理和异常处理
      • 数据传输的流量控制问题
    • JAVA对象处理
      • 对象生命周期的处理,是否对象引用已失效可设置null并被回收
      • 在对象传值和传参方面有无问题,对象的clone方法使用是否过度
      • 是否大量经常地创建临时对象
      • 是否尽量使用局部对象(堆栈对象)
      • 在只需要对象引用的地方是否创建了新的对象实例
    • 异常处理
      • 每次当方法返回时是否正确处理了异常,如最简单的处理是记录日志到日志文件中
      • 是否对数据的值和范围是否合法进行校验,包括使用断言
      • 在出错路径上是否所有的资源和内存都已经释放
      • 所有抛出的异常是否都得到正确的处理,特别是对子方法抛出的异常,在整个调用栈中必须能够被捕捉并处理
      • 当调用导致错误发生时,方法的调用者应该得到一个通知
      • 不要忘了对错误处理部分的代码进行测试,很多代码在正常情况下执行良好,而一旦出错整个系统就崩溃了?
    • 方法(函数)
      • 方法的参数是否都做了效验
      • 数组类结构是否做了边界效验
      • 变量在使用前是否做了初始化
      • 返回堆对象的引用,不要返回栈对象的引用
      • 方法的API是否被良好定义,即是否尽量面向接口编程,以便于维护和重构。
    • 安全方面
      • 对命令行执行的代码,需要详细检查命令行参数
      • WEB类程序检查是否对访问参数进行合法性验证
      • 重要信息的保存是否选用合适的加密算法
      • 通讯时考虑是否选用安全的通讯方式
    • 其他
      • 日志是否正常输出和控制
      • 配置信息如何让获得,是否有硬编码

代码性能分析

  • 优化是对代码进行等价变换,是的变换后的代码运行结果与变换前的代码运行结果相同,但执行速度加快或存储开销减少
  • 程序性能
    • 时间复杂度和空间复杂度
    • 代码性能优化是一门复杂的学问。
    • 根据80/20原则,实现程序的重构、优化、扩展以及文档相关的事情通常需要消耗80%的工作量。
  • 代码性能优化
    • 在满足正确性、可靠性、健壮性、可读性等质量因素的前提下,设法提高程序的效率
    • 以提高程序的全局效率为主,提高局部效率为辅
    • 在优化程序效率时,应先找出限制效率的“瓶颈”
    • 先优化数据结构和算法,再优化执行代码
    • 时间效率和空间效率可能是对立的,应当分析哪一个因素更重要,再做出适当的折衷
    • 例如:Python代码性能优化
      • 改进算法,选择合适的数据结构
        • 良好的算法对性能起到关键作用,因此性能改进的首要点是对算法改进
        • 算法时间复杂性的排序依次是
          o(1)→O(lg n)→o(n lg n)→O(n2)→O(n3)O(nk)O(k^n) O(n!)
        • 对成员的查找访问等操作,字典( dictionary )要比列表( list )更快
        • 集合( set )的并、交、差的操作比列表( list )的迭代要快
      • 循环优化的基本原则︰尽量减少循环过程中的计算量,在多重循环的时候,尽量将内层的计算提到上一层。
      • 字符串的优化: Python的字符串对象是不可改变的。字符串连接的使用尽量使用join()而不是+。当对字符串可以使用正则表达式或者内置函数处理时,选择内置函数。
      • 使用列表解析和生成器表达式∶列表解析要比在循环中重新构建一个新的list更为高效,因此可以利用这一特性来提高运行的效率。

结对编程实践

  • 结对编程
    • 是有两名程序员在同一台电脑上结对编写解决同一问题的代码。
    • 结对编程有利于提高代码质量,开发效率,协作能力。
  • 结对编程是一个相互学习、相互磨合的渐进过程,实施时需要团队成员克服个性冲突和习惯差异。
  • 结对编程应该自由选择和灵活运用,它不应是强制性的,也不要教条地运行,最好由两位程序员自己决定合适的方式。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零原点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值