OOP如今非常流行,其起源于1960年代的Simula 67,后来被Smalltalk和C ++所流行。我们有DRY,SOLID,以及许多有关面向对象世界中的设计模式的书籍。
但是在广泛采用OOP范式之前,编程的主要原则是什么?主要的设计模式是什么?
OOP如今非常流行,其起源于1960年代的Simula 67,后来被Smalltalk和C ++所流行。我们有DRY,SOLID,以及许多有关面向对象世界中的设计模式的书籍。
但是在广泛采用OOP范式之前,编程的主要原则是什么?主要的设计模式是什么?
Answers:
在学习Java之前,我是Cobol开发人员。我已经开发超过35年了。
早在过程语言时代,大多数处理都是分批完成的。追溯到足够远的历史,甚至使用一批打孔卡完成程序编译。
与Kilian Foth的主张相反,我们的设计模式可以追溯到1970年代和1980年代。在Cobol中,有一种编码多文件匹配/合并的方法。有某种方法可以将代码添加事务添加到Cobol中的主(磁带)文件中。在Cobol中,有一种编码报告生成的方法。这就是为什么IBM的Report Writer在许多Cobol商店中从未真正受到关注。
DRY原理的早期应用。创建很多段落,以免重复。结构化编码技术是在1970年代开发的,Cobol在1985年向该语言添加了结构化单词(动词)。
通常,当我们编写新的Cobol程序时,我们复制了旧的Cobol程序并更改了名称以保护无辜者。我们几乎从未用一张空白纸或一张空白屏幕编写Cobol程序的代码。当您可以复制和粘贴整个程序时,这是一个很大的设计模式。
Cobol设计模式如此之多,以至于Cobol程序员花了数年时间才能学习所有这些模式。这就是当今Cobol程序员在很大程度上仍使用1985语法的原因之一。
在您所谈论的时代,软件中的“设计模式”并不存在,因为该概念尚未被发明出来。这不是我被人轻描淡写-的确是原因。被称为可识别的名称是使设计模式成为“设计模式”的原因,而不仅仅是使您一直以一种或另一种形式使用的代码(例如,“工厂”而不是“我喜欢使用的静态类而不是各种各样的构造函数”),概念本身也不例外。
就是说,当然有些事情在实践者的工作中扮演的角色与现在的设计模式完全一样。但是听到这些消息会让您失望:那些日子里典型的“大师的把戏”对我们来说现在很无聊-例如单链接列表,由每次迭代增加的索引控制的循环,聪明的“访问器” ”的方法似乎什么也没做,只是让您在稍后改变实现细节时改变了主意。
没错,我们现在认为理所当然的东西-有时甚至是我们使用的语言的一部分-曾经是高级的概念(有时是受到嫉妒的保护),只有经验丰富的编码人员才能知道。您今天在基本编程课程中几乎学到的几乎所有琐碎的事情都经历了一个阶段,在这个阶段中,道德上等效于该年龄的从业人员的“设计模式”。软件构建可能还不是严格的工程学科,但是,如果您研究50年代和60年代的最新技术,就不能否认它自诞生以来已经取得了巨大进步。
以前的主要范例是结构化编程。除了UML,还有各种不同的图(流程图,数据流程图,结构图等)。开发主要是自上而下的,并且遵循功能分解的过程。基本思想之一是您的程序结构应类似于菱形:位于顶部的主模块,呈扇形扩展为高级控制模块,这些模块在较低级模块中调用例程。这些较低级的模块建立在较低级的模块上,所有这些模块(理论上)最终都集中在少数基本的I / O例程上。高层模块应该包含程序逻辑,低层模块则更多地关注数据完整性和错误处理。
在此期间引入的重要概念是信息隐藏,模块化和高内聚/低耦合。有关这些主题的一些开创性论文,请参阅Dave Parnas的作品。还可以查看拉里·康斯坦丁,汤姆·德马科和埃德·尤登的作品。
我想其中一个很大的概念(结构化编程本身除外)是传递一个句柄的概念-在OO中,您有一个对象,它包含状态和功能。回到OO之前,您将拥有大量独立功能,并且需要在它们之间的某个状态传递一个句柄-如果愿意,可以使用cookie。这为您提供了面向对象的原理,而实际上却没有面向对象。
您可以在旧的Win32代码中看到很多,您需要传递一个HANDLE,它是代表Windows内核中分配的某些状态的不透明类型。您可以自己传递一个指针,该指针指向您先前分配给该数据的函数的第一个参数的结构。
诸如“意大利面条式代码”和“单一出口点”之类的术语实际上是对那个时代的回溯。如今,我们称代码为我们不喜欢的“意大利面条式代码”,但这实际上是对与GOTO和JMP捆绑在一起(严重)的代码的引用。
(今天,我们遇到了“馄饨代码”,其中的代码就像一堆不相关,紧密包装的类,就像一盘馄饨。但是,一些面向对象的专家合理地问:“但是,OO到底不是要看起来像?”)
今天的“单一出口点”只是一个令人沮丧的重构障碍。我谈论过的许多开发人员甚至都没有听说过,并且在我解释它时都非常吃惊。但是在过去,这意味着不要突然跳出代码块而进入意大利面条式代码。跳至逻辑末尾,然后正常退出。
回溯我的记忆方式,我似乎还记得,将代码捆绑到过程中的想法是一个巨大的飞跃。您可以将过程打包为可互操作,可重用的模块的想法有点像编程的圣杯。
编辑:“自我修改代码”也是一种在原始毁灭战士上特别使用的模式。那是程序实际上将根据状态使用更快的指令覆盖其指令的地方。当我是一名在科学博物馆学习编程课程的大佬时,我的教练严厉警告我们:“不要编写自我修改的代码!”
编辑:但是,在互联网出现之前,单词传播的速度要慢得多。以前,实现算法和数据结构的想法要困难得多。今天,我一直在进行排序,甚至都不知道我在使用哪种排序。但是那时候您必须自己编写代码。我记得有一篇文章谈到编程挑战,而这些挑战过去通常要花几天的时间,而今天我们需要半小时或更短的时间才能解决。因此,真正有意义的“算法”和“数据结构”编程可能会比现在更多。