我正在参加「初夏创意投稿大赛」详情请看:初夏创意投稿大赛
以下内容基于个人理解,如若有误,欢迎指出。
明确一个主旨
编程,看似是一门技术活,跟买卖关系不大。但是,编程的最终目的,是做出一个产品,然后卖出去挣钱。
编程,是市场链中的一环。
如果以挣钱为目的反推,事情就变得清晰了起来。想要让产品挣更多的钱,那就降低成本,提高产出。编程不同于其他实体产品,它只产出一个产品。所以,目光就聚集在了降低成本。
成本最终折算为金钱成本,金钱成本主要受 时间 和 人员 影响,进一步细化,可以从降低时间成本、降低人员成本来考虑。
降低时间成本,意味着:
1.减少编码时间 -> 提高代码的复用率和可移植性 -> 代码模块化 -> 高内聚,低耦合
2.减少交流时间 -> 完善的文档、清晰的注释、良好的可阅读性 - > 易于维护
3.减少人员成本 -> 完善、健壮的框架 -> 框架功能区的划分 -> 易于理解项目结构,关注当前事情即可
以上标准,是市场规律的产物,也是我们判断一个项目代码的优劣、编码人员素质高低的标准。
为了达到这样的标准,经历了长时间的实践和演化。
高内聚,低耦合
这个概念,通常是以模块为单位。
百度百科解释如下:
内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事,它描述的是模块内的功能联系;耦合是软件结构中各模块之间相互连接的一种[度量](https://baike.baidu.com/item/度量/34036),耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据。
我的理解是,每个模块专注于做好自己的事,就是 高内聚。模块调用起来没有太多需要考虑的东西,就是 低耦合。我把它理解为流水线上的生产过程。比如生产泡面。
原料 -> 泡面 -> 运输 -> 装袋 -> 封口
每个步骤可以看作一个模块,它很好的完成了自己模块的功能。比如装袋模块,它得生产包装袋、印花,然后产生一个包装袋。只要将泡面经过装袋模块,就会被装入做好的包装袋中。
这就可以算是高内聚。
状态模块并不需要运输、生产等其他模块配合,它的功能也不受到其他模块功能的影响,就可以算作是低耦合。
这种生产的抽象概念,应用在各个领域,但是实现起来各不相同。
在编程中的实现,降低耦合,就是减少和其他模块的关联。因此,尽量不使用全局变量,避免操作其他模块的类。
增强内聚,就是提供的接口参数越少越好。内部的优化不影响模块的功能。
雏形
在我以前写前端的过程中,html 文件中可以直接写 js ,也可以外部引入。css 也是。
刚开始编程的时候,为了方便。我有时在 html 文件中处理数据,有时在 js 文件中处理数据。有时候直接在界面上写样式,有时候在 css 文件中写样式。
很显然,这些文件的功能交叉了,也可以叫做耦合了。每个文件的功能并不纯粹,给维护造成了很大困难。根据 高内聚、低耦合的思想,我们希望 html 只负责展示 dom 数,css 负责样式,js 文件只负责数据处理。
此时,我们想要复用界面,则不需要对 html 做过多处理,因为它只负责展示。
将文件进行功能区分,让每个功能都变得纯粹,便于复用和移植,这就是 MVP 的思想雏形。
MVC 是一种思想,不是一种标准
以下内容图片参考文章:正确认识 MVC/MVP/MVVM - 掘金 (juejin.cn)
MVC ,是三个功能模块首字母的缩写。
三个模块代表的功能描述如下:(来自百度百科)
- Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
- View(视图) - 视图代表模型包含的数据的可视化。
- Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
对这个思想的实践有好几种,有这样的:
model 负责数据的处理。
view 负责展示 model 的对应数据的渲染结果;获取用户输入的数据时,它不会直接和 model 进行交互,而是交给 controller 处理。
controller 会拿到 view 的请求,然后调用对应的 model 中的方法,修改数据。
model 变更,通知 view,view 更具 view 重新渲染。
这种方式只能说是各司其职,但是,每个功能模块之间依然相互有关联。
后来进化成了这样。
这个应该比较好理解,就是中间的操作都由 Controller 完成,view 和 model 没有直接关联,只要保证输出和输入不变,内部的变更不会影响整个项目的运行。
就我个人理解而言,这种方式更加符合: 高内聚、低耦合的思想。
思考
如果大量的逻辑交互交由 Controller 去控制,会出现一个问题,就是 Controller 这部分的代码太臃肿了,也不便于维护。为了解决这个问题,又延伸出了 MVP,MVVM 等思想。
但是个人觉得,无论是何种思想,它依然是围绕着两个中心点展开:
方便复用,方便维护。
所谓万变不离其宗,有了这个思维方式,沿着这条线去思考,在平时写代码的过程中,也可以运用这种思想。
写下本文时,我的实践尚且不够,后续有实践,定来补充。
如果对你有帮助,记得给我点赞~小小的点赞,给予我更文的动力!