如何防止代码的慢慢变质(2)

来源:互联网 发布:fifaonline球员数据库 编辑:程序博客网 时间:2024/04/28 20:46

5、如何解决依赖

  • 组件网图

  要解决依赖,首先要发现哪些是不正确的依赖。下图就是一个具有良好层次的依赖关系图,我们称之为“组件网图”。对于我们现实的软件中,我们非常需要这样一张图将整个软件所有组件的依赖关系绘制出来,以便于我们发现其中的错误依赖进行解决。

  如果组件网图中存在错误的依赖关系,或者如果有需求要求图中的组件h依赖于g,应该怎么办?可以通过下面的“分解适配”和“升级降级”的方法进行解决。

  • 分解适配(单一职责)

  分解适配是指将一个功能复杂的模块分解为多个具有单一职责的模块,那么模块间的依赖关系也会变得单纯。读者可以结合下面的案例理解这个方法。

  • 升级降级

  我们经常会做重构,对于上面那张组件网图来说,重构就是将不合理的依赖断开,把更通用的逻辑抽出来放在底层,将不能用的逻辑放在上层。重构其实就是不断升级和降级的过程。

  比如说我们前面的图,如果H依赖于G了,那么可能考虑将G进行分解适配,将G分为G1和G2,将G2和H合并为一个新组件。这样就完成了一个分解适配和升级降级的过程。

  6、处理依赖的方法论

  • 通用的模块不要依赖于不通用的模块

  我们进行层次划分,通常是通用的模块放到底层,不通用的模块放在上层,不通用的模块依赖通用的模块是合情合理的。反过来,如果通用的模块依赖于不通用的模块,那么这个通用的模块也会变得不通用。

  • 之前的创建模块尽量不要依赖于后创建的模块

  根据时间轴以及产品的发展,较早开发的需求一般都是通用的或者是基础性质的需求,而后开发的需求是业务型的需求为主。根据这个性质,后开发的需求应该大部分依赖于之前的特性,比较少的情况是让之前的需求依赖于一个后来的需求,当然一些需求变更可能会引发这个现象。后创建的模块虽然可以依赖之前创建的模块,但是尽量不要去修改原来创建的模块,如果出现这种情况,也要考虑一下这个修改是不是合理的。

  • 需要进行微观分层(组件网图)

  日常开发中,需要有一张组件网图展现在开发人员的面前,使得开发人员在能意识到哪些依赖是不应该出现的。当然,在开发一个功能之前,也应该进行微观层次的设计,之后再进行代码的编写。

  7、增加功能三步法

  我们拿到一份需求,需要增加一个功能,应该怎么做?如果新功能与原先的模块有依赖的时候,如果是经验欠缺的同事,他们会怎么去做呢?会不会考虑说架构会不会合理?经验欠缺的同事可能通常都不会这么考虑,他们只是集中于能不能把需求实现,而不是考虑这样用架构上合不合理。团队就应该有规范去约束经验欠缺的同事不去犯错误。这里有一个增加功能的三步法供读者参考,这些方法可能不完善,读者可能有更好的方法,应该寻找适合自己团队的解决办法。

  • 不修改依赖,不修改或增加接口

  假设原来就有两个模块,一个在上层一个在底层,如果需要新写一个功能,第一步需要先考虑的是,我能不能在上层写代码,不修改两个模块的依赖,不修改也不增加接口,我的需求能不能满足。假如说已经有现成的接口和现成的依赖,首先就要考虑能不能利用现成的接口来完成需求。在没有规范约束的情况下,可能很多时候这个模块改一下,那个模块也改一下,就把需求做完了。

  • 不修改依赖,但增加接口

  如果第一步不满足需求的情况下,我们才考虑第二步,不要修改依赖,但是修改接口,这个接口可能就是一个比较通用的,而不是针对特定需求的,新增接口需要考虑扩展性和通用性。很多场景其实到这一步都可能满足的。

  • 修改内部依赖

  如果第二步还不能满足需求,必然会导致模块的耦合,底层如果依赖于上层,就要重新考虑将组件依赖图进行一些调整,就必须做一些重构,进行升级降级,完全耦合的两个模块甚至可以合二为一。

  8、组件网图的自动化监控

  随时时间的推移,代码中的依赖越来越多,如何将代码依赖的变化有效的监控起来。建议团队开发一个监控组件网图变化的工具,一旦有开发人员把依赖搞乱,工具就会发出邮件进行报警。一个依赖层次正常的组件网图,是不会出现环状依赖的。我们可以将环状依赖作为代码变乱的一个客观依据。所以组件网图工具可以做成只要发现环状依赖,就发出邮件报告给开发人员进行重构。组件网图工具应该每天夜里定期运行,找到当天新修改的代码中是否引出新的依赖和环状依赖,及时修改。

  9、让架构去保证开发人员不犯错

  防止代码变乱,我们可以进行各种培训提高开发人员的素质,开发前的设计评审,开发后的代码检视,或者是监控工具每天的检查。更重要的应该是从架构上去保证开发人员不会犯错误,就像前面提到的积木模型,先将四面墙围起来再进行积木的搭建。

  我们怎么在架构上让开发人员方便的进行解耦?比如我们有一个通用的界面,界面上会插入各种业务图标,我们不能让一个通用的界面去依赖于各个具体的业务,所以应该设计一套插入体系:在界面上留了一些位置,让业务插进来。这就从架构上访止这种耦合,后续开发人员需要继续加图标,他不会在通用界面上去调用业务的接口获取图标,因为现有机制很难这样做。所以只要架构上设计考虑充份,是可以让后来的开发人员不要犯错误的。

0 0
原创粉丝点击