我正在参加「掘金·启航计划」
为什么一定要有分层架构?本文的目的是把架构的作用讲清楚,使用分层架构是为了解决实际开发中遇到的哪些问题。
1、架构能带来什么好处?
先来简单的罗列一下架构有可能能够带来的一些好处。
1、健壮性:健壮性指的就是能够帮助程序稳定的运行的任何的因素其实都可以归结为健壮性。
2、安全性:包括网络安全、代码安全,甚至是用户个人的账号隐私安全等等。
3、维护性:体现在多人开发以及代码规模膨胀之后的维护成本上。
4、可定制性:指的就是一个功能或者是一个模块可以被不同的需求定制成不同的形态。
5、可扩展性:指的就是增加新功能或者是扩展新的模块的时候,不会过多的依赖对现有代码的修改,能直接获得现有代码的支持。
这些都是软件架构能够直接带来的好处。健壮性和安全性都能够带来更好的用户体验。但架构能带来更多的,其实是工程师体验。一个好的架构,能够让使用它的工程师们感受到生产力上的提升。
既然如此,架构能够带来的好处是不是包括研发效率呢?这个问题要分开来说。架构的本质其实就是一种通过技术手段来实现的编程规范。
在架构规范之下,如果要保证以上这些好处,是有可能造成研发效率的下降了。那么从单一功能的角度来说,比如说我们如果随性的把所有的业务代码和UI的实现都写在一个Activity里,是有可能很快的去完成一个功能的。但这种实现就没有可维护性可言了。
反过来说,如果我们的项目中没有对可定制化方面的需求,但是我们花了大量的时间选择了一个以可定制为目标的架构。那么在实现功能时就会付出一些不必要的工作量,这就是架构过度设计的情况。从这个角度来说,架构是有可能妨碍我们的研发效率的。但是从整个工程的角度来说,可维护性的提高,可扩展性以及可定制性的实现,都会带来更好的代码复用,更低的维护成本,都是人力成本的下降。从工程效率上来讲,对研发效率是会有更大的提升的。
刚刚说的这些好处其实还比较抽象,我们就来看一些更具体的好处。
第一个就是有了架构之后,我们就可以用一样的方式来解决相似的问题,实现相似的功能。这个就叫做方式一致性。方式一致性有助于提高代码的可维护性以及代码的健壮性。复用现有的方式来实现相似的问题,更不容易出bug。
第二个就是可以让不同功能之间的数据来源保持一致,也就是数据一致性。可能有的同学会觉得保证数据一致性不是什么难事,比如数据都是从网络获取的,那么我们是不是只要保证服务器不出错,客户端就不需要考虑数据一致性的问题?其实,恰恰是客户端更容会出现数据一致性导致的问题。多页面、多线程,甚至多数据库之间的数据同步都是非常容易出现问题的。
第三个就是能够让页面实例的生命周期的管理保持一致,也就是生命周期一致性。从客户端的角度来说,需要管理的生命周期还是非常多的。
第四个就是团队开发中能够使用一样的代码风格,也就是风格一致性。这四点其实都是解决了一致性的问题。
也就是说,我们架构的一个好处,就是能够帮助我们保证一致性。保证一致性的目的就是为了让不同的工程师实现出来的代码尽量是一致的。让不同页面不同功能之间的数据源生命周期也尽量是一致的。
除此之外还能通过架构来保证对一个功能的修改,不影响其他功能。 能够让一个模块只有一个职责,符合单一职责原则。 减少功能之间的依赖。 通过依赖倒置去隐藏一些细节。
这些好处总结一下,其实都是为了保证高内聚和低耦合。
什么是分层架构?
分层架构。分层架构可以说是运用的最广泛的架构模式。最经典的分层架构就是把架构像这样分成三层,包括用户界面层、业务逻辑层以及数据访问。层与层之间的关系是自上而下的依赖,不能逆向的去依赖。
作为一个完整的分层架构,每一层的职责都是固定的,每一层实现方式的改变也不会影响其他层。依赖关系也是自上而下的单向依赖,业务代码会分布在这三层里,不同业务之间的代码必须也要横向的解耦。
分层的依据是什么?
1、要符合关注点分离的原则,每一层的关注点应该是不同的。
层与层之间自下而上,应该是从机器到用户,从抽象到具体,从通用到业务。每一层各自关注各自所抽象的层次。比如说数据层会更倾向于底层的存储,而用户界面更倾向于用户的操作。数据层更原始和通用,用户界面更能够代表业务,就是自下而上。用户界面层最好只关心页面如何绘制,用户如何接受事件。数据层最好只关注底层的数据如何存储和如何提供给上面的层次。
2、要关注修改技术方案或者是修改代码的时候所带来的对其他层次的影响。
比如说我们把UI层的技术实现方案,从XML 实现的 view 布局改成了 JetPack Compose 来实现。它也不应该影响到数据层的正常运行。反过来,如果数据层修改了一些数据库的访问方式,也不应该带来业务上的改变和UI层的绘制上的改变。
总结
我们最后再来总结一下架构带来的好处。最重要的就是两方面。
1、能够让整个应用有更好的一致性,减少团队开发中遇到的各种障碍。
2、能够让整个应用的代码达到一种高内聚和低耦合的状态。
最后再总结一句,架构其实并不是让写代码更容易,架构的作用是能够让我们更好的去管理代码。