左耳听风
陈皓
网名“左耳朵耗子”,资深技术专家
180928 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 119 讲
左耳听风
15
15
1.0x
00:00/00:00
登录|注册

38 | 编程范式:编程的本质

面向对象、函数式编程、逻辑推导式编程
HTML、SQL、Shell Script、正则表达式等
状态定义、变迁条件、action
通过有效分离Logic和Control来改进程序
算法由Logic和Control组成
影响计算机科学教育
算法和数据结构的关系
Control部分只影响Logic的效率
Logic部分是有意义的
编程范式
DSL
State Machine
控制逻辑和业务逻辑的耦合导致代码混乱
业务逻辑复杂度决定代码复杂度
DSL描述Logic,解析器作为Control
使用DSL+解析器分离Logic和Control
有效分离Logic和Control是解决问题的关键
Logic和Control的纠缠导致程序复杂度上升
示例代码的混乱和难以维护
编程范式的本质是Logic+Control+Data
通过标准化接口/协议适配不同Logic
标准化Control需要标准化Data Structure
控制可以标准化
论文提到的观点
《Algorithms + Data Structures = Programs》
有效地分离Logic、Control和Data是写出好程序的关键所在!
Algorithm = Logic + Control
Programs = Algorithms + Data Structures
编程的本质
分离Control和Logic的技术
代码复杂度的原因
再来一个简单的示例
把逻辑和控制混淆的示例
编程范式
两篇论文
编程的本质

该思维导图由 AI 生成,仅供参考

你好,我是陈皓,网名左耳朵耗子。
前面我们讲了各式各样的不同语言的编程范式,从 C 语言的泛型,讲到 C++ 的泛型,再讲到函数式的 Map/Reduce/Filter,以及 Pipeline 和 Decorator,还有面向对象的多态通过依赖接口而不是实现的桥接模式、策略模式和代理模式,以及面向对象的 IoC,还有 JavaScript 的原型编程在运行时对对象原型进行修改,以及 Go 语言的委托模式……
所有的这一切,不知道你是否看出一些端倪,或是其中的一些共性来了?

两篇论文

1976 年,瑞士计算机科学家,Algol W,Modula,Oberon 和 Pascal 语言的设计师 Niklaus Emil Wirth写了一本非常经典的书《Algorithms + Data Structures = Programs》(链接为 1985 年版) ,即算法 + 数据结构 = 程序。
这本书主要写了算法和数据结构的关系,这本书对计算机科学的影响深远,尤其在计算机科学的教育中。
1979 年,英国逻辑学家和计算机科学家 Robert Kowalski 发表论文 Algorithm = Logic + Control,并且主要开发“逻辑编程”相关的工作。
Robert Kowalski 是一位逻辑学家和计算机科学家,从 20 世纪 70 年代末到整个 80 年代致力于数据库的研究,并在用计算机证明数学定理等当年的重要应用上颇有建树,尤其是在逻辑、控制和算法等方面提出了革命性的理论,极大地影响了数据库、编程语言,直至今日的人工智能。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

编程的本质在于有效地分离Logic、Control和Data。文章通过两位老先生的表达式,强调了程序的本质是由算法、数据结构、逻辑和控制组成的。逻辑部分定义了解决问题的算法,而控制部分决定了如何使用逻辑。有效地分离这三个部分是写出好程序的关键所在。编程范式围绕着这三个要素展开,比如函数式编程中的Map/Reduce/Filter是一种控制,而传入这些控制模块的Lambda表达式则是解决问题的逻辑。文章指出,标准化Control、Data Structure和Logic是编程范式的本质,有效地分离这三者是写出好程序的关键。文章强调了程序的复杂度取决于业务逻辑,而为了控制程序,需要大量控制代码,因此Logic+Control相互交织成为最终的程序复杂度。总之,编程的本质在于有效地分离Logic、Control和Data,这是写出好程序的关键。 文章举例说明了混淆逻辑和控制的问题,以及如何通过使用通用状态机、抽象匹配策略等方法来改善代码质量。另外,通过对用户表单信息检查的常见代码和DSL+DSL解析器的对比,阐述了如何分离控制和逻辑,以及控制逻辑与业务逻辑耦合的问题。最后,文章提出了解耦的技术,如状态机、DSL、编程范式等,以及编程的本质是Logic部分才是真正有意义的,而Control部分只是影响Logic部分的效率。这些内容为读者提供了对编程本质的深入理解和解耦技术的应用方向。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《左耳听风》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(62)

  • 最新
  • 精选
  • mingshun
    自从写业务的这几年来,做得最多的就是分离 Logic 和 Control。无论是编写新代码还是重构旧代码,都是从这个方向努力,目标是写出让团队里每个人都能轻松看得懂的代码。也用过许多语言,像 C、C++、Java、Golang、Lua、JS、Ruby、Elixir、Red……虽然思维模式和习惯玩法各异,但编程的本质是一样的。毕竟代码写出来是给人看的。如果人都很难看懂,又谈何优化和改进代码?!

    作者回复: 赞👍

    2018-05-18
    2
    82
  • 楊_宵夜
    Roger的留言, 本人不才, 想试着从"Control标准化"和"代码可重用"的角度来回答下: 仔细看那个检查表单信息的例子, 叫做check_form_XXX(), 是针对特定的一个form的, 那么自然而然会有check_form_YYY()和check_form_ZZZ()等等... 所以说, 这个form校验例子中, 1. 最简单的Control部分就是遍历表单fields. 2. 然后, 虽然是不同的field, 但相同的type是做相同逻辑的校验; 3. 如果还想提供"将整个form拆成不同的part, 用并发来遍历"这种Control的话, 抽象出来的check_form()函数还可以提供并发的版本; 那么单单是以上3点, 全部都是"可标准化"的, 并且"可重用"的, 并不影响<业务的logic>; 那么, 当有了check_from()这个Control之后, 真正决定业务的<业务的logic>, 有: 1. 每个field分别是什么type? 是text? 是password? 还是email? 2. 每个field的最低长度是多少? 类似的还有每个field的最大长度? 3. 等等... 以上的问题, 决定了这个field通过校验的条件是什么? 而这个条件是无法"标准化"的, 因为一个复杂系统的每个form的field不可能是一模一样的; 所以这些"条件", 就由陈老师写出的DSL来提供; 因此最后就变成了, check_form()提供一套"标准"来校验每个表单, 而每个表单只需要告诉check_form()说: "我有这些东西, 你帮我校验一下"; 而这样的说法, 又有了些委托模式的味道了; 总而言之, 个人愚见: Control和Logic部分的一个肉眼可见的界线就是: 是否可以标准化?? 因本人较熟悉Java, 再扩展来说, 全局的工具类就是一种全局Control, 而一个类中的private方法大致可以认为是这个类中的Control. (仅为一种思路, 未经推敲);
    2018-02-13
    53
  • SamZhou
    是处理什么(logic),怎么做(control),沟通方式(数据结构)?
    2018-02-10
    1
    29
  • 又双叒叕是一年啊
    个人觉得 Data Structure 才是 What, Logic 是 do What , Control 是 how to do
    2019-06-20
    1
    16
  • 本文核心: 1:Program = Logic + Control + Data Structure 2:有效地分离 Logic、Control 和 Data 是写出好程序的关键所在! Logic 部分才是真正有意义的(What) Control 部分只是影响 Logic 部分的效率(How) 3:理解Logic和Control的本质是关键,这样才能进行她们的解藕,才能使程序更易读更易维护和扩展。 那什么是Logic?什么是Control?他们之间又有什么界限呢? Control是可以被标准化的,是可以复用的,是实现业务逻辑具体怎么走的代码。 Logic是具有个性化的,不能被标准化,或者说不知道怎么标准化,因为规律性有序,不具有复用性。 这节需要多看几次,价值连城。
    2020-02-29
    12
  • Y024
    曾都梦想仗剑走天涯,哦不,是精通一门语言,然后一通百通吃遍所有语言。可以结合王垠的<如何掌握所有的程序语言>一起看看。 http://www.yinwang.org/blog-cn/2017/07/06/master-pl
    2018-05-13
    1
    11
  • pigparadise
    以前做codereview时老和同事说有些逻辑和另一些逻辑分离,复杂度能更低,数据更安全,但文中logic和control的定义更加清晰,对我也是一级记当头棒喝,该系列最佳!
    2018-09-18
    9
  • vvsuperman
    有没推荐阅读,逻辑和控制的意思实在不太懂
    2018-03-12
    4
    9
  • edisonhuang
    程序=算法+数据结构 算法=逻辑+控制 如果将 Logic 和 Control 部分有效地分开,那么代码就会变得更容易改进和维护 大部分混乱的代码就是把逻辑和控制混在一起了,导致难以阅读和维护。而逻辑才是我们真正要关心的问题,他解决了做什么。控制只是操作计算机的具体实现,解决了怎么做。二者关系就好像做正确的事和把事情做正确。其实我们真正关注的只是正确的事,这是战略层面,而把事情做正确是执行层面,有效解除二者的耦合是改善的重要一步
    2019-06-26
    1
    7
  • caohuan
    看完 耗子哥的文章,我知道 为什么我还是一枚 码农了,代码 没有解耦,业务和控制代码 糅合在一起,虽然 我会一点 面向对象的 5大原则,也看过 重构的书籍,一直在模仿表层,没琢磨本质,所以 代码 既丑陋,可读性很差,知道有问题,得去提高了
    2018-11-07
    7
收起评论
显示
设置
留言
62
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部