软件程序通常有两个层面的需求:
- 功能性需求,简单来说,就是一个程序能为用户做些什么,比如,文件上传、查询数据等;
- 非功能性需求,这个是指除功能性需求以外的其他必要需求,比如,性能、安全性、容错与恢复、本地化、国际化等。
事实上,非功能性需求所构建起来的正是我们所熟知的软件架构。简单来说,就是软件的基本结构,包括三要素:代码、代码之间的关系和两者各自的属性。
软件分层架构是通过层来隔离不同的关注点(变化相似的地方),以此来解决不同需求变化的问题,使得这种变化可以被控制在一个层里。
代码分层架构就是将软件“元素”(代码)按照“层”(代码关系)的方式组织起来的一种结构。
分层架构核心的原则是:当请求或数据从外部传递过来后,必须是从上一层传递给下一层。如下图,一个来自 View 层的数据,必须先通过 Controller 层、Model 层后,才能最终到达数据库层。
“为什么不让 View 层的请求直接到达数据库呢?”
这是因为会造成新的代码耦合,增加代码的复杂度。比如说,View 层直接调用 Model 层的组件,当 Model 层上的组件有变化时(比如, SQL 或逻辑修改),既会影响 Controller 层组件的使用,也会影响 View 层组件的使用
代码分层架构主要是为了解决两个问题:
- 如何快速拆解功能问题?
- 如何提升代码的可扩展性?
优势:
- 只用关注整个结构中的其中某一层的具体实现;
- 降低层与层之间的依赖;
- 很容易用新的实现来替换原有层次的实现;
- 有利于标准化的统一;
- 各层逻辑方便复用。
劣势
- 开发成本变高
- 性能降低:请求数据因为经过多层代码的处理,执行时长加长,性能会有所消耗。
- 代码复杂度增加
总的来说:实现责任分离、解耦、组件复用和标准制定。