自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

玲珑巫女的学习笔记

令人肃然起敬的,往往不是一个人的能力、学问或其他,而是他的品格与德行。

  • 博客(213)
  • 收藏
  • 关注

原创 《设计模式之美》命令模式:如何利用命令模式实现一个手游后端架构?

王争《设计模式之美》学习笔记命令模式的原理解读命令模式的英文翻译是 Command Design Patte。命令模式将请求(命令)封装为一个对象,这样可以使用不同的请求参数化其他对象(将不同请求依赖注入到其他对象),并且能够支持请求(命令)的排队执行、记录日志、撤销等(附加控制)功能。落实到编码实现,命令模式用的最核心的实现手段,是将函数封装成对象。我们知道,C语言支持函数指针,我们可以把函数当作变量传递来传递去。但是,在大部分编程语言中,函数没法儿作为参数传递给其他函数,也没法儿赋值给变量。借

2021-08-31 17:01:27 240

原创 《设计模式之美》备忘录模式:对于大对象的备份和恢复,如何优化内存和时间的消耗?

王争《设计模式之美》学习笔记备忘录模式的原理与实现备忘录模式,也叫快照(Snapshot)模式,英文翻译是 Memento Design Patte。在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。这个模式的定义主要表达了两部分内容:一部分是,存储副本以便后期恢复。这一部分很好理解。另一部分是,要在不违背封装原则的前提下,进行对象的备份和恢复。这部分不太好理解。文中举例用户输入文本时,程序将其追加存储在内存文本中;用户

2021-08-30 14:50:35 220

原创 《设计模式之美》访问者模式(下):为什么支持双分派的语言不需要访问者模式?

王争《设计模式之美》学习笔记为什么支持双分派的语言不需要访问者模式?所谓 Single Dispatch,指的是执行哪个对象的方法,根据对象的运行时类型来决定;执行对象的哪个方法,根据方法参数的编译时类型来决定。所谓 Double Dispatch,指的是执行哪个对象的方法,根据对象的运行时类型来决定;执行对象的哪个方法,根据方法参数的运行时类型来决定。在面向对象编程语言中,我们可以把方法调用理解为一种消息传递,也就是“Dispatch”。一个对象调用另一个对象的方法,就相当于给它发送一条消息。这

2021-08-26 11:15:31 243

原创 《设计模式之美》访问者模式(上):手把手带你还原访问者模式诞生的思维过程

王争《设计模式之美》学习笔记带你“发明”访问者模式文中举例假设我们从网站上爬取了很多资源文件,它们的格式有三种:PDF、PPT、Word。我们现在要开发一个工具来处理这批资源文件。这个工具的其中一个功能是,把这些资源文件中的文本内容抽取出来放到 txt文件中。代码示例public abstract class ResourceFile { protected String filePath; public ResourceFile(String filePath) { th

2021-08-23 17:42:46 463

原创 《设计模式之美》迭代器模式(下):如何设计实现一个支持“快照”功能的 iterator?

王争《设计模式之美》学习笔记问题描述谓“快照”,指我们为容器创建迭代器的时候,相当于给容器拍了一张快照(Snapshot)。之后即便我们增删容器中的元素,快照中的元素并不会做相应的改动。而迭代器遍历的对象是快照而非容器,这样就避免了在使用迭代器遍历的过程中,增删容器中的元素,导致的不可预期的结果或者报错。容器list 中初始存储了3、8、2三个元素。尽管在创建迭代器iter1 之后,容器list 删除了元素3,只剩下8、2两个元素,但是,通过iter1 遍历的对象是快照,而非容器list 本身。

2021-08-13 17:25:30 167

原创 《设计模式之美》迭代器模式(中):遍历集合的同时,为什么不能增删集合元素?

王争《设计模式之美》学习笔记在遍历的同时增删集合元素会发生什么?在通过迭代器来遍历集合元素的同时,增加或者删除集合中的元素,有可能会导致某个元素被重复遍历或遍历不到。结果不可预期行为或者未决行为:运行结果到底是对还是错,要视情况而定。文中举例,删除元素public interface Iterator<E> { boolean hasNext(); void next(); E currentItem();}public class ArrayIterator&l

2021-08-09 15:26:57 481

原创 《设计模式之美》迭代器模式(上):相比直接遍历集合数据,使用迭代器有哪些优势?

王争《设计模式之美》学习笔记迭代器模式的原理和实现迭代器模式(Iterator Design Pattern),也叫作游标模式(Cursor Design Pattern)。迭代器是用来遍历容器的,所以,一个完整的迭代器模式一般会涉及容器和容器迭代器两部分内容。实现一个迭代器假设,线性数据结构包括数组和链表,对应 ArrayList 和 LinkedList 两个类。我们从两个类中抽象出公共的接口,定义为 List 接口,以方便开发者基于接口而非实现编程,编写的代码能在两种数据存储结构之

2021-08-05 17:19:20 305

原创 《设计模式之美》状态模式:游戏、工作流引擎中常用的状态机是如何实现的?

王争《设计模式之美》学习笔记在实际的软件开发中,状态模式并不是很常用,但是在能够用到的场景里,它可以发挥很大的作用。状态模式一般用来实现状态机,而状态机常用在游戏、工作流引擎等系统开发中。什么是有限状态机有限状态机,英文翻译是Finite State Machine,缩写为FSM,简称为状态机。状态机有3个组成部分:状态(State)、事件(Event)、动作(Action)。其中,事件也称为转移条件(Transition Condition)。事件触发状态的转移及动作的执行。不过,动作不

2021-07-27 17:16:50 234

原创 《设计模式之美》职责链模式(下):框架中常用的过滤器、拦截器是如何实现的?

王争《设计模式之美》学习笔记Servlet FilterServlet Filter 是 Java Servlet 规范中定义的组件,翻译成中文就是过滤器,它可以实现对 HTTP 请求的过滤功能,比如鉴权、限流、记录日志、验证参数等等。添加过滤器非常方便,不需要修改任何代码,定义一个实现 javax.servlet.Filter 的类,再改改配置就搞定了,完全符合开闭原则。职责链模式的实现包含处理器接口(IHandler)或抽象类(Handler),以及处理器链(HandlerChain)。对应到

2021-07-13 15:44:00 149

原创 《设计模式之美》职责链模式(上):如何实现可灵活扩展算法的敏感信息过滤框架?

王争《设计模式之美》学习笔记职责链模式的原理和实现职责链模式的英文翻译是 Chain Of Responsibility Design Patte。将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。职责链模式中,多个处理器(也就是刚刚定义中说的“接收对象”)依次处理同一个请求。一个请求先经过A处理器处理,然后再把请求传递给B处理器,B处理器处理完后再传递给C处理器,以此类推,形成一个链条。链条上的每

2021-07-12 11:02:45 144

原创 《设计模式之美》策略模式(下):如何实现一个支持给不同大小文件排序的小程序?

王争《设计模式之美》学习笔记设计原则和思想其实比设计模式更加普适和重要,掌握了代码的设计原则和思想,我们甚至可以自己创造出来新的设计模式。问题与解决思路假设有这样一个需求,希望写一个小程序,实现对一个文件进行排序的功能。文件中只包含整型数,并且,相邻的数字通过逗号来区隔。如果文件有10GB大小,因为内存有限(比如只有8GB大小),我们没办法一次性加载文件中的所有数据到内存中,这个时候,我们就要利用外部排序算法了。如果文件有100GB大小,我们为了利用CPU多核的优势,可以在外部排序的基础之上

2021-07-07 14:36:24 150

原创 《设计模式之美》策略模式(上):如何避免冗长的if-else switch分支判断代码?

王争《设计模式之美》学习笔记策略模式的原理与实现策略模式,英文全称是Strategy Design Patte。定义一组算法类,将每个算法分别封装起来,让它们可以互相替换。工厂模式是解耦对象的创建和使用,观察者模式是解耦观察者和被观察者,策略模式是解耦的是策略的定义、创建、使用这三部分。1.策略的定义策略类的定义比较简单,包含一个策略接口和一组实现这个接口的策略类。因为所有的策略类都实现相同的接口,所以,客户端代码基于接口而非实现编程,可以灵活地替换不同的策略。public inte

2021-06-24 14:21:16 147

原创 《设计模式之美》模板模式(下):模板模式与 Callback 回调函数有何区别和联系?

王争《设计模式之美》学习笔记回调的原理解析复用和扩展是模板模式的两大作用,实际上,还有另外一个技术概念,也能起到跟模板模式相同的作用,那就是回调(Callback)。相对于普通的函数调用来说,回调是一种双向调用关系。A类事先注册某个函数F到B类,A类在调用B类的P函数的时候,B类反过来调用A类注册给它的F函数。这里的F函数就是“回调函数”。A调用B,B反过来又调用A,这种调用机制就叫作“回调”。文中举例public interface ICallback { void methodTo

2021-06-23 14:26:01 150

原创 《设计模式之美》模板模式(上):剖析模板模式在JDK、Servlet、JUnit等中的应用

王争《设计模式之美》学习笔记模板模式的原理与实现模板模式主要是用来解决复用和扩展两个问题。模板模式,全称是模板方法设计模式,英文是Template Method Design Patte。模板方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤。这里的“算法”,我们可以理解为广义上的“业务逻辑”,并不特指数据结构和算法中的“算法”。这里的算法骨架就是“模板”,包含算法骨架的方法就是“模板方法”,这也是模板方

2021-06-23 11:32:47 122

原创 《设计模式之美》观察者模式(下):如何实现一个异步非阻塞的EventBus框架?

王争《设计模式之美》学习笔记异步非阻塞观察者模式的简易实现关于上节课例子,我们实现异步非阻塞观察者模式,有两种方式:第一种:在每个 handleRegSuccess() 函数中创建一个新的线程执行代码逻辑第二种:在 UserController的register() 函数中使用线程池来执行每个观察者 handleRegSuccess() 函数// 第一种实现方式,其他类代码不变,就没有再重复罗列public class RegPromotionObserver implements R

2021-06-18 15:58:19 170

原创 《设计模式之美》观察者模式(上):详解各种应用场景 下观察者模式的不同实现方式

王争《设计模式之美》学习笔记行为型设计模式主要解决的就是“类或对象之间的交互”问题。一个行为型设计模式,也是在实际的开发中用得比较多的一种模式:观察者模式。观察者模式会对应不同的代码实现方式:有同步阻塞的实现方式,也有异步非阻塞的实现方式;有进程内的实现方式,也有跨进程的实现方式。原理及应用场景剖析观察者模式(Observer Design Pattern)也被称为发布订阅模式(Publish-Subscribe Design Patter)。在对象之间定义一个一对多的依赖,当一

2021-06-17 18:14:07 165

原创 《设计模式之美》享元模式(下):剖析享元模式在Java Integer、String中的应用

王争《设计模式之美》学习笔记享元模式在Java Integer中的应用代码片段Integer i1 = 56;Integer i2 = 56;Integer i3 = 129;Integer i4 = 129;System.out.println(i1 == i2);System.out.println(i3 == i4);什么是自动装箱(Autoboxing)和自动拆箱(Unboxing)?所谓的自动装箱,就是自动将基本数据类型转换为包装器类型。所谓的自动拆箱,也就是自动将包装器

2021-06-16 11:35:36 127

原创 《设计模式之美》享元模式(上):如何利用享元模式优化文本编辑器的内存占用?

王争《设计模式之美》学习笔记享元模式原理与实现所谓“享元”,顾名思义就是被共享的单元。享元模式的意图是复用对象,节省内存,前提是享元对象是不可变对象。不仅仅相同对象可以设计成享元,对于相似对象,我们也可以将这些对象中相同的部分(字段)提取出来,设计成享元,让这些大量相似对象引用这些享元。定义中的“不可变对象”指的是,一旦通过构造函数初始化完成之后,它的状态(对象的成员变量或者属性)就不会再被修改了。文中举例假设我们在开发一个棋牌游戏(比如象棋):一个游戏厅中有成千上万个“房间”,每个房

2021-06-16 10:42:37 115

原创 《设计模式之美》组合模式:如何设计实现支持递归遍历的文件系统目录树结构?

王争《设计模式之美》学习笔记组合模式跟我们之前讲的面向对象设计中的“组合关系(通过组合来组装两个类)”,完全是两码事。这里讲的“组合模式”,主要是用来处理树形结构数据。因为其应用场景的特殊性,这种模式在实际的项目开发中并不那么常用。组合模式的原理与实现组合模式是这样定义的:一组对象组织(Compose)成树形结构,以表示一种“部分-整体”的层次结构。组合让客户端(在很多设计模式书籍中,“客户端”代指代码的使用者。)可以统一单个对象和组合对象的处理逻辑。文中举例设计一个类来表示文件系统中

2021-06-15 16:14:48 233

原创 《设计模式之美》门面模式:如何设计合理的接口粒度以兼顾接口的易用性和通用性?

王争《设计模式之美》学习笔记为了保证接口的可复用性(或者叫通用性),我们需要将接口尽量设计得细粒度一点,职责单一一点。如果接口的粒度过小,在接口的使用者开发一个业务功能时,就会导致需要调用n多细粒度的接口才能完成。如果接口粒度设计得太大,一个接口返回n多数据,要做n多事情,就会导致接口不够通用、可复用性不好。门面模式的原理与实现门面模式,也叫外观模式,英文全称是 Facade Design Pattern。门面模式为子系统提供一组统一的接口,定义一组高层接口让子系统更易用。文中举例

2021-02-05 15:10:02 267

原创 《设计模式之美》适配器模式:代理、适配器、桥接、装饰,这四个模式有何区别?

王争《设计模式之美》学习笔记适配器模式的原理与实现适配器模式的英文翻译是 Adapter Design Pattern。它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。适配器模式有两种实现方式:类适配器和对象适配器。其中,类适配器使用继承关系来实现,对象适配器使用组合关系来实现。文中举例ITarget 表示要转化成的接口定义。Adaptee 是一组不兼容ITarget接口定义的接口。Adaptor 将 Adaptee 转化成一组符合 ITarget

2021-02-05 11:00:41 103

原创 《设计模式之美》装饰器模式:通过剖析JavaIO类库源 码学习装饰器模式

王争《设计模式之美》学习笔记Java IO类的“奇怪”用法如果对 Java IO 类做一下分类,我们可以从下面两个维度将它划分为四类:输入流字节流:InputStream输出流字节流:OutputStream输入流字符流:Reader输出流字符流:Writer针对不同的读取和写入场景,Java IO 又在这四个父类基础之上,扩展出了很多子类。文中举例我们打开文件 test.txt,从中读取数据。其中,InputStream 是一个抽象类,FileInputStream 是专门用

2021-02-03 16:53:37 98

原创 《设计模式之美》桥接模式:如何实现支持不同类型和渠道的消息推送系统?

王争《设计模式之美》学习笔记桥接模式的原理解析桥接模式,也叫作桥梁模式,英文是 Bridge Design Pattern。GoF 的《设计模式》一书中,桥接模式是这么定义的:“Decouple an abstraction from its implementation so that the two can vary independently。”翻译成中文就是:“将抽象和实现解耦,让它们可以独立变化。”关于桥接模式,很多书籍、资料中,还有另外一种理解方式:“一个类存在两个(或多个)独立变化的

2021-02-02 17:31:02 167

原创 《设计模式之美》代理模式:代理在RPC、缓存、监控等 场景中的应用

王争《设计模式之美》学习笔记代理模式的原理解析代理模式(Proxy Design Pattern)的原理和代码实现都不难掌握。它在不改变原始类(或叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能。文中举例这个例子来自我们在第25、26、39、40节中讲的性能计数器。当时我们开发了一个 MetricsCollector 类,用来收集接口请求的原始数据,比如访问时间、处理时长等。public class UserController { //...省略其他属性和方法... p

2021-01-21 19:59:22 88

原创 《设计模式之美》原型模式:如何最快速地clone一个HashMap散列表?

王争《设计模式之美》学习笔记原型模式的原理与应用如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式来创建新对象,以达到节省创建时间的目的。这种基于原型来创建对象的方式就叫作原型设计模式(Prototype Design Pattern),简称原型模式。...

2021-01-19 17:01:45 104

原创 《设计模式之美》建造者模式:详解构造函数、set方法 、建造者模式三种对象创建方式

王争《设计模式之美》学习笔记为什么需要建造者模式?Builder模式,中文翻译为建造者模式或者构建者模式,也有人叫它生成器模式。文中举例我们需要定义一个资源池配置类 ResourcePoolConfig。这里的资源池,你可以简单理解为线程池、连接池、对象池等。在这个资源池配置类中,有以下几个成员变量,也就是可配置项。name 必填变量,maxTotal、maxIdle、minIdle 不是必填变量。public class ResourcePoolConfig { private s

2021-01-04 19:08:59 108

原创 《设计模式之美》工厂模式(下):如何设计实现一个DependencyInjection框架?

王争《设计模式之美》学习笔记我们再来讲一个创建对象的“大工程”,依赖注入框架,或者叫依赖注入容器(Dependency Injection Container),简称DI。工厂模式和 DI 容器有何区别?实际上,DI 容器底层最基本的设计思路就是基于工厂模式的。DI 容器相当于一个大的工厂类,负责在程序启动的时候,根据配置(要创建哪些类对象,每个类对象的创建需要依赖哪些其他类对象)事先创建好对象。当应用程序需要使用某个类对象的时候,直接从容器中获取即可。正是因为它持有一堆对象,所以这个框架才被

2020-12-30 17:23:09 126

原创 《设计模式之美》工厂模式(上):我为什么说没事不要 随便用工厂模式创建对象?

王争《设计模式之美》学习笔记一般情况下,工厂模式分为三种更加细分的类型:简单工厂、工厂方法和抽象工厂。在这三种细分的工厂模式中,简单工厂、工厂方法原理比较简单,在实际的项目中也比较常用。而抽象工厂的原理稍微复杂点,在实际的项目中相对也不常用。简单工厂(Simple Factory)文中举例在下面这段代码中,我们根据配置文件的后缀(json、xml、yaml、properties),选择不同的解析器(JsonRuleConfigParser、XmlRuleConfigParser……),将存储

2020-12-28 16:57:27 88

原创 《设计模式之美》单例模式(下):如何设计实现一个集 群环境下的分布式单例模式?

王争《设计模式之美》学习笔记如何理解单例模式中的唯一性?单例类中对象的唯一性的作用范围是进程内的,在进程间是不唯一的。如何实现线程唯一的单例?“进程唯一”还代表了线程内、线程间都唯一,这也是“进程唯一”和“线程唯一”的区别之处。假设 IdGenerator 是一个线程唯一的单例类。在线程A内,我们可以创建一个单例对象 a。因为线程内唯一,在线程 A 内就不能再创建新的 IdGenerator 对象了,而线程间可以不唯一,所以,在另外一个线程 B 内,我们还可以重新创建一个新的单例对象 b。

2020-12-03 11:02:59 273

原创 《设计模式之美》单例模式(中):我为什么不推荐使用 单例模式?又有何替代方案?

王争《设计模式之美》学习笔记单例存在哪些问题?1.单例对OOP特性的支持不友好单例这种设计模式对于OOP四大特性中的抽象、继承、多态都支持得不好。通过 IdGenerator 这个例子来讲解,生成 ID 的调用处这样写 long id = IdGenerator.getInstance().getId()。如果我们希望针对不同的业务采用不同的 ID 生成算法,我们需要修改所有用到 IdGenerator 类的地方,比如修改成 long id = UserIdGenerator.getIntance

2020-12-02 16:57:14 111

原创 《设计模式之美》单例模式(上):为什么说支持懒加载的双重检测不比饿汉式更优?

王争《设计模式之美》学习笔记为什么要使用单例?单例设计模式(Singleton Design Pattern):一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。实战案例一:处理资源访问冲突文中样例一个往文件中打印日志的 Logger 类。构造方法中,打开日志文件 log.txt,将写入文件句柄赋值给属性 writer。log() 方法中调用 writer.write() 写入日志内容。使用此 Logger 类时,首先实例化 n

2020-11-19 10:29:35 96

原创 《设计模式之美》运用学过的设计原则和思想完善之前讲 的性能计数器项目(下)

王争《设计模式之美》学习笔记代码重构优化我们可以将 ConsoleReporter 和 EmailReporter 中的相同代码逻辑,提取到父类 ScheduledReporter 中,以解决代码重复问题。

2020-10-16 10:44:17 105

原创 《设计模式之美》运用学过的设计原则和思想完善之前讲 的性能计数器项目(上)

王争《设计模式之美》学习笔记回顾版本1的设计与实现MetricsCollector:负责打点采集原始数据,包括记录每次接口请求的响应时间和请求时间戳,并调用 MetricsStorage 提供的接口来存储这些原始数据。MetricsStorage 和 RedisMetricsStorage:负责原始数据的存储和读取。Aggregator:是一个工具类,负责各种统计数据的计算,比如响应时间的最大值、最小值、平均值、百分位值、接口访问次数、tps。ConsoleReporter 和 EmailRep

2020-10-15 16:03:08 104

原创 《设计模式之美》总结回顾面向对象、设计原则、编程规范、重构技巧等知识点

王争《设计模式之美》学习笔记一、代码质量评判标准如何评价代码质量的高低?代码质量高低是一个综合各种因素得到的结论。并不能通过单一维度去评价一段代码的好坏。比如,代码的可读性好、可扩展性好就意味着代码的可维护性好。...

2020-09-25 15:49:34 165

原创 《设计模式之美》实战二(下):重构ID生成器项目中各函数的异常处理代码

王争《设计模式之美》学习笔记重构 generate() 函数ID 由三部分构成:本机名、时间戳和随机数。时间戳和随机数的生成函数不会出错,唯独主机名有可能获取失败。对于 generate() 函数,如果本机名获取失败,函数返回什么?这样的返回值是否合理?如果主机名获取失败,substrOfHostName 为 NULL,那 generate() 函数会返回类似“null-6723733647-83Ab3uK6”这样的数据。如果主机名获取失败,substrOfHostName 为空字符串,那

2020-09-07 17:20:14 127

原创 《设计模式之美》实战二(上):程序出错该返回啥?NULL、异常、错误码、空对象?

王争《设计模式之美》学习笔记从上节课的 ID 生成器代码讲起对于 generate() 函数,如果本机名获取失败,函数返回什么?这样的返回值是否合理?对于 getLastFiledOfHostName() 函数,是否应该将 UnknownHostException 异常在函数内部吞掉(try-catch 并打印日志)?还是应该将异常继续往上抛出?如果往上抛出的话,是直接把 UnknownHostException 异常原封不动地抛出,还是封装成新的异常抛出?对于 getLastSubstrSpli

2020-09-03 15:14:35 136

原创 《设计模式之美》实战一(下):手把手带你将ID生成器代码从“能用”重构为“好用”

王争《设计模式之美》学习笔记第一轮重构:提高代码的可读性hostName 变量不应该被重复使用,尤其当这两次使用时的时候;将获取 hostName 的代码抽离出来,定义为 getLastfieldOfHostName() 函数;删除代码中的魔法数,比如,57、90、97、122;将随机数生成的代码抽离出来,定义为 generateRandomAlphameric() 函数;generate() 函数中的三个 if 逻辑重复了,且实现过于复杂,我们要对其进行简化;对 IdGenerator 类

2020-09-02 17:42:20 140

原创 《设计模式之美》实战一(上):通过一段ID生成器代码,学习如何发现代码质量问题

王争《设计模式之美》学习笔记ID 生成器需求背景介绍“ID”中文翻译为“标识(Identifier)”。ID 常用来表示一些业务信息的唯一标识,比如订单的单号或者数据库中的唯一主键,比如地址表中的 ID 字段(实际上是没有业务含义的,对用户来说是透明的,不需要关注)。文中举例,ID可用于log_id或者微服务调用链追踪,就是用唯一id来追踪用户一次完成访问轨迹。一份“能用”的代码实现文中实现了一个 IdGenerator 类。类中方法 generate() 实现一个ID的生成,包括三部分

2020-08-28 16:10:17 133

原创 《设计模式之美》理论五:让你最快速地改善代码质量的20条编程规范(下)

王争《设计模式之美》学习笔记其余技巧把代码分割成更小的单元块大部分人阅读代码的习惯都是,先看整体再看细节。将大块的复杂逻辑提炼成类或者函数,屏蔽掉细节,让阅读代码的人不至于迷失在细节中,这样能极大地提高代码的可读性。如果提炼出的函数只包含两三行代码,在阅读代码的时候,还得跳过去看一下,这样反倒增加了阅读成本。...

2020-08-26 11:00:28 159

原创 《设计模式之美》 理论五:让你最快速地改善代码质量的20条编程规范(中)

王争《设计模式之美》学习笔记代码风格类、函数多大才合适?类或函数的代码行数太多,一个类上千行,一个函数几百行,逻辑过于繁杂,阅读代码的时候,很容易就会看了后面忘了前面。类或函数的代码行数太少,在代码总量相同的情况下,被分割成的类和函数就会相应增多,调用关系就会变得更复杂,阅读某个代码逻辑的时候,需要频繁地在 n 多类或者 n 多函数之间跳来跳去,阅读体验也不好。对于函数代码行数的最大限制,不要超过一个显示屏的垂直高度,让一个函数的代码完整地显示在 IDE 中,大概是50行左右。对于类的代码行数

2020-08-25 11:16:08 140

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除