如何写出高质量的代码

简介: 如何写出高质量的代码

软件设计的原则:高内聚、低耦合,面向对象的三大特征,封装、继承、多态。、


简称 英文名 中文名
SRP The Single Responsibility Principle 单一责任原则
OCP The Open Closed Principle 开放封闭原则
LSP The Liskov Substitution Principle 里氏替换原则
ISP The Interface Segregation Principle 接口分离原则
DIP The Dependency Inversion Principle 依赖倒置原则
  • S:单一责任原则,注重的是职责,主要是约束类,其次才是接口和方法,它针对的是程序中的实现和细节。
  • O:开闭原则,对新增开放,对修改关闭。主要是用多态性,面向接口面层。
  • L:里氏替换原则,父类可用的情况下,子类也可以使用。也就是说子类条件更严格。
  • I:接口分离原则,注重对接口依赖的隔离,主要约束接口接口,主要针对抽象,针对程序整体框架的构建。
  • D:依赖倒置原则,高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象,主要是面向接口编程而非面向实现编程。


如何做需求分析



需求调研,准备问问题的模板


640.jpg

内四外八模型
业务内部:业务属性字段、业务属性规则、业务属性逻辑、业务属性场景  

业务外部:业务操作者业务权限、前置业务、业务能力要求、业务环境要求、后置业务、业务输入与输出、业务可视化(外观)、业务后续处理(日志、通知)

五问法


就是对一个问题点连续以5个“为什么”来自问,以追究其根本原因。虽为5个为什么,但使用时不限定只做“5次为什么的探讨”,主要是必须找到根本原因为止,有时可能只要3次,有时也许要10次,如古话所言:打破砂锅问到底。5why法的关键所在:鼓励解决问题的人要努力避开主观或自负的假设和逻辑陷阱,从结果着手,沿着因果关系链条,顺藤摸瓜,直至找出原有问题的根本原因。


2.如何做设计



软件为谁设计

前端使用者

后端使用者

外部使用者 + 内部使用者

主动使用者 + 被动使用者

 

如何获得设计能力


1阶段读源码
持之以恒的克勤精神,天下断无不成功之事
编程语言和OS
Linux0.01源码,8000行代码,50页心得体会
对比式阅读,0.11版,16000行代码,为什么增加8000多行,是变好了,还是变坏了?
2阶段,看设计
UML工具,看方法,类,文件切割,官网上有600多页白皮书,OMG证书
用手机阅读Linux 1.0内核的UML类图
阅读Linux2.0内核UML类图,与1.0类图相比,为什么设计发生了变化
推荐书籍《重构与模式》

3阶段,看代码结构
 阅读Linux3.0内核的包图,文件夹
 Windows源代码的包图,对比商用软件与开源系统的结构设计的异同
4阶段,看开源代码获取设计经验
 获取他人设计经验的秘诀,外部的开源软件

 

功能分解

列出所有功能,画出鲁棒图

边界

画出鲁棒图,边界行为图

控制

实体

画出类图类于类之间的关系

 

软件变化如何设计?


1. 列出所有变化

2. 问几个问题

变化是单一方向的变化么?

复合变化如何分解这种变化?

复合变化是值类型的变化么?  -采用配置方式解决。

复合变化是逻辑变化么? -采用脚本的方式解决。

设计如何决定代码层次

Enterprise Architect,源代码和数据库

功能到编程文件 
  从功能到编程文件 ->切割方法
   --敏捷方法论 - ICONIX - 对象切割法
   1功能N编程文件
   1功能1编程文件

接口相关
   所有与边界相关程序 边界程序-边界对象
   UserInterface - UI
   ServiceInterface - SI
   所有与逻辑控制相关的程序

业务逻辑
   控制程序-控制对象
   Business Logic - BL

实体对象
   所有与实体数据相关的程序
   实体程序 - 实体对象
   Business Entity - BE

MVC思维,普适性
   编程文件分类 1UI层(UI文件夹)2BL层(BL文件夹)3Data层(Data文件夹)
   UIBL耦合,解耦->外观层
   BLData层解耦->持久层


3. 如何编码



代码格局

 古文式的源代码 -> 白话文的源代码,良好的阅读性,11职责
  空白行、注释,源代码需要分段,源代码需要分段注释

债务思维

防御性编程

入口参数,左右边界

-技术的边界 + 业务边界的漏洞

团队拥有代码

遵守共同的代码规范、编程规范、代码布局风格

推荐书籍《码出高效》

阿里代码规范插件

 

什么是好代码?


好的代码拥有优雅性和直白性

好坏代码差异性体现在程序格局、防御性编程、团队拥有代码

优秀的代码不需要说明,可怜的代码需要大量注释。

优秀的程序需要更多的时间,但在未来花更少的时间。糟糕的项目往往花更少的时间,但是在未来会浪费更多的时间。

优秀的项目是考虑当前和未来的需要,糟糕的项目只侧重于现在,未来可能不能工作。

良好的程序很容易维护,糟糕的项目很难维护。

 

 

新代码如何写


函数如何写

高扇入低扇出

 

函数名

  --函数名,不变化,知名达意,函数命名,JDK API,命名交给语言专家来做

变量

函数大小

限制程序文件代码行,限制每个函数代码行《重构》java最小函数,超过20-30行必须重构
java函数20-30行,逻辑不复杂

20-30行函数花费时间0.5小时-1小时

公共函数如何写

公共函数如何减少其变化,问几个问题

函数会发生哪些变化?

变化是单一的么?

复合变化怎么处理?分解变化。

参数列表

--参数列表,变化单一的吗,变化复合的;分解变化
 --参数个数变化,单一性变化
----参数封装法,结构体-对象-集合-数据- -> 接口函数,外部远程调用,多种编程语言调用,调用语言变化->封装消息,构造消息,SOAP方式,通讯调用端口->1个消息
----预留参数法,Windows COM机制《COM本质论》
----1-2-N个参数,最小接口原则,多态机制、角色分离原则

--参数类型变化,单一性变化
----Object万能量,装箱与拆箱,性能消耗
----类型封装成泛型

 

旧代码如何写?


阅读源码

如何阅读源码?

按变量的生命周期的办法阅读源码

按照对比法阅读源码

重构

如何重构

代码中的重复性或相似性 Copy/paste -重构到框架,aop框架

重构策略

绕来绕去  0 风险

设计模式重构大风险

母子函数法  小风险

 

领域领域驱动设计

架构重构-降低风险 使用微服务。

领域驱动-对服务进行分割

如何应用设计模式

23种设计模式解决了 23种变化

设计模式分成三大类:结构型,创建型,行为型。

如何选择设计模式?

类实例化的方式  - 创建型 单例

属性定义结构  -结构型  桥接

复杂算法 - 行为型 策略模式

 

4.如何保证代码质量



单元测试

如何单元测试

要测试哪些?

所有函数都需要测试

Public 测试

接口测试

如何选择测试用例
1. 代码覆盖率
2. 分支循环覆盖
3. 输入取值
4. 如何取值?

单参数取值法

边界取值法

分类取值

逻辑取值

组合参数取值

5.验证单元逻辑

 

测试驱动开发 TDD

 

自动化测试

 

5.如何自我管理



工作方式

《番茄钟工作法》,整段时间工作25分钟,休息5-10分钟,经历2个番茄钟,休息10-15分钟

工具使用

搜索:
---码出高效 filetypepdf
科学上网方式
必须会down论文,读论文


建立缺陷库

自己缺陷库-典型缺陷发布
缺陷信息记录:症状、场景、证据、推断、定位、策略、之前、之后
每次发版 - 缺陷列表 - 每个缺陷对应源代码(旧的-新的-对比)

相关文章
|
Ubuntu
Ubuntu安装aptitude
Ubuntu安装aptitude
350 0
|
安全 云栖大会 云计算
阿里云创业者计划:数字化时代的创新助推器
阿里云创业者计划助力初创企业数字化转型,提供最高100万上云抵扣金,1对1技术服务,及品牌曝光等综合支持。通过降低上云成本与技术指导,该计划旨在帮助企业在竞争中站稳脚跟,促进创新与行业发展。尽管面临审核流程及技术利用的挑战,该计划仍为创业创新提供了关键推动力。
535 4
阿里云创业者计划:数字化时代的创新助推器
|
7月前
|
前端开发 Java UED
从基础到进阶:Spring Boot + Thymeleaf 整合开发中的常见坑与界面优化
本文深入探讨了 **Spring Boot + Thymeleaf** 开发中常见的参数绑定问题与界面优化技巧。从基础的 Spring MVC 请求参数绑定机制出发,分析了 `MissingServletRequestParameterException` 的成因及解决方法,例如确保前后端参数名、类型一致,正确设置请求方式(GET/POST)。同时,通过实际案例展示了如何优化支付页面的视觉效果,借助简单的 CSS 样式提升用户体验。最后,提供了官方文档等学习资源,帮助开发者更高效地掌握相关技能。无论是初学者还是进阶用户,都能从中受益,轻松应对项目开发中的挑战。
359 0
|
Java Nacos Docker
微服务入门教程
微服务入门教程
260 2
|
消息中间件 存储 NoSQL
剖析 Redis List 消息队列的三种消费线程模型
Redis 列表(List)是一种简单的字符串列表,它的底层实现是一个双向链表。 生产环境,很多公司都将 Redis 列表应用于轻量级消息队列 。这篇文章,我们聊聊如何使用 List 命令实现消息队列的功能以及剖析消费者线程模型 。
剖析 Redis List 消息队列的三种消费线程模型
|
存储 运维 小程序
后端开发零负担!揭秘支付宝小程序云开发的高效与安全,你的项目也能飞速上线?
【8月更文挑战第27天】支付宝小程序云开发是由阿里云提供的集成开发环境,助力开发者高效、安全地构建小程序后端服务,免去服务器搭建,显著提高开发效率并降低运维成本。它集成了云函数、云数据库及云存储等功能,便于快速搭建后端逻辑。例如,仅需简单几行代码即可创建HTTP接口或进行数据管理。这使得开发者能更专注于业务逻辑和用户体验优化,同时平台还提供了强大的安全保障措施,确保数据安全和用户隐私。无论对于初创团队还是成熟企业,支付宝小程序云开发都能有效提升产品迭代速度和市场竞争力。
354 1
|
SQL 前端开发 Java
springboot项目中使用shiro实现用户登录以及权限的验证
这篇文章详细介绍了如何在Spring Boot项目中集成Apache Shiro框架来实现用户登录和权限验证,包括项目依赖配置、数据库连接、实体类定义、控制器、服务层、Mapper层以及前端页面的实现,并展示了实际效果和过滤器代码。
springboot项目中使用shiro实现用户登录以及权限的验证
|
JavaScript 定位技术
【天地图】vue 天地图 T is not defined
【天地图】vue 天地图 T is not defined
453 1
|
编译器 测试技术 PHP
深入理解PHP 8.0的新特性及性能优化
【5月更文挑战第29天】 本文将探讨PHP最新版本——PHP 8.0的新特性及其在性能优化方面的改进。我们将详细分析JIT编译器、联合类型、名称参数和匹配表达式等关键功能,并讨论它们如何提高开发效率和程序运行性能。文章还将提供一些实用的性能测试数据,以帮助开发者了解升级到PHP 8.0可能带来的性能提升。
如何用SCSS制作小铃铛振动/震动/摇晃/晃动的特效/效果?
如何用SCSS制作小铃铛振动/震动/摇晃/晃动的特效/效果?