当前位置:网站首页>如何写出高质量的代码?
如何写出高质量的代码?
2022-07-05 09:41:00 【人邮异步社区】
目录
每位软件工程师都想写出高质量代码,高质量的代码也就等同于易维护、易读、易 扩展、灵活、简洁、可复用、可测试的代码。
想要写出满足上述代码质量评价标准的高质量代码,我们需要掌握一些细化、可落地的编 程方法论,包括面向对象设计范式、设计原则、代码规范、重构技巧和设计模式等。而掌握这 些编程方法论的最终目的是编写出高质量的代码。这些编程方法论是后续章节讲解的重点内容,我们先熟悉一下它们。
1 面向对象
目前,编程范式或编程风格主要有 3 种:面向过程、面向对象和函数式编程。面向对象编程 风格是其中的主流。现在流行的编程语言大部分属于面向对象编程语言。另外,大部分项目也都 是基于面向对象编程风格开发的。面向对象编程因其具有丰富的特性(封装、抽象、继承和多 态),可以实现很多复杂的设计思路,所以,它是很多设计原则、设计模式编码实现的基础。
对于面向对象,读者需要掌握下面 7 个知识点(详见第 2 章)。
1)面向对象的四大特性:封装、抽象、继承和多态。
2)面向对象编程与面向过程编程的区别和联系。
3)面向对象分析、面向对象设计和面向对象编程。
4)接口和抽象类的区别,以及各自的应用场景。
5)基于接口而非实现编程的设计思想。
6)“多用组合,少用继承”设计思想。
7)面向过程的“贫血”模型和面向对象的“充血”模型。
2 设计原则
设计原则是代码设计时的一些经验总结。设计原则有一个特点:这些设计原则看起来比较抽象,定义描述比较模糊,不同的人对同一个设计原则会有不同的解读。因此,如果我们单纯 地记忆它们的定义,那么对编程、设计能力的提高并没有太大帮助。对于每一种设计原则,我 们需要掌握它能解决什么问题和应用场景。只有掌握这些内容,我们才能在项目中灵活、恰当 地应用这些设计原则。实际上,设计原则是心法,设计模式是招式。因此,设计原则比设计模 式普适、重要。只有掌握了设计原则,我们才能清楚地了解为什么使用某种设计模式,并且恰 到好处地应用设计模式,甚至还可以创造新的设计模式。
对于设计原则,读者需要理解并掌握下列9 种原则(详见第 3 章)。
1)单一职责原则(SRP)。
2)开闭原则(OCP)。
3)里氏替换原则(LSP)。
4)接口隔离原则(ISP)。
5)依赖反转原则(DIP)。
6)KISS 原则、YAGNI 原则、DRY 原则和 LoD 法则。
3 设计模式
设计模式是针对软件开发中经常遇到的一些设计问题而总结的一套解决方案或设计思路。 大部分设计模式解决的是代码的解耦、可扩展性问题。相对于设计原则,设计模式没有那么抽 象,而且大部分不难理解,代码实现也并不复杂。对于设计模式的学习,我们需要重点掌握它 们能够解决哪些问题和典型的应用场景,并且不过度使用。
随着编程语言的演进,一些设计模式(如单例模式)逐渐过时,甚至成为反模式,一些设 计模式(如迭代器模式)则被内置在编程语言中,还有一些新设计模式出现,如单态模式。
在本书中,我们会重点讲解 22 种经典设计模式,它们分为三大类:创建型、结构型和行 为型。在这 22 种设计模式中,有些设计模式常用,有些设计模式很少被用到。对于常用的设 计模式,我们要花费多一些时间理解和掌握。对于不常用的设计模式,我们了解即可。
按照类型,我们对本书中提到的设计模式进行了简单的分类。
1)创建型设计模式:单例模式、工厂模式(包括简单工厂模式、工厂方法模式、抽象工 厂模式)、建造者模式和原型模式。
2)结构型设计模式:代理模式、装饰器模式、适配器模式、桥接模式、门面模式、组合 模式和享元模式。
3)行为型设计模式:观察者模式、模板方法模式、策略模式、职责链模式、状态模式、 迭代器模式、访问者模式、备忘录模式、命令模式、解释器模式和中介模式。
4 代码规范
代码规范主要解决的是代码的可读性问题。相对于设计原则、设计模式,代码规范更加具 体且偏重代码细节。如果软件工程师开发的项目并不复杂,那么可以不必了解设计原则和掌握 设计模式,但起码需要熟练掌握代码规范,如变量、类和函数的命名规范,代码注释的规范 等。因此,相比设计原则、设计模式,代码规范基础且重要。
不过,相对于设计原则、设计模式,代码规范更容易理解和掌握。学习设计原则和设计模式需要融入很多个人的理解和思考,但学习代码规范并不需要。每条代码规范都非常简单且明 确,读者只要照着做即可,所以,本书并没有花费太大篇幅讲解所有的代码规范,而是总结了 作者认为能够有效改善代码质量的 17 条规范。
除代码规范以外,作者还会介绍一些代码的“坏味道”,帮助读者了解什么样的代码是不 符合规范的,以及应该如何优化。参照代码规范,读者可以写出可读性高的代码;在了解了代 码的“坏味道”后,读者可以找出代码存在的可读性问题。
5 重构技巧
在软件开发中,只要软件不停迭代,就没有一劳永逸的设计。随着需求的变化,代码的不 停堆砌,原有的设计必定存在问题。针对这些问题,我们需要对代码进行重构。重构是软件开 发中的重要环节。持续重构是保持代码质量不下降的有效手段,能够有效避免代码“腐化”到 “无可救药”的地步。
重构的工具有面向对象编程范式、设计原则、设计模式和代码规范。实际上,设计原则和 设计模式的重要应用场景就是重构。我们知道,虽然设计模式可以提高代码的可扩展性,但过 度或不恰当地使用它,会增加代码的复杂度,影响代码的可读性。在开发初期,除非必要,我 们一定不要过度设计,应用复杂的设计模式,而是当代码出现问题的时候,我们再针对问题, 应用设计原则和设计模式进行重构,这样就能有效避免前期的过度设计问题。
关于重构,本书重点讲解以下 3 方面的内容。通过对这些内容的讲解,希望读者不但可以 掌握一些重构技巧,更重要的是建立持续重构意识,把重构当作开发的一部分,融入日常的开 发中。
1)重构的目的(why)、对象(what)、时机(when)和方法(how)。
2)保证重构不出错的技术手段:单元测试,以及代码的可测试性。
3)两种不同规模的重构:大重构(大规模,高层次)和小重构(小规模,低层次)。
下面总结一下面向对象编程、设计原则、设计模式、代码规范和重构技巧的关系。
1)面向对象编程范式因其丰富的特性(封装、抽象、继承和多态),可以实现很多复杂 的设计思路,所以,它是很多设计原则、设计模式编码实现的基础。
2)设计原则是指导代码设计的一些经验总结,是代码设计的心法,指明了代码设计的大 方向。相比设计模式,它更加普适。
3) 设计模式是针对软件开发中经常遇到的一些设计问题而总结的一套解决方案或设计思 路。应用设计模式的主要目的是解耦,提高代码的可扩展性。从抽象程度上来讲,设计原则比 设计模式更抽象。设计模式更加具体,更加容易落地执行。
4)代码规范主要解决代码可读性问题。相比设计原则、设计模式,代码规范更加具体、 更加偏重代码细节和更加可落地执行。持续的小重构主要依赖的理论就是代码规范。
5)重构作为保持代码质量不下降的有效手段,依靠的就是面向对象编程范式、设计原则、 设计模式和代码规范这些理论知识。
实际上,面向对象编程范式、设计原则、设计模式、代码规范和重构技巧都是保持或提高 代码质量的方法论,本质上都是服务于编写高质量的代码这一件事。当我们看清这个本质之 后,很多选择如何做就清楚了。例如,在某个场景下,是否使用某个设计模式,判断的标准就 是能否能够提高代码质量。
实际上,想要编写高质量的代码,除积累上述理论知识以外,我们还需要进行一定强度的 刻意训练。很多程序员提到过,虽然学习了相关的理论知识,但是容易忘记,而且在遇到问题 时想不到对应的知识点。实际上,这就是缺乏理论结合实践的刻意训练。例如, 在上学的时 候,老师在讲解完某个知识点之后,往往配合讲解几道例题,然后让我们通过课后习题来强化 这个知识点。这样,当我们再次遇到类似问题时,就能够立即想到相应的知识点。
除掌握理论知识、刻意训练以外,具备代码质量意识也非常重要。在写代码之前,我们要 多思考未来有哪些扩展需求,哪部分代码是会变的,哪部分代码是不变的,这样编写代码会不 会导致以后添加新功能时比较困难、代码的可读性不高等问题。具备了这样的代码质量意识, 也就离写出高质量的代码不远了。
以上回答摘自《设计模式之美》
本书结合真实项目案例,从面向对象编程范式、设计原则、代码规范、重构技巧和设计模式5个方面详细介绍如何编写高质量代码。
第1章为概述,简单介绍了本书涉及的各个模块,以及各个模块之间的联系;第2章介绍面向对象编程范式;第3章介绍设计原则;第4章介绍代码规范;第5章介绍重构技巧;第6章介绍创建型设计模式;第7章介绍结构型设计模式;第8章介绍行为型设计模式。
本书可以作为各类研发工程师的学习、进阶读物,也可以作为高等院校相关专业师生的教学和学习用书,以及计算机培训学校的教材。
边栏推荐
- Tianlong Babu TLBB series - about items dropped from packages
- Understand the window query function of tdengine in one article
- 盗版DALL·E成梗图之王?日产5万张图像,挤爆抱抱脸服务器,OpenAI勒令改名
- Advanced opencv:bgr pixel intensity map
- Cut off 20% of Imagenet data volume, and the performance of the model will not decline! Meta Stanford et al. Proposed a new method, using knowledge distillation to slim down the data set
- Optimize database queries using the cursor object of SQLite
- 百度智能小程序巡檢調度方案演進之路
- 程序员搞开源,读什么书最合适?
- Application of data modeling based on wide table
- The comparison of every() and some() in JS uses a power storage plan
猜你喜欢
Data visualization platform based on template configuration
How to implement complex SQL such as distributed database sub query and join?
QT event filter simple case
Node red series (29): use slider and chart nodes to realize double broken line time series diagram
Viewpager pageradapter notifydatasetchanged invalid problem
mysql80服务不启动
The king of pirated Dall · e? 50000 images per day, crowded hugging face server, and openai ordered to change its name
La voie de l'évolution du système intelligent d'inspection et d'ordonnancement des petites procédures de Baidu
百度智能小程序巡檢調度方案演進之路
[system design] index monitoring and alarm system
随机推荐
On July 2, I invite you to TD Hero online press conference
Flutter development: use safearea
cent7安装Oracle数据库报错
盗版DALL·E成梗图之王?日产5万张图像,挤爆抱抱脸服务器,OpenAI勒令改名
一文读懂TDengine的窗口查询功能
Evolution of Baidu intelligent applet patrol scheduling scheme
Cent7 Oracle database installation error
Tutorial on building a framework for middle office business system
Comparison of batch merge between Oracle and MySQL
【C语言】动态内存开辟的使用『malloc』
Tongweb set gzip
Solve the problem of no all pattern found during Navicat activation and registration
解决Navicat激活、注册时候出现No All Pattern Found的问题
[C language] the use of dynamic memory development "malloc"
From "chemist" to developer, from Oracle to tdengine, two important choices in my life
【OpenCV 例程200篇】219. 添加数字水印(盲水印)
QT timer realizes dynamic display of pictures
Common fault analysis and Countermeasures of using MySQL in go language
高级 OpenCV:BGR 像素强度图
Optimize database queries using the cursor object of SQLite