82开源与项目实战之开源实战-开源实战三(中):剖析Google Guava中用到的几种设计模式
上一节课,我们通过Google Guava这样一个优秀的开源类库,讲解了如何在业务开发中,发现跟业务无关、可以复用的通用功能模块,并将它们从业务代码中抽离出来,设计开发成独立的类库、框架或功能组件。
今天,我们再来学习一下,Google Guava中用到的几种经典设计模式:Builder模式、Wrapper模式,以及之前没讲过的Immutable模式。
话不多说,让我们正式开始今天的学习吧!
上一节课,我们通过Google Guava这样一个优秀的开源类库,讲解了如何在业务开发中,发现跟业务无关、可以复用的通用功能模块,并将它们从业务代码中抽离出来,设计开发成独立的类库、框架或功能组件。
今天,我们再来学习一下,Google Guava中用到的几种经典设计模式:Builder模式、Wrapper模式,以及之前没讲过的Immutable模式。
话不多说,让我们正式开始今天的学习吧!
上几节课,我们拿Unix这个超级大型开源软件的开发作为引子,从代码设计编写和研发管理两个角度,讲了如何应对大型复杂项目的开发。接下来,我们再讲一下Google开源的Java开发库Google Guava。
Google Guava是一个非常成功、非常受欢迎的开源项目。它在GitHub上由近3.7万的stars。在Java项目开发中应用很广泛。当然,我们并不会讲解其中的每个类、接口如何使用,而是重点讲解其背后蕴含的设计思想、使用的设计模式。内容比较多,我分三节课来讲解。
话不多说,让我们正式开始今天的学习吧!
上两节课,我们分别从代码编写、研发管理的角度,学习了如何应对大型复杂软件开发。在研发管理这一部分,我们又讲到比较重要的几点,它们分别是编码规范、单元测试、持续重构和Code Review。其中,前三点在专栏的理论部分都有比较详细的讲解,而唯独Code Review我们还没有讲过,所以,今天我就借机会和你补充一下这一部分的内容。
很多年前,我跟一个有十几年研发经验的某一线大厂的技术专家聊天,聊天中我提起了Code Review,他便对Code Review一顿否定。他说,Code Review比较浪费时间,往往会虎头蛇尾,不可能在企业中很好地落地执行。当我又提起,Code Review在Google执行得很好,并且是已经习以为常的开发流程的时候,他竟然说这绝对不可能。
一个技术不错,可以玩转各种架构、框架、中间件的资深IT从业者,居然对Code Review有如此的偏见,这到底是哪里出了问题呢?我觉得问题主要还是出自认知上。
所以,今天,我并不打算讲关于如何做Code Review的方法论,我更希望充当一个Code Review布道师的角色,讲一讲为什么要进行Code Review,Code Review的价值在哪里,让你重视、认可Code Review。因为我觉得,只要从认知上接受了Code Review,对于高智商的IT人群来说,搞清楚如何做Code Review并不是件难事。而且,Google也开源了它自己的Code Review最佳实践,网上很容易搜到,你完全可以对照着来做。
话不多说,让我们正式开始今天的内容吧!
我们知道,项目越复杂、代码量越多、参与开发人员越多、开发维护时间越长,我们就越是要重视代码质量。代码质量下降会导致项目研发困难重重,比如:开发效率低,招了很多人,天天加班,出活却不多;线上bug频发,查找bug困难,领导发飙,中层束手无策,工程师抱怨不断。
导致代码质量不高的原因有很多,比如:代码无注释,无文档,命名差,层次结构不清晰,调用关系混乱,到处hardcode,充斥着各种临时解决方案等等。那怎么才能时刻保证代码质量呢?当然,首要的是团队技术素质要过硬,能够适当地利用设计原则、思想、模式编写高质量的代码。除此之外,还有一些外在的方法可循。
今天,我就从研发管理和开发技巧的角度来带你看下,面对大型复杂项目的开发,如何长期保证代码质量,让代码长期可维护。
话不多说,让我们正式开始今天的学习吧!
软件开发的难度无外乎两点,一是技术难,意思是说,代码量不一定多,但要解决的问题比较难,需要用到一些比较深的技术解决方案或者算法,不是靠“堆人”就能搞定的,比如自动驾驶、图像识别、高性能消息队列等;二是复杂度,意思是说,技术不难,但项目很庞大,业务复杂,代码量多,参与开发的人多,比如物流系统、财务系统等。第一点涉及细分专业的领域知识,跟我们专栏要讲的设计、编码无关,所以我们重点来讲第二点,如何应对软件开发的复杂度。
简单的“hello world”程序,谁都能写得出来。几千行的代码谁都能维护得了。但是,当代码超过几万行、十几万,甚至几十万行、上百万行的时候,软件的复杂度就会呈指数级增长。这种情况下,我们不仅仅要求程序运行得了,运行得正确,还要求代码看得懂、维护得了。实际上,复杂度不仅仅体现在代码本身,还体现在协作研发上,如何管理庞大的团队,来进行有条不紊地协作开发,也是一个很复杂的难题。
如何应对复杂软件开发?Unix开源项目就是一个值得学习的例子。
Unix从1969年诞生,一直演进至今,代码量有几百万行,如此庞大的项目开发,能够如此完美的协作开发,并且长期维护,保持足够的代码质量,这里面有很多成功的经验可以借鉴。所以,接下来,我们就以Unix开源项目的开发为引子,分三节课的时间,通过下面三个话题,详细地讲讲应对复杂软件开发的方法论。希望这些经验能为你所用,在今后面对复杂项目开发的时候,能让你有条不紊、有章可循地从容应对。
话不多说,让我们正式开始今天的学习吧!
上一节课,我们讲解了工厂模式、建造者模式、装饰器模式、适配器模式在Java JDK中的应用,其中,Calendar类用到了工厂模式和建造者模式,Collections类用到了装饰器模式、适配器模式。学习的重点是让你了解,在真实的项目中模式的实现和应用更加灵活、多变,会根据具体的场景做实现或者设计上的调整。
今天,我们继续延续这个话题,再重点讲一下模板模式、观察者模式这两个模式在JDK中的应用。除此之外,我还会对在理论部分已经讲过的一些模式在JDK中的应用做一个汇总,带你一块回忆复习一下。
话不多说,让我们正式开始今天的学习吧!
从今天开始,我们就正式地进入到实战环节。实战环节包括两部分,一部分是开源项目实战,另一部分是项目实战。
在开源项目实战部分,我会带你剖析几个经典的开源项目中用到的设计原则、思想和模式,这其中就包括对Java JDK、Unix、Google Guava、Spring、MyBatis这样五个开源项目的分析。在项目实战部分,我们精心挑选了几个实战项目,手把手地带你利用之前学过的设计原则、思想、模式,来对它们进行分析、设计和代码实现,这其中就包括鉴权限流、幂等重试、灰度发布这样三个项目。
接下来的两节课,我们重点剖析Java JDK中用到的几种常见的设计模式。学习的目的是让你体会,在真实的项目开发中,要学会活学活用,切不可过于死板,生搬硬套设计模式的设计与实现。除此之外,针对每个模式,我们不可能像前面学习理论知识那样,分析得细致入微,很多都是点到为止。在已经具备之前理论知识的前提下,我想你可以跟着我的指引自己去研究,有哪里不懂的话,也可以再回过头去看下之前的理论讲解。
话不多说,让我们正式开始今天的学习吧!
设计模式的理论部分已经全部学习完了。现在,你可能已经蠢蠢欲动,想要赶紧实践一把,把这些理论应用到自己的项目中。不过,这里我要给你提个醒了,千万别手里拿着锤子就看什么都是钉子啊。
在我过往的项目经历中,经常遇到两种同事。
一种同事会过度设计。在开始编写代码之前,他会花很长时间做代码设计,在开发过程中应用各种设计模式,美其名曰未雨绸缪,希望代码更加灵活,为未来的扩展打好基础,实则过度设计,未来的需求并不一定会实现,实际上是增加了代码的复杂度,以后的所有开发都要在这套复杂的设计基础之上来完成。
除此之外,还有一种是设计不足。怎么简单怎么来,写出来的代码能跑就可以,顶多算是demo,看似在实践KISS、YAGNI原则,实则忽略了设计环节,代码毫无扩展性、灵活性可言,添加、修改一个很小的功能就要改动很多代码。
所以,今天我想和你聊一下,在实际的项目开发中,如何避免过度设计,以及如何避免设计不足。话不多说,让我们正式开始今天的内容吧!
到今天为止,23种经典的设计模式已经全部讲完了。咱们整个专栏也完成了3/4,马上就要进入实战环节了。在进入新模块的学习之前,我照例带你做一下总结回顾。23种经典设计模式共分为3种类型,分别是创建型、结构型和行为型。今天,我们把这3种类型分成3个对应的小模块,逐一带你回顾一下每一种设计模式的原理、实现、设计意图和应用场景。
和之前的总结文一样,今天的内容比较多,有近万字,但都是咱们之前学过的,看起来应该不会太费劲,但却能检验你是否真的掌握了这些内容。
还是那句话,如果你看了之后,感觉都有印象,那就说明学得还不错;如果还能在脑子里形成自己的知识架构,闭上眼睛都能回忆上来,那说明你学得很好;如果能有自己的理解,并且在项目开发中,开始思考代码质量问题,开始用已经学过的设计模式来解决代码问题,那说明你已经掌握这些内容的精髓。
今天,我们来学习23种经典设计模式中的最后一个,中介模式。跟前面刚刚讲过的命令模式、解释器模式类似,中介模式也属于不怎么常用的模式,应用场景比较特殊、有限,但是,跟它俩不同的是,中介模式理解起来并不难,代码实现也非常简单,学习难度要小很多。
如果你对中介模式有所了解,你可能会知道,中介模式跟之前讲过的观察者模式有点相似,所以,今天我们还会详细讨论下这两种模式的区别。
话不多说,让我们正式开始今天的学习吧!