1
第一天
上帝看到人类发明了计算机, 但一直在用汇编语言艰难地写程序, 很是伤心, 就把编译器的秘密告诉了约翰 . 巴科斯, 让他带领大家写出了编译器, 从此人类可以用高级语言写程序, 然后编译成机器语言去运行了.
上帝还教会了人类使用顺序, 循环, 分支这三种基本的程序结构来编写程序.
人类很高兴, 写的代码越来越长.
2
第二天
但是人类经常写下臭长臭长的代码, 然后把代码 Copy 得到处都是.
上帝说:"要有函数! 你们可以用函数把长长的代码封装起来, 这样就写一次, 就可以到处调用了."
人类又发现有些函数的参数太长, 记不住, 调用层次深的时候让人抓狂:
上帝告诉 Dennis Ritchie:"找个数据结构把参数组织起来, 以后就传递这个数据结构!"
上帝教导人类: 程序 = 数据结构 + 算法
人类看到清爽的代码, 觉得很舒服.
3
第三天
有人写了一个程序, 用一个数据结构和函数实现了一个简单的栈.
插播福利
1. 赠送互联网领域技术图书 (pdf),143 家公司的面试真题, 共计 10T 干货资源.
获取方式: 关注本公众号, 回复 "干货".
2. 免费微信交流群: 包括健身群, 运动群, 交友群, 学习群, 求职群, 讨论群, 老乡群, 学生群, 校招群, 跑步群, 聚餐群
入群方式: 关注本公众号, 回复 "入群".
上帝看到了, 皱了皱眉头, 说道:"这个数据结构对外完全是不设防啊, 不但自己的算法 push,pop,top 等可以操作, 使用这个 Stack 的客户也可以操作 elements 这样的内部数据结构, 可以获取任意元素的值, 而不仅仅是通过 push,pop 来操作. 依照人类的本性, 还不搞得天下大乱? 不好不好."
上帝说:"要有 Object!"
上帝把 Alan Kay 叫来, 告诉他: 要把数据和操作给结合起来, 形成 Objec, 以后 Object 的属性数据不允许直接访问, 只能通过这个 Object 的函数来操作.
人类觉得 Object 大法好, 创建了很多 Object 出来, 让他们互相调用.
4
第四天
上帝发现很多 Object 的方法都是相同的, 他们被重复地放在一个个对象当中, 太浪费了.
上帝说:"要有 Class! 把这些重复的方法代码从对象中剥离出来, 放到一个公共的 Class 中!"
人类问:"那我们怎么把这些 Object 给创建起来? 并且让 Object 和 Class 关联?"
上帝说:"可以用 new 这个关键字: Stack object1 = new Stack();"
Stack 类的函数定义只有一份, 但是 Stack 类生成的 Object 有很多份.
人类在写 push() 函数, pop() 函数的时候, 要操作 Object 的数据, 到底操作的是哪一个 Object?
上帝说:"要有 this !"
每次调用函数的时候, 可以把要操作的 Object 作为一个隐藏的参数传递进去. 例如 void push(int data), 真正在调用的时候是这样的: void push(Stack this, int data).
有个叫 Guido 的说:"我能不能把 this 改成 self ?"
上帝说:"随你喽!"
还有人说:"这不又回到我们原始的状态去了吗? void push(Stack *s,int data)"
上帝告诫说:"虽然本质相同, 但是表达形式不同, 之前你在语法层面必须传递一个 Stack 对象到函数, 现在在语法层面不用加了. 我会在编译后的代码, 或者运行时自动给你们加上."
Guido 说:"我还是喜欢把 self 加到方法上!"
上帝没有说话, 应该是默认了.
5
第五天
人类创建了很多很多的 Class, 上帝发现有些 Class 包含了类似的功能, 还是有重复代码.
上帝说:"要有继承! 把那些类似的, 重复代码放到父类当中去, 这样子类就可以直接使用, 不用重新再写一遍了."
上帝又说:"要有多态! 就是对同一个接口, 使用不同的实例而执行不同操作."
Person p = new Employee();
p.funcB() // 执行 Employee 类的 funcB() 方法, 而不是 Person 类的 funcB() 方法
人类看到继承的好处, 开始疯狂使用.
支持单继承和支持多继承的两派人还发起了多次战争.
上帝非常担心, 他告诫人类:"继承其实是破坏了封装性, 父类的很多细节对子类都是可见的, 父类的变化可能会极大地影响子类."
人类不知道怎么办.
"你们要记住一条: 优先使用组合而不是继承." 看到人类并不太懂, 上帝叫来了 Freeman , 告诉他一个 "鸭子游戏" 的例子, 后来 Freeman 把这个例子写到了一本书里, 这本书叫做《Head First 设计模式》.
"还有一条," 上帝补充到,"面向接口编程, 而不是实现编程."
人类还是不懂, 上帝叫来了 Eric Gamma , 告诉他在面向对象设计和编程中要注意的 23 种通用模式, 让他和另外三个人写了一本书《设计模式: 可复用面向对象软件的基础》, 但是大家都说看不懂.
5
第六天
人类使用了继承和多态, 理解了设计模式, 但是代码还是一团糟.
上帝说:"编程的关键是要抽象啊! 你们得把系统需求抽象成高层的概念, 然后在概念层次进行编程."
这句话本身就很抽象.
有大牛学会了, 写出了很多优秀的软件.
大部分人表示学不会.
上帝也没有办法, 只是有点后悔, 教了人类太多的东西, 而人类又不能完全掌握.
上帝一直在思考, 要不还是让人类回到机器语言编程时代?
或者创造一种智能的机器来替代人类编程?
7
第七天
上帝觉得累坏了, 就休息了, 程序员们也休息了一天.
这就是星期天的来历.
出场人物:
约翰 . 巴科斯 : 计算机科学先驱之一, FORTRAN 之父, 1977 年图灵奖得主, BNF(巴克斯 - 诺尔范式) 的发明者之一.
Dennis Ritchie: C 语言之父, Unix 的创造者之一.
Guido van Rossum:Python 之父.
Eric Freeman:《Head First 设计模式》作者之一.
Eric Gamma:《设计模式》作者之一, 主要作品: JUnit,Eclipse JDT,Jazz, Visual Studio Code.
来源: https://mp.weixin.qq.com/s?__biz=MzIyNjM3MzI4MQ==&mid=2247484462&idx=1&sn=46e4be75ff3a25744d9aed03f44d347e&chksm=e8703fe0df07b6f69e94918ccb2f3e4164395e876cfd47391e125e970cb62aa91d591ef67e9e#rd