
编程的一些抽象核心
发布日期:2021-05-09 01:16:35
浏览次数:16
分类:博客文章
本文共 1811 字,大约阅读时间需要 6 分钟。
目录
一、程序、算法
本质
程序=算法+数结结构算法=逻辑+控制
程序=算法+数结结构,这个是众所周知了,算法这个解释则比较清丽脱俗:1.逻辑 2. 控制。
- 逻辑用来解决实际的问题, 控制决定用什么策略来解决问题,逻辑是真正意义上的解决问题的算法
- 控制是一个程序流转的方式,即程序执行的方式,并行还是串行,同步还是异步,调度不同执行路径或模块,数据之间的存储关系。
逻辑是是处理什么
,控制是怎么做
,沟通方式是数据结构
举例
表单验证经常的做法是
function check(data) { 名字 = get(data, 名字) if (名字为空 || 名字长度小于3) { return 验证失败,名字非法 } 密码 = get(data,密码) if (密码为空 || 密码长度小于8) { return 验证失败,密码非法 } 邮箱 = get(data,邮箱) if (邮箱为空 || 邮箱格式不正确) { return 验证失败,邮箱非法 } ... return 验证通过; }
这个函数最终逻辑是验证输入数据的合法性,但是这样其实就是把控制和逻辑耦合在一起了,随着验证字段的增多,这个函数会越来越长,最终造成可读性越来越差,越来越难维护
更好的分离两者的方法是,定义一个表单验证器,如下
var rules = { 名字: ["长度大于3"], 密码: ["长度大于8"] 邮箱: ["email格式"] ... ]}; if 失败结果=checkRules(rules).执行(); 失败结果不为空 { return 验证失败,失败结果}return 验证通过
这样通过描述验证规则,得到了一种控制和逻辑之间的解耦,不用再在check里边各种if else了。
绝大多数程序复杂混乱的根本原因是业务逻辑和控制逻辑的耦合
二、面向对象、设计模式
面向对象、设计模式的重点就是:
- 使用接口抽象了具体的实现类,这样其它类耦合的是接口而不是实现类,这就是多太,增加了程序的扩展性
- 接口也就是一种协议,就像HTTP协议一样,浏览器和后端的程序都依赖于这一种协议,而不是具体的实现(如果是依赖具体实现,那么浏览器就要依赖后端的编程语言或中间件了,这就太恶心了)。于是,浏览器和后端的程序就完全解除依赖关系,而去依赖一个标准的协议了,这也是Ioc/DIP的本质。
23个设计模式基本就是说了两个面向对象的核心理念:面向接口编程、组合优于继承
面向接口编程
- 使用者不需要知道数据类型、结构、算法的细节
- 使用者不需要知道实现细节,只需要知道提供的接口
组合优于继承
继承需要给子类暴露一些父类的设计和实现细节,父类实现的改变会造成子类也需要改变,而组合则不存在这样的弊端。
我们以为继承主要是为了代码重用,但实际上在子类中需要重新实现很多父类的方法,继承更多的应该是为了多态。三、依赖倒置和控制反转 (IoC/DIP)
简单说就是要依赖于抽象接口,不要依赖于具体实现
这就是控制反转,开关从以前设备的专用开关,转变到了控制电源的开关,而以前的设备要反过来依赖开关厂声明的电源接口钱
从以前的以物易物,变成了依赖“钱”,所有的商品都依赖这个“钱”的交易协议,不用再互相依赖了,整个世界的动作就简单了很多
开关和灯
有一个开关要控制一个灯的开和关,最直接的方法就是把开关和灯做到一起。
但是,如果有一天,我们发现这个开关可能还要控制别的不仅是灯泡的东西,就会发现开关耦合了灯泡这种类别,非常不得扩展。解决方案就是,造开关工厂根据不需要关心要控制的东西是什么,只做一个开关,功能就是把电接通和断开,不管是手动的、声控的还是光控、遥控的,开关厂和电灯厂依赖于一个标准的通电和断电的接口。造灯泡的工厂也不关心你用什么样的开关,只管把灯的电源接口做出来,开关厂和电灯厂依赖于一个标准通电和断电的接口。证券交易所
在交易的过程中,卖家向买家卖东西,一手交钱一手交货,基本是要见面的,这个时候银行出来做担保,买家先把钱打到银行,银行让卖家发货,买家验货后,银行再把钱打给卖家。
这就是反转控制,买卖双方把对对方的直接依赖和控制,反转到了让对方来依赖一个标准的交易模型的接口。发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年05月08日 01时20分23秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Java选择排序算法实现
2019-03-12
00010.02最基础客户信息管理软件(意义类的小项目,练习基础,不涉及数据库)
2019-03-12
00013.05 字符串比较
2019-03-12
Effective Java 读书笔记
2019-03-12
SpringBoot使用@Email报错误
2019-03-13
Rabbitmq的内存磁盘监控
2019-03-13
访问servlet时弹出文件下载框解决方法
2019-03-13
IDEA-@Slf4j和log标签&@Data(Lombok)无效
2019-03-13
Thymeleaf 生成下标,索引,使用Stat变量
2019-03-13
ValueError: Unexpected end of file.
2019-03-13
六、登录(二)
2019-03-13
初始微服务---Springcloud发展【第一期】
2019-03-13
RAFT 拜占庭将军 共识算法
2019-03-13
UE4 错误列表 error码(只记录我遇到的情况,持续添加,未完成)
2019-03-13
【Jquery】获取当前窗口的宽度值/高度值
2019-03-13
Android 架构组件 – 让天下没有难做的 App
2019-03-13
能解决数据可视化大屏需求的3款可视化工具
2019-03-13