首页 程序笔记 设计模式之高质量代码

设计模式之高质量代码

0,什么是高质量代码

我觉得回答这个问题,应该从两个方面考虑。

  1. 从业务角度考虑。首先,在公司开发一款软件,应该是业务在驱动。所以,从这个角度来说,代码第一个应该满足的是业务需求,如果连最基本的业务需求都满足不了,别的也就无从谈起。
  2. 从纯代码层面考虑。本篇我们重点要介绍的也就是这个问题。

那从纯代码层面来说,什么样的代码才是好代码呢?

通常会有以下几个判断标准:

  • 可维护性:在当前代码的基础上,做修正或改进,是否容易做到?
  • 可扩展性:当有了新的需求,在不对当前代码做大的改动的前期下,是否容易满足?
  • 可复用性:代码是否能较容易的迁移到别的地方使用?不重复造轮子。
  • 可读性:当其他人阅读代码,或者过一段时间自己再阅读,是否容易理解?
  • 灵活性:是否足够灵活,易调整?
  • 简洁性:是否简单,不复杂?
  • 可测试性:是否容易测试正确性?

好的代码,不一定要满足以上所有的条件。但一条也不满足的代码,基本上就不是好代码了。

1,如何编写高质量代码

无规则不成方圆,写代码也是如此。要写出好的代码,需要遵守一些规则,主要有以下几个方面:

  • 设计原则
  • 设计模式
  • 编码规范
  • 持续重构

1.1,设计原则

每种设计模式都遵守了一个或多个设计原则。常用的设计原则有以下几种:

  • 单一职责原则:一个类的职责要单一明确。
  • 开闭原则:代码应该对扩展开发,对修改关闭(尽量减少对原有代码的修改)。
  • 里式替换原则:能够使用父类对象的地方,也能使用子类。
  • 接口隔离原则:接口的使用者不应该被强迫依赖它不需要的接口。
  • 依赖倒置原则:高层模块不要依赖低层模块。高层模块和低层模块应该通过抽象来互相依赖。抽象不要依赖具体实现细节,具体实现细节依赖抽象。
  • KISS 原则:尽量保持代码简单。
  • YAGNI 原则:不要编写当前用不到的功能/代码,不要做过度设计。但并不是不需要考虑代码的扩展性。
  • DRY 原则:避免重复性代码。
  • LOD 原则:最小知识原则,每个模块只关心与自己关系密切的模块的有限知识。

另外在面向对象编程中,也有两个比较重要的编程原则:

  • 基于接口而非实现编程:设计接口的时候要自顶向下,统揽全局,不拘泥于细节。
  • 多用组合少用继承:继承的最大问题在于,当继承层次过深层,过于复杂,就会影响到代码的可读性和维护性。

在编码的过程中,要时常想着这些原则,思考自己的代码是否符合其中的某项或多项原则。

1.2,设计模式

常见的设计模式有23 种,下面会详细介绍。

1.3,编码规范

编码规范注重的是代码细节,主要目的是让代码具有可读性。整体上来说,好的代码,对外应该有一个统一的代码风格,代码风格不一定有好坏之分,但一定有是否统一之别。

另外,代码命名也很重要,大到项目命名,目录命名,包名等。小到类名,接口名,方法名,对象名,变量名等。命名最基本的要求是用词标准达意,让人一看知道大概的用途是什么。

还有,必要的地方要有必要的注释,对于他人及自己回头看代码都有帮助。

1.4,持续重构

随着项目需求的增加变化,代码结构,代码量也都会跟着变化。代码重构需要我们不断的从整体架构的角度审视整个项目代码的结构,是否已经变得混乱无序。只有不断的对代码进行重构,才能使得代码持续的具有可维护性,可读性等标准。

2,如何发现代码的问题

经过上文,我们已经知道了高质量代码的标准是什么。那么,当我们编写完一部分代码后,应该怎样判断自己写的代码是否是高质量呢?

文章开头已经提到过,好的代码应该从业务和纯代码两个角度来衡量,下面我们就从这两个角度来看,一般要对代码做哪些检查?

业务角度:

  • 代码能否满足业务需求(逻辑是否正确,是否有bug)?
  • 代码是否健壮,能否应对边界条件(特殊情况)?
  • 软件性能是否足够,算法是否最优?
  • 代码是否有线程安全问题,能够支持并发?
  • 是否具备事物安全?

从纯代码角度考虑:

  • 代码结构,目录划分是否清晰合理?
  • 是否满足可维护性,可扩展性等标准?
  • 是否遵循设计原则?是否过渡设计?
  • 是否遵守代码规范,风格是否统一?
  • 有无必要使用设计模式,运用是否得当?
  • 有无单元测试,测试是否全面?

当我们完成某一阶段的代码后,可以尝试从以上几点来检查代码是否过关。

下面主要介绍设计模式。

3,设计模式

设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的一些设计问题,总结出来的一套通用的解决方案。

使用设计模式,可以使得我们编写的代码具有一个良好的结构,从而写出优雅的代码。设计模式关注的是,类与类之间以及对象与对象之间如何交互。

常见的设计模式有23 种,但并不是每一种模式都常用。这23 种设计模式可分为3 大类,分别是:

  • 创建型:用于解决对象的创建问题。
  • 结构型:用于处理类或对象之间的组合关系。
  • 行为型:用于处理类或对象之间怎样交互及分配职责的问题。

下面介绍每类之中都包含哪些设计模式。

3.1,创建型

创建型包含5 种设计模式:

  • 单例模式:保证一个类只能有一个实例,并提供一个全局访问点。
  • 工厂方法:定义了一个创建对象的接口,由子类决定实例化哪一个类,使得类的实例化推迟到子类中。
    • 简单工厂:严格来说不是一种模式,但经常用于封装创建对象的过程。
  • 抽象工厂:提供了创建一系列相关对象的接口,而无需指定它们具体的类。
  • 创建者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  • 原型模式(不常用):用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。

3.2,结构型

结构型包含7 种设计模式:

  • 装饰者模式:动态的给一个对象添加其它功能。从扩展性来说,这种方式比继承更有弹性,更加灵活,可作为替代继承的方案。
  • 适配器模式:将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
  • 代理模式:为对象提供一个代理,来控制对该对象的访问。
  • 桥接模式:将抽象部分与它的实现部分分离,使它们可以独立的变化。
  • 组合模式(不常用):可以将对象组合成树形结构来表示“整体-部分”的层次结构,使得客户可以用一致的方式处理个别对象和对象组合。
  • 外观模式(不常用):提供了一个统一的接口,用来访问子系统中的一群接口。它定义了一个高层接口,让子系统更容易使用。
  • 享元模式(不常用):“享元”即共享单元,当一个系统中出现大量重复对象的时候,将对象设计成享元,以减少内存中对象的数量,节省内存。

3.3,行为型

行为型包含11 种设计模式:

  • 观察者模式:定义了对象之间的一对多关系,以便当一个对象的状态发生变化时,所有依赖它的对象都能得到通知,并自动更新。
  • 策略模式:定义一系列的算法,将它们一个个封装起来,让它们之间可以互相替换。可使得算法的变化独立于使用它的客户。
  • 迭代器模式:提供一个方法,可以顺序访问集合中的元素,而不暴露集合的内部表示。
  • 模板模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
  • 状态模式:允许对象在内部状态改变时,改变它的行为,对象看起来好像改变了它的类。
  • 职责链模式:多个对象可以处理同一个请求,这些对象连成一条链,并沿着这条链传递这个请求,直到有一个对象处理它。
  • 访问者模式(不常用):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下,定义作用于这些元素的新操作。
  • 命令模式(不常用):将“请求”封装成对象,以便使用不同的请求,队列或日志来参数化其它对象。另外还支持可撤销的操作。
  • 备忘录模式(不常用):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。以便以后恢复该对象。
  • 中介模式(不常用):用一个中介对象来封装一系列的对象交互,从而最小化对象之间的交互关系,降低代码复杂度。
  • 解释器模式 (不常用):为某个语言定义它的语法表示,并定义一个解释器,来解释这种语法。
2

站心网

0,什么是高质量代码我觉得回答这个问题,应该从两个方面考虑。从业务角度考虑。首先,在公司开发一款软件..

为您推荐

代码照进现实:对公司管理策略的技术性解构

上学的时候觉得计算机专业的一些理论晦涩难懂,跟现实世界的关联太少,每当遇到一些精妙的设计时都会发出一种感叹:究竟是什么脑袋才能想出这么有意思的东西。一晃工作十年,阅历渐丰,隐约发现其实社会中的一些现象..

编写优秀 CSS 代码的 8 个策略

编写基本的CSS和HTML是我们作为Web开发人员学习的首要事情之一。然而,我遇到的很多应用程序显然没有人花时间真正考虑前端开发的长久性和可维护性。我认为这主要是因为许多开发人员对组织CSS / HTML和JavaScript的策..

天天写业务代码,如何成为技术大牛?

不管是开发、测试、运维,每个技术人员心理多多少少都有一个成为技术大牛的梦,毕竟"梦想总是要有的,万一实现了呢"!正是对技术梦的追求,促使我们不断地努力和提升自己。然而"梦想是美好的,现实却是残酷的",很多..

记我经历的一次公司破产经历,一行代码害死一家公司

前言这是一篇亲身经历的真实记录,事情发生在2010年。狗血剧情一再上演,使我的程序员生涯变得跌宕起伏,也从中学到了很多。在写这篇文章之前,我还专门去查了这家公司的资料。有如下事实:1.官网已经打不开了。2.天..

如何处理前任程序员留下的代码

作为软件工程师不可避免会遇到的一个场景是:我们在改变或添加一个功能到不是我们创建的、我们不熟悉的、与我们负责的系统部分无关的代码中时,会遇到麻烦。虽然这可能会是一个繁琐而艰巨的任务,但是由于使用其他开..

对码农而言什么样的代码才能叫做好代码?

好的代码,就像是好的笑话——无需解释就能让别人明白。如果你的代码能够做到不解自明,在大多数时候,你根本无需为其配备说明文档。好的代码,就像是一辆配备了优秀音响和杯架的汽车,这辆车在行驶到最高速度的时候..

当一个程序员写不出代码了,该怎么办?

你已经对着电脑n个小时了。不知道该写什么代码,或者一种摔键盘的冲动正在你的胸中酝酿。咖啡一杯接着一杯。不敢再喝了,因为搞不好要有副作用了,心跳加速,身体不由自主地颤抖,出冷汗,但还是无法产出任何代码。..

多语言网站数据库文章表设计

设计一个支持多语言的网站数据库时,应该确保内容能够方便地扩展和管理。以下是多语言数据库表设计的关键原则和示例:设计原则分离内容与语言:将与语言相关的内容独立存储,不直接硬编码到主要表中。每个支持多语言..

ASP.NET MVC最常用的设计模式代码示例

ASP.NET MVC 是一个基于分层架构的框架,其核心架构本身已经实现了 MVC 模式(Model-View-Controller)。除了 MVC 模式,开发者在使用 ASP.NET MVC 开发应用时,通常会结合其他设计模式以提高代码的可维护性、可扩展..

微软于发布了.NET 9 Release Candidate 2 提高整体质量

微软于2024年10月8日发布了 .NET 9 的第二个也是最后一个候选版本(Release Candidate 2),标志着正式版发布前的最后阶段。主要更新内容:质量提升:专注于提高整体质量,修复已知问题,确保框架的稳定性和可靠性。..

10款.NET开发中推荐的代码分析和质量工具

以下是10款.NET开发中常用的代码分析和质量工具列表,以及它们的主要功能和使用场景:1. SonarQube简介:一个流行的开源静态代码分析平台,用于检测代码中的漏洞、错误、技术债务等问题。主要功能:支持代码质量监测..

.NET C# EntityFramework(EF)连接SQLite代码示例

在.NET C#中使用Entity Framework(EF)连接SQLite数据库是一种常见的做法,可以有效地管理和操作数据。以下是一个简单的示例代码,展示了如何使用EF Core连接到SQLite数据库并执行基本的CRUD操作。首先,确保你已经..

微软 .NET 9 正式发布!专为云原生和生成式 AI 应用设计

微软正式发布了 .NET 9,这是一次重大的版本更新。微软在 .NET 9 中带来了一系列新特性和改进,主要聚焦在性能优化、云原生支持、AI集成以及开发者体验的提升。以下是一些重要的更新亮点:性能改进:在 .NET 9 中,..

Blazor的N种渲染模式原理和常见问题说明

我们从下面这幅图开始,下图显示了三种渲染模式,分别称之为静态SSR、交互式SSR(即之前的BlazorServer)、交互式CSR(即之前的BlazorWasm)。还有一种渲染模式BlazorHybrid,稍后说。一、先浅层理解一个图例静态SSR:经..

前端CSS常见的三种设计模式

CSS设计模式主要包括OOCSS、SMACSS和BEMCSS等。以下是对这些模式的具体介绍:OOCSS:面向对象的CSS,旨在编写高可复用、低耦合和高扩展的CSS代码。它将抽象(结构)和实现(样式)分离,抽离公共代码,以提高代码的..

C#发送邮件代码简洁示例(附源码下载)

C#发送邮件,主要使用的是System.Net.Mail命名空间下的方法实现,方法很简单,短短十几行代码即可完成发送,具体代码如下。 try { MailMessage myMail = new MailMessage(); myMail.From = new MailAddress..

AutoMapper.AutoMapperMappingException”类型的异常在 AutoMapper.dll 中发生,但未在用户代码中进行处理

今天修改别人的代码抛出了这样的异常: AutoMapper.AutoMapperMappingException”类型的异常在 AutoMapper.dll 中发生,但未在用户代码中进行处理。进行了调试,往下走的时候直接报错了,百度之~中文网站上没..

c#无损压缩图片代码,可设置压缩质量

之前写过一篇文章《使用htmlagilitypack+xpath抓取网页内容示例》,提到使用htmlagilitypack抓取网页信息。想做一个网络爬虫,但是想把网页上的图片也下载到本地,于是写了下载图片的功能。但是第三方网站上的图片大..

解释一下MVC(Model-View-Controller)和MVVM(Model-View-ViewModel)模式,并比较它们之间的区别。

MVC(Model-View-Controller)和MVVM(Model-View-ViewModel)是两种常见的软件架构模式,用于组织和分离应用程序中的不同部分。它们有一些相似之处,但也有一些明显的区别。MVC模式Model(模型):负责处理应用程序..

使用.NET SDK Betalgo调用OpenAI ChatGPT API 代码示例

首先准备工作是需要有OpenAI的帐号然后获取ApiKey。目前国内IP无法注册和登陆OpenAI。翻墙后注册需要手机验证,可以通过手机验证码平台注册,注册过程非常快,花费大概1元左右。注册方法请看:最新OpenAI ChatGPT注..

发表回复

返回顶部