软件工程与计算总结(十八)代码设计

news2025/1/16 20:09:26

目标,编写高质量的代码,本章节只介绍在易读性、易维护性和可靠性方面的最基本的代码设计方法~

一.设计易读的代码

如果编写的代码易读性不好,在维护阶段的多次阅读过程中,将会消耗维护人员大量的精力;研究实验表明,维护时间大部分都花费在了程序阅读和理解上,出于个体和团队两方面的度量,都应该将易读性作为首要质量标准~

1.格式

最基本的要求:代码的布局能够清晰地体现程序的逻辑结构~

  • 使用缩进与对齐表达逻辑结构

  • 将相关逻辑组织在一起

  • 使用空行分割逻辑

  • 语句分行

2.命名

  • 使用有意义的名称进行命名,比如名称要与实际内容相符、使用动词或者动词+名词命名函数和方法,此外返回值和参数的命名也要合适
  • 名称要与实际内容相符
  • 如果存在惯例,命名时要遵守惯例
  • 临时变量命名要符合常规(比如for循环内的控制参数)
  • 不要使用太长的名称
  • 不要使用易混字符进行命名,不利于拼写和记忆
  • 不要使用易混字符进行命名,如“I”和“1”
  • 不要仅仅使用不易区分的多个名称
  • 不要使用没有任何逻辑的字母缩写进行命名

3.注释

文档注释:

(1)注释类型:如果组织得当,代码注释本身就是一份非常好的代码文档

  • //:语句注释
  • /*  */:标准注释
  • /**  */:文档注释

(2)文档注释的内容与格式:包的总结与概述、类和接口的描述、类方法的描述、字段的描述等

(3)javadoc:方便注释文档化代码的工具:

内部注释:

  • 注释要有意义,不要简单重复代码的含义
  • 重视对数据类型的注释
  • 重视对复杂控制结构的注释

二.设计易维护的代码

易读是易维护的必要前提,只有理解了程序代码,才能正确地修改程序代码~

1.小型任务

要让程序代码可修改,就要控制代码复杂度,要求每个函数或者方法的代码应该是内聚的,恰好完成一个功能与目标~

如果内聚的代码比较复杂,典型表现是完成一个功能需要多个步骤、代码比较长,那么就需要将其进一步分解为多个高内聚、低耦合的小型任务~

究其根本,小型任务有更好可维护性的原因是,通过将不同的代码片段抽象为不同的任务接口,可以解决复杂代码的集中不理想但无法回避的内聚——时间内聚、过程内聚and通信内聚~

2.复杂决策

代码中的业务规则是最容易发生修改的地方之一,表现为对代码中复杂决策的修改,所以,在编程中要注意对复杂决策的处理~

  • 引入新的布尔变量简化复杂决策:过于复杂的决策可以引入布尔值(本质上可以理解为换元)
  • 使用有意义的名称封装复杂决策:避免给不掌握相关信息的维护人员带来困难
  • 表驱动编程:将复杂的决策封装为决策表

3.数据使用

  • 不要将变量应用于与命名不相符的目的
  • 不要将单个变量用于多个目的
  • 限制全局变量的使用
  • 不要使用突兀的数字与字符

4.明确依赖关系

类之间模糊的依赖关系会影响到代码的理解与修改,非常容易导致修改时产生未预期的连锁反应,对于模糊的依赖关系,需要进行明确的注释~

三.设计可靠的代码

提高代码可靠性的方法往往会降低底阿妈的易读性和性能,也可能牺牲易维护性,所以只有针对那些可靠性比较重要的代码才会采用提高可靠性的方案~

1.契约式设计

一个函数或者方法在前置条件满足的情况下开始执行,完成后又能够满足后置条件,那么这个函数或者方法就是正确的、可靠的~

  • 异常方式:在代码执行时,检查前置条件是否满足,如果不满足就抛出异常
  • 断言方式:java中的断言语句:assert Expression

(复杂系统中不推荐使用断言方式,异常方式灵活的多)

2.防御式编程

在一个方法与其他方法、操作系统、硬件等外界环境交互时,不能确保外界都是正确的,所以要在外界发生错误时,保证方法内部不受损害~

四.使用模型辅助设计复杂代码

需求开发可以使用分析模型建模复杂业务与需求,软件设计可以使用模型分析与验证复杂设计方案,编程也可以使用一些模型方法帮助设计复杂代码~

1.决策表

一种决策逻辑的表示方法,用于描述复杂决策逻辑~

  • 条件声明:进行决策时需要参考的变量列表
  • 条件选项:那些变量可能的取值
  • 行动声明:决策后可能采取的动作
  • 行动选项:动作会在怎样的条件下发生~

2.伪代码

结合了编程语言和自然语言的特点,结合使用程序语言的逻辑结构和自然语言的表达能力描述程序逻辑~

优点在于,不是编程语言因此不会存在语法问题,不需要担心意思表达是否符合语言规范,可以非常容易地反复修改——好处在于程序员可以从编程语言的细节脱离出来,专项考虑程序逻辑,反复推敲代码质量~

3.程序流程图

很在在结构化编程中使用的模型手段,现在也经常被用来表现和分析程序结构~

五.为代码开发单元测试用例

1.为方法开发测试用例

主要使用两种线索:方法的规格+方法代码的逻辑结构~

2.Mock Object测试类放方法

创建桩程序,以将被测试方法独立出来

3.为类开发测试用例

除了测试类的每一个方法之外,还要测试类不同方法之间相互影响的情况~

六.代码复杂度度量

衡量圈复杂度的基本思路是计算程序中独立路径的最大数量:

建立程序的流程图G,假设图的结点数为N,边数为E,则复杂度V(G)=E+N-2

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

提升品牌形象:利用OLED透明拼接屏进行品牌展示

在当今数字化时代,OLED透明拼接屏作为一项引人注目的新兴技术,正逐渐改变着各行各业的显示方式。 OLED透明拼接屏技术 OLED透明拼接屏采用有机发光二极管(OLED)技术,能够提供卓越的显示效果。 与传统的液晶显示屏相比…

ios UIDocumentPickerViewController 实现TEXT、DOC、PDF等文档读取

文章目录 一、前言二、iCould相关配置三、功能实现3.1 UIDocumentPickerViewController 选取控制器3.2 读取文件一、前言 最近正在研发的项目有一个需求: 允许用户将iCloud中的文档上传,实现文件的流转。 以前接触的项目对于资料类的上传大多是仅限于图片与视频。对于文档类…

WebDAV之π-Disk派盘 + 密码键盘

密码键盘是一款密码管理器,可以存储和管理需要受保护的数据。为方便日常使用,同时也是一款安全输入法,帮您安全便捷地填写账号密码、通用内容、卡包信息。 密码键盘使用军事级的 PBKDF2 有损加密算法保护您的根密码,使用军事级的 AES 加密算法保护您的存储数据。云端再额外…

车载视频如何转换视频格式

当你收集了多种视频想在车内进行播放,它们可能不会自动播放。你有可能会在屏幕上看到一条消息,显示“文件格式不受支持”,这是因为这些视频可能采用了你的汽车无法识别的格式。 那我们如何才可以转换为车载播放器上运行的最重要且最广泛使用…

【UE4 反射系统】 UCLAS UFUNCTION UPROPERTY 宏简单解析 持续更新

目录 0 引言1 C如何实现反射机制1.1 使用代码生成工具实现反射机制 2 UE4的反射系统2.1 ****.generated.h头文件2.2 GENERATED_BODY()2.3 反射宏 UCLASS 等2.4 UHT和UBT 3 基本宏的使用3.1 UCLASS3.2 UFUNCTION3.3 UPROPERTY 🙋‍♂️ 作者:海码007&…

nginx tomcat 动静分离

动静分离: 访问静态和动态页面分开 实现动态和静态页面负载均衡。 五台虚拟机 实验1,动静分离 思路: 需要设备:三台虚拟机 一台nginx 代理又是静态 两台tomcat 请求动态页面 在全局模块中配置upstream tomcat 新建location…

springboot书籍学习平台springboot48

大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路…

C++ 异形窗口

本文参考:Duilib源码 原理:分层窗口,通过定时器和手动触发绘画窗口 由于GDI对透明通道支持不是很好,最好选择GDI进行绘画。 1.设置窗口属性WS_EX_LAYERED和绘画定时器 DWORD dwStyle ::GetWindowLong(hWnd, GWL_EXSTYLE);SetWi…

es6(八)—— set(集合) 和map的使用

ES6的系列文章目录 第一章 Python 机器学习入门之pandas的使用 文章目录 ES6的系列文章目录一、set(集合)0. 定义1. 基本使用2.常用方法(1)代码(2)效果(3)遍历 二、map0. 定义1. 基…

【AIFEM案例操作】压力容器强度分析

AIFEM是由天洑自主研发的一款通用的智能结构仿真软件,助力用户解决固体结构相关的静力学、动力学、振动、热力学等实际工程问题,软件提供高效的前后处理工具和高精度的有限元求解器,帮助用户快速、深入地评估结构的力学性能,加速产…

chatgpt图片识别、生成图片、语音对话多模态深度试玩

大模型替代人的工作的能力,越来越明显了。最近chatgpt支持多模态了,看这大佬们玩的不易乐乎,手痒也想试一试,因此有给openai上供了20刀。 另外我是gpt的拥护者,但是周围的同事有对此担忧,因为他们长期积累的…

协同创新、奔赴未来——“华为云杯”2023人工智能创新应用大赛华丽谢幕

9月27日,在苏州工业园区管理委员会、华为云计算技术有限公司的指导下,由SISPARK(苏州国际科技园)、华为(苏州)人工智能创新中心联合主办,东北大学工业智能与系统优化国家级前沿科学中心、浙江大…

nginx 配置相关详解

目录 Nginx的优点 Nginx简介 Nginx的优点 可以高并发连接 内存消耗少 成本低廉 配置文件非常易懂 稳定性高 内置有健康的检查功能 支持Rewrite重写 支持热部署 Nginx与Apache的对比 Nginx多进程工作原理跟设计 Nginx是如何实现高性能的 事件驱动模型 多进程机制…

kettle-数据库解密与各种跳接线标记含义

1.加密 进入kettle的安装目录 windows系统命令行执行:Encr.bat -kettle 123 linux/mac系统命令行执行:encr.sh -kettle 123 可生成Encrypted 2be98afc86aa7f2e4cb79ce10bec3fd89,即为123对应的kettle加密后的密码。 2.解密(主…

信钰证券:股票的中线和年线?

股票商场一直是许多人注重的焦点。关于股票出资者来说,技巧和战略很重要。而股票的中线和年线便是股票出资中最基本的技术目标之一。这两个目标可以帮忙股民精确判别价格走势,拟定出资方案。在此我们将从几个角度分析股票的中线和年线的重要性。 什么是…

【Redis深度专题】「踩坑技术提升」一文教会你如何在支持Redis在低版本Jedis情况下兼容Redis的ACL机制

Redis低版本客户端兼容高版本Jedis不支持ACL的问题 首先,针对于Redis6.0之后,已经可以支持通过ACL的访问控制列表的机制进行控制多个用户进行权限控制访问,并且更加精细的控制权限访问处理模式,更加的偏向于RBAC模型的机制体系。…

【非root用户、CentOS系统】中使用源码安装gcc/g++的教程

1.引言 系统:CentOS-7.9 显卡驱动版本:460 CUDA Version: 11.2 🌼基于本地环境选择安装gcc-10.1.0 👉 gcc下载网址 2.安装说明 下载好对应的gcc的安装包并解压: 打开gcc-10.1.0/contrib/download_prerequisites&#…

《视觉 SLAM 十四讲》V2 第 8 讲 视觉里程计2 【如何根据图像 估计 相机运动】【光流 —> 直接法】

OpenCV关于 光流的教程 文章目录 第 8 讲 视觉里程计 28.2 光流8.3 实践: LK 光流 【Code】本讲 CMakeLists.txt 8.4 直接法8.5 实践: 双目的稀疏直接法 【Code】8.5.4 直接法的优缺点 习题 8√ 题1 光流方法题2题3题4题5 第 8 讲 视觉里程计 2 P205 …

vue3脚手架搭建

一.安装 vue3.0 脚手架 如果之前安装了2.0的脚手架,要先卸载掉,输入: npm uninstall vue-cli -g 进行全局卸载 1.安装node.js(npm) node.js:简单的说 Node.js 就是运行在服务端的 JavaScript。Node.js 是…

Linux高性能服务器编程——ch2笔记

第2章 IP 协议详解 2.1 IP服务的特点 无状态:IP通信双方不同步传输数据的状态信息。IP数据报相互独立,缺点是无法处理乱序和重复的IP数据报。上层协议如果是面向连接的协议(TCP),能够自己处理乱序和重复的报文段。IP…