我们通过Google开源的Java开发的类库 Google Guava来讲解如何应对大型的复杂项目的开发

Guava 是一个非常成功的,受欢迎的开源项目,在Java项目开发中应用广泛,我们不会讲解每个类,而是其中的设计思想,设计模式,内容比较多

我们分为了三节来讲

上: 对其进行一个简单的介绍,开发一个通用的功能模块

中:Guava中的几种设计模式,再说说之前没有遇到的Immutable模式

下:借助Guava来补充讲解三大编程范式中最后的函数式编程

Google Guava简介

其实就是对Java的JDK本身没有提供的一些功能,进行了一些增强,其中包括了 集合 Collections,

缓存 Caching,原生类型支持 PrimitivesSupport,并发库 Concurrency Libaries,通用注解 Common Annotation,字符串处理 Strings Processing,数学计算 Math,I/O ,事件总线 Event Bus等

图片

JDK的全程是Java Development Kit,本身是Java提供的工具类库,Guava则是对其进行的增强,开了一套全新的类库,那么是什么样的类型的功能,可以让我们方便去抽取,去形成通用的功能模块呢?

在业务开发中,有着一些跟业务无关的通用功能模块,常见的一般有三类,类库 library,框架 framework ,功能组件 component

Guava属于的是类库,提供了一组的API接口, EventBus DI容器属于框架,提供骨架代码,能让业务开发人员聚焦业务的整体开发,在预留的扩展点填充业务代码,ID生成器,性能计数器属于功能组件,提供一组具有特殊功能的API接口,类似类库,但是更加的聚焦化

ID生成器可能会依赖于Redis等外部系统,不像是类库那么简单

一些API,到底是属于框架还是功能组件,要按照情况而定,如果是在业务代码中嵌套开发,就是框架,如果只是开放API接口,供业务系统调用,就是组件

实际上,不管是类库,框架还是功能组件,通用的功能模块有连个最大的特点,都和实际的业务无关

如果没有复用的可能性,就没有必要去抽离了,设计成为独立的模块了,如何和业务有关又可以复用,可以设计为独立的系统,比如微服务,而不是类库,框架或者功能组件,如果开发的代码和业务无关但是可以能被复用,可以考虑将其独立出来,开发成类库 框架 功能组件等通用的功能模块

当然公司中可能存在着专门为通用模块工作的团队,除了开发类库,框架,功能组件之外,可能去开发一些通用的系统,中间件,比如MapReduce,Kafka中间件,监控系统,分布式调用链追踪系统等

如何去开发这种通用的功能模块呢?

我们发现了通用功能模块的开发需求,如何设计成为一个优秀的通用功能组件呢?

开发一个通用的类库,框架,功能组件,是在开发完成后,供很多其他项目的人共同使用,以至于开源出来使用,发挥其最大的价值

所以,对于这些类库,框架,功能组件的开发,我们要将其作为一个产品去设计,去开发,这是一个技术的产品,目标用户是程序员,解决其开发过程中的开发痛点,我们需要多换位思考,去考虑这些程序员需要的API,功能是什么?

对于一个技术产品来说,尽管bug少,性能好等技术至关重要,但是方便易用,方便集成,方便插拔,是否容易上手,这些产品素质也很重要,能够起到决定性的作用,这些却是不被重视的,往往能够决定一个技术产品能够在众多的同类中脱颖而出

具体到Google Guava,就是一个开发的类库,目标是Java开发工程师,为了解决用户的痛点,相比较于JDK,提供了更多的工具类,简化了代码的编写,比如,提供了 判断null值的Perconditions类

Splitter,Joiner,CharMatcher字符串处理类,Multisets,Multimaps, Tables等更加丰富的Collections类等

其上手的成本低,而且有Google长期维护,所以代码质量和可用性有保证,这就是Guava脱颖而出的主要原因

接下来,在开发中,我们既然是在做一个产品,那么就要有服务意识,如果做的是通用的功能组件,那么给别的团队使用的时候,可能要提供一些技术支持

心态放平,再给别的团队充当客服的时候,不会很心烦了

而且,相比较于业务的代码,这种通用的代码开发,对于代码质量的要求会更高一些,因为项目的影响面更大,出现了bug,会牵连很多的系统和其他的项目,如果一旦开源,那么影响就更大了,所以要求高的代码质量,同理如果想要学习代码只能,可以去阅读这些知名的开源项目的代码

虽然开发这些通用的模块很锻炼技术能力,但是不要去重复的造轮子,能够复用的尽量的复用,

但没有必要去将所有的可能通用的功能都做成独立的类库,因为开发通用的功能更加的费时费力,领导可能不支持

建议还是,首先将这些通用的功能作为项目的一部分开发,不过,开发的过程中,我们做好模块化的划分,尽量的通过接口,扩展点的松耦合方式交互,等到时机成熟,就将其从项目中剥离,成为独立的功能模块

本章重点:

做业务开发会涉及一些非业务的功能开发,要善于发现,善于抽象,具有扎实的设计,开发能力,发现这些非业务的,可复用的功能点,设计成为独立的功能模块

常见的功能模块有 类库,框架,功能组件,这些开发起来都可能耗时耗力,所以在开发的初期先不想着去直接开发,作为项目一部分开发,然后尽可能的去抽离出去

在抽取出来前,需要注意,不要重复造轮子

在开发中,需要有着产品意识,服务意识,代码质量意识

课后思考:

正在参与的项目汇总,考虑下,有哪些通用的模块可以抽取出来,设计成独立的框架,类库,功能模块呢?

现在正在编写一个项目的告警模块,支持用户的自定义规则,进行解析后,多次到达一定额度,进行触发报警事件,这就可以抽取出来,但是现在越开发越和现有的业务代码耦合度深,所以在考虑将最开始的基本版本进行完善,形成一个框架暴露出去

顺便一提,其实大家可以根据自己的项目,抽取出一个脚手架,做到尽可能的通用,作为一个框架暴露出去

发表评论

邮箱地址不会被公开。 必填项已用*标注