为什么不给用goto_如果现在只能用汇编和Goto编程......

0a03886eb9d156e85be1606ff6b3c9b3.png

上世纪五六十年代,高级语言还没普及,很多人用汇编写程序,汇编代码运行效率高,但是有个致命的缺点:不容易看懂,维护困难。

程序设计是少数聪明人干的事情,他们智力超群, 写代码也不讲什么规则,可以随意使用灵活而又强大的Goto,写出只有自己能懂的代码。

但是到了六十年代中后期,事情就慢慢不对了,计算机的计算能力提升速度远远超过程序员,软件规模和数量随之急剧上升, 出现了一堆问题:项目预算超支,项目难以管理,代码质量很低,软件不符合需求,这该怎么办?

0 1北约会议

1968年,“北约软件工程大会”在风景如画的德国小镇Garmisch召开(我很奇怪为什么这个会议以北约的名义牵头,有知情的同学请告知。)

3838d5b7a27067a87eb85f456fd5fa10.png

会议指出:软件的复杂度已经变得人脑无法掌控,我们已经处于严重的软件危机当中!

会议强调:软件的生产有必要建立在某些理论基础和实践指导之上!

会议要求:各单位要切实加强对其他学科的学习,实施软件软件工程的办法,努力提高程序设计的效率和质量。

可是理论基础和实践指导在哪里呢?

0 21968年的Dijkstra

每当危机到来,总会有大神出手相救,这一次是Dijkstra。

fb751fc4de2f4bdb323a16288713b260.png

学编程的同学肯定知道他,《数据结构和算法》中有他的Dijkstra算法,《操作系统》中有他的信号量,银行家算法,他还在程序设计,分布式计算,并行计算,编译器等很多领域做出了开创性贡献,于1972年获得计算机界最高奖:图灵奖。

Dijkstra大神经过研究,于1968年在ACM上发表了一篇论文,名字叫做《Go to 语句有害论》,要求废除Go to 语句!

这篇战斗檄文一下子就使编程界炸了锅,支持Goto 语句的人觉得他们的权益受到了极大的侵犯:没有Go to 语句,程序流程怎么跳来跳去,以后怎么写代码?

Dijkstra准备充分,他本人在50年代就用机器代码编写了大量程序,清楚地知道Go to 语句的危害, 但是为了以理服人, 他搬出了一个著名的、被证明的理论:

无论是什么程序,不管多么复杂,都可以用三种基本的结构来表达:顺序,分支,循环。

291f145d3afaef810cae7073728e9d4b.png

所以,你们不用再瞎BB了, 不用go to 语句也能写程序。

0 3结构化编程

更进一步,Dijkstra创造了一个词:结构化编程,它包括这些元素:

控制结构:顺序, 分支,循环,还有著名的递归

子程序:也叫过程,方法,函数,可以封装一系列语句让别人调用。

代码块:如if...fi,Begin...END , {....}

这几乎就是现代编程语言最基本的元素了,软件工程这座大厦的地基终于打好, 结构化编程掀起了一场革命:

自顶向下分析问题

模块化设计

高内聚、低耦合

瀑布式开发方法

......

结构化编程大大降低了编程的复杂性, 必须感谢这些大神,让我等资质平庸的人也能投身于软件编程的伟大事业当中,如果把我扔到五六十年代的Go to洪流中,我可能活不过三集。

对Go to 的争论一直没有停歇,包括高纳德这样的大神也卷入进来,发表文章《Structured Programming with go to Statements》,他分析了许多常见编程任务,然后发现其中的一些使用Go to 将得到最理想的结构。例如:跳出嵌套循环,多个分支的跳出等,所以现在很多编程语言依然保留着goto这个关键字。

0 4致命问题

随后几年,结构化编程运动如火如荼,人们写的程序越来越复杂,结构化编程的两个致命问题逐渐暴露:

1.  维护全局变量变成噩梦

子程序(函数)虽然封装了相同的代码逻辑,成为黑盒子,但是多个子程序(函数)需要共享信息的时候,就需要全局变量,全局变量一旦变多,维护就变成噩梦。

9159a88cd3bc8d4f115db5e900d7ca53.png

2. 子程序(函数)的复用性太差

函数是一个有输入、输出的简单的逻辑单元,其他程序可以通过调用公用函数来实现复用,但是这种复用的层次太低。

比如:我们想定义一个这样的主程序:

98311b1ffcdbc215af466787bf62ba68.png

里边包含一些逻辑,但是有些步骤是虚线,表示希望在运行时能动态的替换成用户自己的东西(没错,这其实就是一个框架了!) ,结构化编程就有点儿着急了。

也就是说,我们无法复用这个主程序的结构。

C语言可能会跳出来:用函数指针来做啊。没错,函数指针能实现,但是属于高级技巧,不是普罗大众程序员能玩的, 何况有些语言还不支持。

0 51967年的Simula

时间倒退一年到1967年,挪威的两名科学家Ole-Johan Dahl 和Kristen Nygaard发明了一个叫做Simula 67的语言,这个语言和当时流行的Fortran, COBOL, Basic 全然不同, 它不但支持类,还支持继承,多态这些新鲜的概念。

不过由于当时的计算机硬件性能低下,而这些概念又过先进,所以在很长时间内都没人注意到。

随着结构化编程缺陷的暴露,人们发现Simula 67 这门语言的特征正好可以解决上面的两个问题:

1. 类可以把函数和成员变量组织在一起,消除全局变量

ff648162cb28bb792c546fc825215ecf.png

使用权限控制,可以使得实例变量对外不可见。

2. 通过多态,可以实现对主程序的复用

b31b5f526e1bd40c9793b6b352740a3e.png

主程序只调用接口或者缺省类,使用者提供实现类,两者结合起来,完成业务功能。

大神程序员可以集中精力搞定那些最基础,最重要的东西,创建出通用的框架和类库让程序员使用。我等普通人只需要专注业务逻辑即可, 又可以快乐地搬砖了!

使用面向对象的技术,代码的复用层级从简单的函数进化到类和框架,不仅如此,还有些程序员从框架和类库中抽取出了可以重用的思想:模式。

面向对象技术从60年代的Simula 67起源,70年代出现了Smalltalk,80年代出现了C++, 到了90年代,Java横空出世,面向对象编程终于成为主流。

2001年,图灵奖姗姗来迟,颁给了发明Simula 67 的Ole-Johan Dahl 和Kristen Nygaard。

0 6尾声

1967年和1968年真是神奇的两年, 面向对象技术发明, 结构化编程运动开启。

表面看,这两项技术没什么大不了的,但是它们都降低了软件开发的复杂度,使得普通人也能参与到搬砖的伟大事业当中,这才造就了繁荣的软件编程行业和互联网。

请大家切记,使用某种更高级的技术,不能代表你就能开发出高级的程序,关键在于人。 用面向对象的语言,写着面向过程的程序,这样的人大有人在。

所以,如果有人再宣称

OOP大法好

设计模式大法好

函数式编程大法好

XXX框架大法好

XXX大法好

你不用多费口舌,只需要问他一个直击灵魂的问题:你用这个技术,是不是降低了你所在领域的复杂度呢?是不是提高了可维护性和重用性?看看他怎么回答吧!


—— 图书推荐 ——

4d35fd123b382e42575193fcfb42390b.png

《码农翻身》

刘欣(@码农翻身) 著

本书讲了很多很多故事,在读故事的过程中就能轻松掌握相关技术,让你在畅快的阅读后,会有一种“原来如此”的感觉。

书中把计算机元素和行为用拟人手法编成一个个精彩纷呈的故事,绘声绘色且深入浅出地演绎晦涩枯燥的编程知识。学习优秀的架构师是如何思考、如何抽象、如何成长的,从操作系统、Java语言到Web技术,每个主题都深入浅出。

fbc1f9b22b9fb0ab8c9e44cd9eafa383.png

▲扫码获取本书详情▲

如果喜欢本文欢迎 在看留言分享至朋友圈 三连

  热文推荐  

9月新书不一般,你涨知识我买单

“因子投资”中文版首著上市

书单丨6本书带你实现爆发式增长

面向对象的两大迷思,再给你们解答一次

4813e66eae4447998a8a5e4e39c07770.png▼点击阅读原文,了解本书详情!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值