今天在工作的时候,代码实现的时候,遇到了一个代码风格的问题。或者说其实我个人更偏向于这可能是依赖注入的滥用问题。
起因
说说我遇到的情况:
我们与国外的同事一起开发项目,同事做了一记录event log的功能,放到了common包公共代码中,需要所有微服务中都引入使用。
简单地说一下这个的实现吧:
common包中提供了一个logAgent,需要所有服务注册这个logAgent并在需要记录event的时候,调用里面的相应方法。
logAgent的底层与其他服务通信的逻辑使用的是Redisson提供的RBlockingQueue(别纠结技术栈)。
随后这位同事也在我正在开发的项目中加入了这个类的引用与初始化(两边有时差,两边都有人负责同一个服务的相同的一些功能,美其名曰“充分利用时间”)。
等我早上回到公司review代码的时候,我觉得新增的代码有点别扭不太舒服,先说一下为什么我觉得有点别扭:
作为生产者的看待这个消息队列的角色,我在这个公共库的时候,当然是想要准备好配置,初始化好服务类(logAgent),我就可以往这个桥梁里放产品了。
但这位同事这个logAgent的实现中,使用Autowired注入了两个类,分别是
- jar包里自定义的id生成器
- 一个BlockingQueue接口对象
在我的服务的配置类中,这位同事注册了4个类,分别是
- RedissonClient
- RBlockingQueue(创建时使用了logAgent中的静态变量作为Redis key)
- jar包里的id生成器
- logAgent
沟通问题
我稍微有点微词。我的想法是应该尽可能不要让这些内部使用,并且内部就能完全管理好的类暴露在外面来,提供的工具应该尽量做到简单配置简单使用才对,而且这个复杂的配置逻辑这位同事也没有准备任何文档与注释,于是我就这个问题发邮件问了一下为什么要这么设计,随后阐述了一下我的想法,到这里为止我也只是微词而已。
然后这是我最后发过去阐述观点的邮件,我觉得可能我语气也不太好
![](https://img.haomeiwen.com/i5283759/0b8c430d3b1e5f97.png)
但最后我收到的邮件让我炸了:
![](https://img.haomeiwen.com/i5283759/dc921a7ba28efa33.png)
到此我就立刻关掉了邮箱,因为说再多也已经没用了。
其实之前也有很多关于维护性的、开发流程的、团队管理的想法我有提出来(肉眼可见的糟糕),也有走人的想法,我最近都在自主学习,所以暂时还是想着先充实一下知识。
那至少到这里,我觉得我应该是不太能继续呆在这个三观不太符合的公司里了。
回到一下这个问题上
我感觉我最后收到的回复的观点太绝对了,而且作为一个被其他代码调用的公共组件,不是应该尽量做到高内聚低耦合吗?
举个例子:
- Spring就家里的妈妈,在家的时候经常管理我的生活
- logAgent就像是一部手机
我想象中的使用场景:
- 我准备好了手机,交给妈妈管理(注册bean)
- 而有些东西,例如sim卡,手机里是不可能买来就有的,需要我买手机的时候顺便买sim卡插进去,或者使用老妈手上已有的sim卡,
- 然后一起再把手机给妈妈管理(bean初始化阶段,通过外部传入参数进行初始化,例如传入RedisClient作为参数)
- 当我需要使用的时候,妈妈会把手机给我(把logAgent 注入到需要调用的类中)
但上面logAgent的调用就像这样子:
- 我需要买好手机的屏幕、主板、电池、sim卡、空的手机外壳,先交给老妈,
- 然后老妈帮我把这些东西组装到手机外壳里面,再把手机给我用。
- 那如果下次我在做收音机,刚好电池跟手机通用,我问老妈要电池(本来应该是手机的私有组件),老妈把手机的电池装到了给我测试收音机用光了,那我手机要用的时候岂不是开不了机了?
这么一类比,我更觉得这种实现不合理了,不仅代码调用麻烦,还有用错的风险,需要提供更多的文档说明怎么使用(这位同事没提供文档的问题咱就不纠结了,老问题了)。
结论
我还是认为,不仅是这种公共jar包提供的组件,项目内部的各种Service、Manager、Helper、Handler、etc.
真的不应该把一些本该对外隐藏的私有组件,交给spring管理,尤其是这个组件上还保存着状态信息的,意味着这些组件不仅要设置成privite,对外的操作也需要封装好方法,不然组件里面的状态被其他类通过注入取到并随意改变后,整个业务逻辑就不对了,不是吗?
当然我也很想知道我这样的想法到底有没有问题,真的需要把什么东西都丢给Spring管理吗?欢迎大家告诉我一下你们的想法,谢谢。
网友评论