设计模式
文章平均质量分 89
星如雨グッ!(๑•̀ㅂ•́)و✧
这个作者很懒,什么都没留下…
展开
-
【开源与项目实战:开源实战】87 | 开源实战五(上):MyBatis如何权衡易用性、性能和灵活性?
熟悉 Java 的同学应该知道,MyBatis 是一个 ORM(Object Relational Mapping,对象 - 关系映射)框架。ORM 框架主要是根据类和数据库表之间的映射关系,帮助程序员自动实现对象与数据库中数据之间的互相转化。说得更具体点就是,ORM 负责将程序中的对象存储到数据库中、将数据库中的数据转化为程序中的对象。实际上,Java 中的 ORM 框架有很多,除了刚刚提到的 MyBatis 之外,还有 Hibernate、TopLink 等。原创 2023-07-02 08:37:00 · 659 阅读 · 0 评论 -
【开源与项目实战:开源实战】86 | 开源实战四(下):总结Spring框架用到的11种设计模式
上一节课,我们讲解了 Spring 中支持扩展功能的两种设计模式:观察者模式和模板模式。这两种模式能够帮助我们创建扩展点,让框架的使用者在不修改源码的情况下,基于扩展点定制化框架功能。实际上,Spring 框架中用到的设计模式非常多,不下十几种。我们今天就总结罗列一下它们。限于篇幅,我不可能对每种设计模式都进行非常详细的讲解。有些前面已经讲过的或者比较简单的,我就点到为止。如果有什么不是很懂的地方,你可以通过阅读源码,查阅之前的理论讲解,自己去搞定它。原创 2023-06-24 19:55:43 · 1000 阅读 · 0 评论 -
【开源与项目实战:开源实战】85 | 开源实战四(中):剖析Spring框架中用来支持扩展的两种设计模式
上一节课中,我们学习了 Spring 框架背后蕴藏的一些经典设计思想,比如约定优于配置、低侵入松耦合、模块化轻量级等等。我们可以将这些设计思想借鉴到其他框架开发中,在大的设计层面提高框架的代码质量。这也是我们在专栏中讲解这部分内容的原因。除了上一节课中讲到的设计思想,实际上,可扩展也是大部分框架应该具备的一个重要特性。所谓的框架可扩展,我们之前也提到过,意思就是,框架使用者在不修改框架源码的情况下,基于扩展点定制扩展新的功能。原创 2023-06-24 19:51:28 · 707 阅读 · 0 评论 -
【开源与项目实战:开源实战】84 | 开源实战四(上):剖析Spring框架中蕴含的经典设计思想或原则
考虑到你可能不熟悉 Spring,我这里对它做下简单介绍。我们常说的 Spring 框架,是指 Spring Framework 基础框架。Spring Framework 是整个 Spring 生态(也被称作 Spring 全家桶)的基石。除了 Spring Framework,Spring 全家桶中还有更多基于 Spring Framework 开发出来的、整合更多功能的框架,比如 Spring Boot、Spring Cloud。原创 2023-06-24 19:48:14 · 1649 阅读 · 1 评论 -
【开源与项目实战:开源实战】83 | 开源实战三(下):借Google Guava学习三大编程范式中的函数式编程
函数式编程的英文翻译是 Functional Programming。那到底什么是函数式编程呢?在前面的章节中,我们讲到,面向过程、面向对象编程并没有严格的官方定义。在当时的讲解中,我也只是给出了我自己总结的定义。而且,当时给出的定义也只是对两个范式主要特性的总结,并不是很严格。实际上,函数式编程也是如此,也没有一个严格的官方定义。所以,接下来,我就从特性上来告诉你,什么是函数式编程。原创 2023-06-24 19:42:59 · 779 阅读 · 0 评论 -
【开源与项目实战:开源实战】82 | 开源实战三(中):剖析Google Guava中用到的几种设计模式
上一节课,我们通过 Google Guava 这样一个优秀的开源类库,讲解了如何在业务开发中,发现跟业务无关、可以复用的通用功能模块,并将它们从业务代码中抽离出来,设计开发成独立的类库、框架或功能组件。今天,我们再来学习一下,Google Guava 中用到的几种经典设计模式:Builder 模式、Wrapper 模式,以及之前没讲过的 Immutable 模式。话不多说,让我们正式开始今天的学习吧!原创 2023-06-24 19:41:24 · 682 阅读 · 0 评论 -
【开源与项目实战:开源实战】81 | 开源实战三(上):借Google Guava学习发现和开发通用功能模块
考虑到你可能不熟悉 Google Guava,我先对它做下简单的介绍。Google Guava 是 Google 公司内部 Java 开发工具库的开源版本。Google 内部的很多 Java 项目都在使用它。它提供了一些 JDK 没有提供的功能,以及对 JDK 已有功能的增强功能。原创 2023-06-24 19:37:51 · 956 阅读 · 0 评论 -
【开源与项目实战:开源实战】80 | 开源实战二(下):从Unix开源开发学习应对大型复杂项目开发
上两节课,我们分别从代码编写、研发管理的角度,学习了如何应对大型复杂软件开发。在研发管理这一部分,我们又讲到比较重要的几点,它们分别是编码规范、单元测试、持续重构和 Code Review。其中,前三点在专栏的理论部分都有比较详细的讲解,而唯独 Code Review 我们还没有讲过,所以,今天我就借机会和你补充一下这一部分的内容。很多年前,我跟一个有十几年研发经验的某一线大厂的技术专家聊天,聊天中我提起了 Code Review,他便对 Code Review 一顿否定。原创 2023-06-24 19:33:42 · 477 阅读 · 0 评论 -
【开源与项目实战:开源实战】79 | 开源实战二(中):从Unix开源开发学习应对大型复杂项目开发
我们知道,项目越复杂、代码量越多、参与开发人员越多、开发维护时间越长,我们就越是要重视代码质量。代码质量下降会导致项目研发困难重重,比如:开发效率低,招了很多人,天天加班,出活却不多;线上 bug 频发,查找 bug 困难,领导发飙,中层束手无策,工程师抱怨不断。导致代码质量不高的原因有很多,比如:代码无注释,无文档,命名差,层次结构不清晰,调用关系混乱,到处 hardcode,充斥着各种临时解决方案等等。那怎么才能时刻保证代码质量呢?原创 2023-06-24 19:29:24 · 980 阅读 · 0 评论 -
【开源与项目实战:开源实战】78 | 开源实战二(上):从Unix开源开发学习应对大型复杂项目开发
软件开发的难度无外乎两点,一是技术难,意思是说,代码量不一定多,但要解决的问题比较难,需要用到一些比较深的技术解决方案或者算法,不是靠“堆人”就能搞定的,比如自动驾驶、图像识别、高性能消息队列等;二是复杂度,意思是说,技术不难,但项目很庞大,业务复杂,代码量多,参与开发的人多,比如物流系统、财务系统等。第一点涉及细分专业的领域知识,跟我们专栏要讲的设计、编码无关,所以我们重点来讲第二点,如何应对软件开发的复杂度。简单的“hello world”程序,谁都能写得出来。几千行的代码谁都能维护得了。原创 2023-06-24 19:29:37 · 1171 阅读 · 0 评论 -
【开源与项目实战:开源实战】77 | 开源实战一(下):通过剖析Java JDK源码学习灵活应用设计模式
上一节课,我们讲解了工厂模式、建造者模式、装饰器模式、适配器模式在 Java JDK 中的应用,其中,Calendar 类用到了工厂模式和建造者模式,Collections 类用到了装饰器模式、适配器模式。学习的重点是让你了解,在真实的项目中模式的实现和应用更加灵活、多变,会根据具体的场景做实现或者设计上的调整。今天,我们继续延续这个话题,再重点讲一下模板模式、观察者模式这两个模式在 JDK 中的应用。除此之外,我还会对在理论部分已经讲过的一些模式在 JDK 中的应用做一个汇总,带你一块回忆复习一下。原创 2023-06-23 21:09:05 · 1371 阅读 · 0 评论 -
【开源与项目实战:开源实战】76 | 开源实战一(上):通过剖析Java JDK源码学习灵活应用设计模式
从今天开始,我们就正式地进入到实战环节。实战环节包括两部分,一部分是开源项目实战,另一部分是项目实战。在开源项目实战部分,我会带你剖析几个经典的开源项目中用到的设计原则、思想和模式,这其中就包括对 Java JDK、Unix、Google Guava、Spring、MyBatis 这样五个开源项目的分析。在项目实战部分,我们精心挑选了几个实战项目,手把手地带你利用之前学过的设计原则、思想、模式,来对它们进行分析、设计和代码实现,这其中就包括鉴权限流、幂等重试、灰度发布这样三个项目。原创 2023-06-23 17:38:00 · 710 阅读 · 0 评论 -
【设计模式与范式:总结型】75 | 在实际的项目开发中,如何避免过度设计?又如何避免设计不足?
设计模式的理论部分已经全部学习完了。现在,你可能已经蠢蠢欲动,想要赶紧实践一把,把这些理论应用到自己的项目中。不过,这里我要给你提个醒了,千万别手里拿着锤子就看什么都是钉子啊。在我过往的项目经历中,经常遇到两种同事。设计模式的理论部分已经全部学习完了。现在,你可能已经蠢蠢欲动,想要赶紧实践一把,把这些理论应用到自己的项目中。不过,这里我要给你提个醒了,千万别手里拿着锤子就看什么都是钉子啊。在我过往的项目经历中,经常遇到两种同事。一种同事会过度设计。原创 2023-06-18 20:21:44 · 1167 阅读 · 0 评论 -
【设计模式与范式:总结型】74 | 总结回顾23种经典设计模式的原理、背后的思想、应用场景等
到今天为止,23 种经典的设计模式已经全部讲完了。咱们整个专栏也完成了 3/4,马上就要进入实战环节了。在进入新模块的学习之前,我照例带你做一下总结回顾。23 种经典设计模式共分为 3 种类型,分别是创建型、结构型和行为型。今天,我们把这 3 种类型分成 3 个对应的小模块,逐一带你回顾一下每一种设计模式的原理、实现、设计意图和应用场景。和之前的总结文一样,今天的内容比较多,有近万字,但都是咱们之前学过的,看起来应该不会太费劲,但却能检验你是否真的掌握了这些内容。原创 2023-06-18 20:15:48 · 1583 阅读 · 0 评论 -
【设计模式与范式:行为型】71 | 命令模式:如何利用命令模式实现一个手游后端架构?
设计模式模块已经接近尾声了,现在我们只剩下 3 个模式还没有学习,它们分别是:命令模式、解释器模式、中介模式。这 3 个模式使用频率低、理解难度大,只在非常特定的应用场景下才会用到,所以,不是我们学习的重点,你只需要稍微了解,见了能认识就可以了。今天呢,我们来学习其中的命令模式。在学习这个模式的过程中,你可能会遇到的最大的疑惑是,感觉命令模式没啥用,是一种过度设计,有更加简单的设计思路可以替代。所以,我今天讲解的重点是这个模式的设计意图,带你搞清楚到底什么情况下才真正需要使用它。原创 2023-06-18 20:05:52 · 1303 阅读 · 0 评论 -
【设计模式与范式:行为型】70 | 备忘录模式:对于大对象的备份和恢复,如何优化内存和时间的消耗?
上两节课,我们学习了访问者模式。在 23 种设计模式中,访问者模式的原理和实现可以说是最难理解的了,特别是它的代码实现。其中,用 Single Dispatch 来模拟 Double Dispatch 的实现思路尤其不好理解。不知道你有没有将它拿下呢?如果还没有弄得很清楚,那就要多看几遍、多自己动脑经琢磨一下。今天,我们学习另外一种行为型模式,备忘录模式。这个模式理解、掌握起来不难,代码实现比较灵活,应用场景也比较明确和有限,主要是用来防丢失、撤销、恢复等。原创 2023-06-18 20:01:39 · 1250 阅读 · 0 评论 -
【设计模式与范式:行为型】69 | 访问者模式(下):为什么支持双分派的语言不需要访问者模式?
上一节课中,我们学习了访问者模式的原理和实现,并且还原了访问者模式诞生的思维过程。总体上来讲,这个模式的代码实现比较难,所以应用场景并不多。从应用开发的角度来说,它的确不是我们学习的重点。话不多说,让我们正式开始今天的学习吧!原创 2023-06-18 19:58:48 · 1244 阅读 · 0 评论 -
【设计模式与范式:行为型】63 | 职责链模式(下):框架中常用的过滤器、拦截器是如何实现的?
上一节课,我们学习职责链模式的原理与实现,并且通过一个敏感词过滤框架的例子,展示了职责链模式的设计意图。本质上来说,它跟大部分设计模式一样,都是为了解耦代码,应对代码的复杂性,让代码满足开闭原则,提高代码的可扩展性。除此之外,我们还提到,职责链模式常用在框架的开发中,为框架提供扩展点,让框架的使用者在不修改框架源码的情况下,基于扩展点添加新的功能。实际上,更具体点来说,职责链模式最常用来开发框架的过滤器和拦截器。原创 2023-06-18 11:06:49 · 1238 阅读 · 0 评论 -
【设计模式与范式:行为型】62 | 职责链模式(上):如何实现可灵活扩展算法的敏感信息过滤框架?
前几节课中,我们学习了模板模式、策略模式,今天,我们来学习职责链模式。这三种模式具有相同的作用:复用和扩展,在实际的项目开发中比较常用,特别是框架开发中,我们可以利用它们来提供框架的扩展点,能够让框架的使用者在不修改框架源码的情况下,基于扩展点定制化框架的功能。今天,我们主要讲解职责链模式的原理和实现。除此之外,我还会利用职责链模式,带你实现一个可以灵活扩展算法的敏感词过滤框架。原创 2023-06-18 10:43:49 · 1187 阅读 · 0 评论 -
【设计模式与范式:行为型】61 | 策略模式(下):如何实现一个支持给不同大小文件排序的小程序?
上一节课,我们主要介绍了策略模式的原理和实现,以及如何利用策略模式来移除 if-else 或者 switch-case 分支判断逻辑。今天,我们结合“给文件排序”这样一个具体的例子,来详细讲一讲策略模式的设计意图和应用场景。除此之外,在今天的讲解中,我还会通过一步一步地分析、重构,给你展示一个设计模式是如何“创造”出来的。通过今天的学习,你会发现,设计原则和思想其实比设计模式更加普适和重要,掌握了代码的设计原则和思想,我们甚至可以自己创造出来新的设计模式。话不多说,让我们正式开始今天的学习吧!原创 2023-06-16 00:46:08 · 1326 阅读 · 1 评论 -
【设计模式与范式:行为型】60 | 策略模式(上):如何避免冗长的if-else/switch分支判断代码?
策略类的定义比较简单,包含一个策略接口和一组实现这个接口的策略类。因为所有的策略类都实现相同的接口,所以,客户端代码基于接口而非实现编程,可以灵活地替换不同的策略。@Override//具体的算法...@Override//具体的算法...原创 2023-06-15 00:51:02 · 1485 阅读 · 2 评论 -
【设计模式与范式:行为型】58 | 模板模式(上):剖析模板模式在JDK、Servlet、JUnit等中的应用
在 Java AbstractList 类中,addAll() 函数可以看作模板方法,add() 是子类需要重写的方法,尽管没有声明为 abstract 的,但函数实现直接抛出了 UnsupportedOperationException 异常。前提是,如果子类不重写是不能使用的。原创 2023-06-15 00:16:36 · 1128 阅读 · 0 评论 -
【设计模式与范式:行为型】57 | 观察者模式(下):如何实现一个异步非阻塞的EventBus框架?
EventBus 翻译为“事件总线”,它提供了实现观察者模式的骨架代码。我们可以基于此框架,非常容易地在自己的业务场景中实现观察者模式,不需要从零开始开发。其中,Google Guava EventBus 就是一个比较著名的 EventBus 框架,它不仅仅支持异步非阻塞模式,同时也支持同步阻塞模式现在,我们就通过例子来看一下,Guava EventBus 具有哪些功能。// 依赖注入// 同步阻塞模式// 异步非阻塞模式//省略输入参数的校验代码。原创 2023-06-13 00:48:10 · 1296 阅读 · 0 评论 -
【设计模式与范式:行为型】56 | 观察者模式(上):详解各种应用场景下观察者模式的不同实现方式
我们常把 23 种经典的设计模式分为三类:创建型、结构型、行为型。前面我们已经学习了创建型和结构型,从今天起,我们开始学习行为型设计模式。我们知道,创建型设计模式主要解决“对象的创建”问题,结构型设计模式主要解决“类或对象的组合或组装”问题,那行为型设计模式主要解决的就是“类或对象之间的交互”问题。行为型设计模式比较多,有 11 个,几乎占了 23 种经典设计模式的一半。它们分别是:观察者模式、模板模式、策略模式、职责链模式、状态模式、迭代器模式、访问者模式、备忘录模式、命令模式、解释器模式、中介模式。原创 2023-06-13 00:23:17 · 1166 阅读 · 0 评论 -
【设计模式与范式:创建型】45 | 工厂模式(下):如何设计实现一个Dependency Injection框架?
上一节课我们讲到,简单工厂模式有两种实现方式,一种是每次都返回新创建的对象,另一种是每次都返回同一个事先创建好的对象,也就是所谓的单例对象。在 Spring 框架中,我们可以通过配置 scope 属性,来区分这两种不同类型的对象。scope=prototype 表示返回新创建的对象,scope=singleton 表示返回单例对象。除此之外,我们还可以配置对象是否支持懒加载。原创 2023-05-21 11:00:12 · 263 阅读 · 0 评论 -
【设计模式与范式:创建型】44 | 工厂模式(上):我为什么说没事不要随便用工厂模式创建对象?
讲完了简单工厂、工厂方法,我们再来看抽象工厂模式。抽象工厂模式的应用场景比较特殊,没有前两种常用,所以不是我们本节课学习的重点,你简单了解一下就可以了。在简单工厂和工厂方法中,类只有一种分类方式。比如,在规则配置解析那个例子中,解析器类只会根据配置文件格式(Json、Xml、Yaml……)来分类。但是,如果类有两种分类方式,比如,我们既可以按照配置文件格式来分类,也可以按照解析的对象(Rule 规则配置还是 System 系统配置)来分类,那就会对应下面这 8 个 parser 类。原创 2023-05-20 22:42:20 · 578 阅读 · 0 评论 -
【设计模式与范式:创建型】43 | 单例模式(下):如何设计实现一个集群环境下的分布式单例模式?
上两节课中,我们针对单例模式,讲解了单例的应用场景、几种常见的代码实现和存在的问题,并粗略给出了替换单例模式的方法,比如工厂模式、IOC 容器。今天的内容稍微有点“烧脑”,希望你在看的过程中多思考一下。话不多说,让我们正式开始今天的学习吧!原创 2023-05-20 21:54:42 · 790 阅读 · 0 评论 -
【设计模式与范式:创建型】42 | 单例模式(中):我为什么不推荐使用单例模式?又有何替代方案?
上一节课中,我们通过两个实战案例,讲解了单例模式的一些应用场景,比如,避免资源访问冲突、表示业务概念上的全局唯一类。除此之外,我们还学习了 Java 语言中,单例模式的几种实现方法。如果你熟悉的是其他编程语言,不知道你课后有没有自己去对照着实现一下呢?尽管单例是一个很常用的设计模式,在实际的开发中,我们也确实经常用到它,但是,有些人认为单例是一种反模式(anti-pattern),并不推荐使用。所以,今天,我就针对这个说法详细地讲讲这几个问题:单例这种设计模式存在哪些问题?为什么会被称为反模式?原创 2023-05-20 20:40:25 · 764 阅读 · 0 评论 -
【设计模式与范式:创建型】41 | 单例模式(上):为什么说支持懒加载的双重检测不比饿汉式更优?
从今天开始,我们正式进入到设计模式的学习。我们知道,经典的设计模式有 23 种。其中,常用的并不是很多。据我的工作经验来看,常用的可能都不到一半。如果随便抓一个程序员,让他说一说最熟悉的 3 种设计模式,那其中肯定会包含今天要讲的单例模式。网上有很多讲解单例模式的文章,但大部分都侧重讲解,如何来实现一个线程安全的单例。我今天也会讲到各种单例的实现方法,但是,这并不是我们专栏学习的重点,我重点还是希望带你搞清楚下面这样几个问题(第一个问题会在今天讲解,后面三个问题放到下一节课中讲解)。原创 2023-05-20 19:39:05 · 729 阅读 · 0 评论 -
【设计原则与思想:总结课】40 | 运用学过的设计原则和思想完善之前讲的性能计数器项目(下)
上一节课中,我们针对版本 1 存在的问题(特别是 Aggregator 类、ConsoleReporter 和 EmailReporter 类)进行了重构优化。经过重构之后,代码结构更加清晰、合理、有逻辑性。不过,在细节方面还是存在一些问题,比如 ConsoleReporter、EmailReporter 类仍然存在代码重复、可测试性差的问题。今天,我们就在版本 3 中持续重构这部分代码。除此之外,在版本 3 中,我们还会继续完善框架的功能和非功能需求。原创 2023-05-20 17:02:43 · 967 阅读 · 0 评论 -
【设计原则与思想:总结课】39 | 运用学过的设计原则和思想完善之前讲的性能计数器项目(上)
在第 25 节、第 26 节中,我们讲了如何对一个性能计数器框架进行分析、设计与实现,并且实践了之前学过的一些设计原则和设计思想。当时我们提到,小步快跑、逐步迭代是一种非常实用的开发模式。所以,针对这个框架的开发,我们分多个版本来逐步完善。在第 25、26 节课中,我们实现了框架的第一个版本,它只包含最基本的一些功能,在设计与实现上还有很多不足。所以,接下来,我会针对这些不足,继续迭代开发两个版本:版本 2 和版本 3,分别对应第 39 节和第 40 节的内容。原创 2023-05-18 00:45:29 · 163 阅读 · 1 评论 -
【设计原则与思想:总结课】38 | 总结回顾面向对象、设计原则、编程规范、重构技巧等知识点
现在,主流的编程范式或者编程风格有三种,它们分别是面向过程、面向对象和函数式编程。面向对象这种编程风格又是这其中最主流的。现在比较流行的编程语言大部分都是面向对象编程语言。大部分项目也都是基于面向对象编程风格开发的。面向对象编程因为其具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式编码实现的基础。重构的目的:为什么重构(why)?对于项目来言,重构可以保持代码质量持续处于一个可控状态,不至于腐化到无可救药的地步。原创 2023-05-17 00:19:07 · 344 阅读 · 0 评论 -
【设计模式之美 设计原则与思想:规范与重构】37 | 实战二(下):重构ID生成器项目中各函数的异常处理代码
在上一节课中,我们讲解了几种异常情况的处理方式,比如返回错误码、NULL 值、空对象、异常对象。针对最常用的异常对象,我们还重点讲解了两种异常类型的应用场景,以及针对函数抛出的异常的三种处理方式:直接吞掉、原封不动地抛出和包裹成新的异常抛出。除此之外,在上一节课的开头,我们还针对 ID 生成器的代码,提出了 4 个有关异常处理的问题。今天,我们就用一节课的时间,结合上一节课讲到的理论知识,来逐一解答一下这几个问题。话不多说,让我们正式开始今天的内容吧!原创 2023-04-16 17:17:12 · 351 阅读 · 0 评论 -
【设计模式之美 设计原则与思想:规范与重构】36 | 实战二(上):程序出错该返回啥?NULL、异常、错误码、空对象?
我们可以把函数的运行结果分为两类。一类是预期的结果,也就是函数在正常情况下输出的结果。一类是非预期的结果,也就是函数在异常(或叫出错)情况下输出的结果。比如,在上一节课中,获取本机名的函数,在正常情况下,函数返回字符串格式的本机名;在异常情况下,获取本机名失败,函数返回 UnknownHostException 异常对象。在正常情况下,函数返回数据的类型非常明确,但是,在异常情况下,函数返回的数据类型却非常灵活,有多种选择。原创 2023-04-14 00:50:53 · 411 阅读 · 0 评论 -
【设计模式之美 设计原则与思想:规范与重构】35 | 实战一(下):手把手带你将ID生成器代码从“能用”重构为“好用”
上一节课中,我们结合 ID 生成器代码讲解了如何发现代码质量问题。虽然 ID 生成器的需求非常简单,代码行数也不多,但看似非常简单的代码,实际上还是有很多优化的空间。综合评价一下的话,小王的代码也只能算是“能用”、勉强及格。我们大部分人写出来的代码都能达到这个程度。如果想要在团队中脱颖而出,我们就不能只满足于这个 60 分及格,大家都能做的事情,我们要做得更好才行。原创 2023-04-12 00:52:50 · 609 阅读 · 0 评论 -
【设计模式之美 设计原则与思想:规范与重构】34 | 实战一(上):通过一段ID生成器代码,学习如何发现代码质量问题
ID”中文翻译为“标识(Identifier)”。这个概念在生活、工作中随处可见,比如身份证、商品条形码、二维码、车牌号、驾照号。聚焦到软件开发中,ID 常用来表示一些业务信息的唯一标识,比如订单的单号或者数据库中的唯一主键,比如地址表中的 ID 字段(实际上是没有业务含义的,对用户来说是透明的,不需要关注)。假设你正在参与一个后端业务系统的开发,为了方便在请求出错时排查问题,我们在编写代码的时候会在关键路径上打印日志。某个请求出错之后,我们希望能搜索出这个请求对应的所有日志,以此来查找问题的原因。原创 2023-04-12 00:37:41 · 106 阅读 · 0 评论 -
【设计模式之美 设计原则与思想:规范与重构】33 | 理论五:让你最快速地改善代码质量的20条编程规范(下)
上两节课,我们讲了命名和注释、代码风格,今天我们来讲一些比较实用的编程技巧,帮你切实地提高代码可读性。这部分技巧比较琐碎,也很难罗列全面,我仅仅总结了一些我认为比较关键的,更多的技巧需要你在实践中自己慢慢总结、积累。话不多说,让我们正式开始今天的学习吧!原创 2023-04-01 00:58:10 · 335 阅读 · 0 评论 -
【设计模式之美 设计原则与思想:规范与重构】32 | 理论五:让你最快速地改善代码质量的20条编程规范(中)
上一节课中我们讲了命名和注释,这一节课我们来讲一下代码风格(Code Style)。说起代码风格,我们其实很难说哪种风格更好。最重要的,也是最需要我们做到的,是在团队、项目中保持风格统一,让代码像同一个人写出来的,整齐划一。这样能减少阅读干扰,提高代码的可读性。这才是我们在实际工作中想要实现的目标。关于代码风格,我总结了 6 点我认为最值得关注的,今天跟你一块讨论学习一下。原创 2023-04-01 00:37:40 · 238 阅读 · 0 评论 -
【设计模式之美 设计原则与思想:规范与重构】31 | 理论五:让你最快速地改善代码质量的20条编程规范(上)
好了,今天的内容到此就讲完了。我们来一块总结回顾一下,你需要掌握的重点内容。原创 2023-04-01 00:15:49 · 308 阅读 · 0 评论 -
【设计模式之美 设计原则与思想:规范与重构】30 | 理论四:如何通过封装、抽象、模块化、中间层等解耦代码?
前面我们讲到,重构可以分为大规模高层重构(简称“大型重构”)和小规模低层次重构(简称“小型重构”)。大型重构是对系统、模块、代码结构、类之间关系等顶层代码设计进行的重构。对于大型重构来说,今天我们重点讲解最有效的一个手段,那就是“解耦”。解耦的目的是实现代码高内聚、松耦合。关于解耦,我准备分下面三个部分来给你讲解。原创 2023-03-31 01:13:25 · 267 阅读 · 0 评论