专栏首页程序员开发者社区如何写出高质量的代码

如何写出高质量的代码

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

简称

英文名

中文名

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:依赖倒置原则,高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象,主要是面向接口编程而非面向实现编程。

如何做需求分析

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

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

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

五问法

就是对一个问题点连续以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思维,普适性 编程文件分类 1、UI层(UI文件夹)2、BL层(BL文件夹)3、Data层(Data文件夹) UI和BL耦合,解耦->外观层 BL和Data层解耦->持久层

3. 如何编码

代码格局

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

债务思维

防御性编程

入口参数,左右边界

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

团队拥有代码

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

推荐书籍 《码出高效》

阿里代码规范插件

什么是好代码?

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

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

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

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

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

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

新代码如何写

函数如何写

高扇入低扇出

函数名

--函数名,不变化,知名达意,函数命名,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分钟

工具使用

搜索: ---码出高效 filetype:pdf 访问外国网站方式 必须会down论文,读论文

建立缺陷库

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

归纳总结

代码培训,培训重在归纳总结

本文分享自微信公众号 - 程序员开发者社区(gh_016ffe40d550),作者:猿星人

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-01-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • FPGA 面试题

    答:setip 建立时间 holdup 保持时间 建立时间是指, 时钟边缘前,数据信号保持不变的的时间,保持时间 是指时钟跳变边缘数据信号数据信号保持不...

    王小明_HIT
  • volatile 的作用和原理

    内存可见性:所有线程都能看到共享内存的最新状态。每次读取前必须先从主内存刷新最新的值。每次写入后必须立即同步回主内存当中。

    王小明_HIT
  • 什么是数字货币?

    中国人民银行推出 数字货币的项目叫作DCEP( Digital Currency Electronic Payment),也就是数字货币和电子支付工具。数字货币...

    王小明_HIT
  • 一个人开发一个项目是一种怎样的体验?

    IT故事会
  • 一个人开发一个项目是一种怎样的体验?

    IT故事会
  • 【快报】杨澜采访李飞飞 | 牛津大学研发系统,能将任何汽车变成自动驾驶汽车

    新智元 AI DAILY 1 杨澜斯坦福采访李飞飞:AI展现人文情怀 ? 今天,杨澜在斯坦福大学采访人工智能实验室主任李飞飞教授。下文摘自杨澜微博: “人...

    新智元
  • go语言中获得控制台输入的字符串

    strBaiduUsername := "" strBaiduPassword := "" // stdinReader := bufio.NewReader(...

    李海彬
  • 复现生信论文36.临床意义

    生信论文36是单基因分析的生信论文,单纯生信数据库的数据分析,没有湿实验验证,但是可以发表在接近5分的期刊上,很多分析做得很棒,值得借鉴。我们对文章数据进行复现...

    芒果先生聊生信
  • Python中的这几种报错你遇到过吗?

    我新开了一个系列,叫做『读者分享系列』,这个系列主要用来发布一些我书的读者写的一些读书笔记和学习笔记的。

    张俊红
  • Python检查一组数据是否能构成和谐集

    检查一组数据是否构成和谐集,也就是从中删除任意元素之后,剩余元素都能分成两个集合,并且两个集合中的元素之和相等。

    Python小屋屋主

扫码关注云+社区

领取腾讯云代金券