为什么在学习面向对象编程之前,我们必须学习过程编程[关闭]


10

我现在是一所IT大学的四年级学生,当我和我的教授谈论这个话题时,他拒绝了我的意见,并给了我很大的批评(在我的大学里,我们被教导C(ANSI)(在程序编程课-大学一年级(C ++之前)(第二年OOP班)及其他...

但是在我13岁那年,我的兄弟首先接受了Java的培训,而没有别的。现在,他几乎可以完成普通的二年级学生使用Java可以完成的所有工作。

对于您的专业人士,我想知道您为什么认为我们应该首先学习过程编程。


8
因为汇编器没有对象。

9
这就像为什么我们应该在学习如何使用计算器之前被教导要正确计算。

22
因为面向对象的设计存在缺陷。程序是对数据进行操作的行为的集合。对象经常引入不必要的复杂性。阅读“如何设计程序:编程和计算入门”。

8
正如其他人所说,“不要用OOP分散新程序员的注意力”:prog21.dadgum.com/93.html-基本上,OOP所获得的所有内容都在教导新程序员基础知识。您正在同时教他们两个非常困难的概念。
John Ripley

7
@juxstapose-说面向对象的编程会引入不必要的复杂性,就像说我们应该用一块钢雕刻汽车。只是我的观点。

Answers:


23

快速摘要:

  1. 因为在现实世界中,迟早必须使用过程代码。

  2. 因为过程语言可以像面向对象语言的扩展或介绍一样工作,而不是仅仅是一种替代。

  3. 答案的补充2.由于OOP比过程编程更复杂,因此首先学习过程编程更好。

  4. 因为在现实世界中,程序员与AKA一起使用并结合了多种解决问题的方法,所以它称为“多范式编程”,而不仅仅是一个范式。

  5. 大多数编程语言在某种程度上都是多范式的,即使他们的设计师或普通开发人员则相反。

  6. [NEW]因为可以将与程序性编程混为一谈的模块化程序设计应用于OOP,因此问题可以理解为“为什么在学习面向对象程序设计之前为什么必须学习模块化程序设计”

扩展的无聊说明:

第一点很清楚,不再赘述。

点2,类,继承,多态,接口,等等。

第三点,我在学习面向对象的Pascal之前就对过程式Pascal进行了编码,当我到达那里时,我说:“看,类就像小型的过程式程序…………你可以使它们彼此交谈,很酷!!! ”。

从普通C到C plus plus的人们也听到了同样的消息。

第4点,大多数时候,程序员结合了几种编程技术或范例或解决问题的方法。功能,过程,OOP,逻辑。

甚至Java“ Pure OO”也不像它所说的那样简单。

+1点表示“程序化编程”而不是“结构化编程”。或模块化编程。这些很重要。

值得一提的是,这些术语很多时候都被教导在一起并且可以互换使用,但并非如此。结构化编程包括许多概念,而不仅仅是使用过程,其中之一是使程序看起来不像“意大利面条式代码”。

今天,我阅读了一些看起来像“面向对象的意大利面条式代码”的“纯” OO程序,这意味着程序员使用了OOP,但是其代码却看起来一团糟。

很多时候,我可以阅读OO代码,并告诉程序员,因为OOP是清晰易懂的,所以在OOP之前就已经学习了结构化编程。

对于模块化编程,我已经看到了几个应用程序。在不使用模块的C ++和PHP中。*


18

我认为类推类似于数学。您需要首先学习一些基本概念(加法/减法...),然后继续学习更复杂的主题(代数/微积分)。过程程序非常线性,在学习语法时更容易掌握控制流。OOP可能被认为更复杂,它基于过程语言中使用的更简单的构造,但是更抽象并且更难以理解。从诸如C之类的语言入手,还可以使您更接近硬件,并使您处理内存分配和指针的问题,您确实需要理解这些问题,但实际上并没有在Java / C#之类的语言中使用它们。不论是第一还是第二,在学校中接触到它都有一些真正的价值。

FWIW,最终必将发生变化。当我开始上学时,我们在Pascal和PL / 1上学习。直到高级语言课程(我约会)之前,我们才开始使用C。直到研究生院,我才开始学习Java-它还没有被发明!


+

10
@Spacemoses-并非如此,摘要越抽象,讨论越容易,但是要掌握所讨论内容的现实就越困难。

同意,我现在明白你的意思。
ses011 2011年

12

面向对象的编程是以一种有组织的方式收集的程序片段。我认为您正在学习的教训是面向对象的方法有助于维护组织和可维护性。有很多程序员无法区分这种情况,他们会在程序化程度更高时声称他们的程序是面向对象的。


3
但是function + state = objects
Dan D.

4
面向对象通常会使维护工作变得更加困难,因为它会使代码库膨胀。基于Java的系统是维护的噩梦,因为在该社区中发现的OO纯度和设计模式不足。
2011年

1
如果那是您的立场,那么“在该社区中找到的设计模式”-听起来像是在“ Java社区”中的个人问题。
ses011 2011年

1
@Dan D:面向对象的作用远不止是在对象中组合功能和状态……
Marjan Venema

4
@Spacemoses:我对任何不接受KISS原则的开发社区都有疑问。最好的解决方案通常是最简单的解决方案。
比特币2011年

11

你不知道

我们首先使用Scheme 学习了函数式编程然后,我们开始进行程序化, 然后是 OOP,然后是声明式编程。信不信由你,尽管我已经知道编程,但我认为它实际上对于其他人也更加容易:因为FP 就像数学一样!所以您已经知道了基本知识。

我已经多次与自己辩论,最终得出结论,这实际上取决于您的老师对您的概念的教导程度。

没有一个答案,因为:

  • 从像C(甚至是汇编)之类的过程开始可能是一个不错的选择,因为您将学习计算机的工作原理

  • 从某种面向对象的Java开始可能是一个不错的选择,因为它相对容易学习并将OOP应用于现实生活,并且因为它教会了您有关“形成”的知识。

  • 从像Scheme这样的函数式编程开始可能是一个不错的选择,因为它教会了您更多抽象的思想(在函数而非变量方面),最终使您成为更好的程序员。

如果您的老师不能很好地教它,那么开始就没有关系。他们几乎都一样。


4
+1爆炸,我不敢相信我必须滚动浏览这么多糟糕的答案才能找到它!
jk。

实际上,我有一段时间无法使用数学函数,因为我首先学习了一些编码,而“是”而不是“做事”的函数概念令我感到困惑。:3
StarWeaver 2014年

6

语言可以是面向对象的,例如C ++,Java或C#。您可以从这些语言开始。但是关键是,即使使用这些OO语言,您也必须首先学习过程编程,然后再学习OOP。我认为,您对您的兄弟也是如此。


3
精确+1。每个OOP方法都是一个简短的程序程序。如果你不知道如何将小片(类型,字面值,变量,运算符相结合=的分配,iffor等)成更大片(方法),你怎能希望了解OOP。与大多数技能一样,非常聪明,有动力和/或可以使用一对一的指导可以使您同时学习多个相关主题。
David Harkness

3

至少使用C之类的语言进行的程序编程,将程序编程简化为一种非常简单的实践:算法和数据结构,并且在抽象级别上是介于人类可理解的源代码和汇编代码之间的一种令人满意的媒介。

通过这种方式,学生可以同时学习一点科学(算法,数据结构)和一点工程(源->对象->机器编译,冯-诺伊曼(可能是)体系结构)。

通过C ++ / obj-C进行的OOP引入了代码组织模式,这只是要学习的一件事。这可能会使学习上述概念更加困难。

通过Java(以及其他方法)进行的OOP通过抽象化硬件和环境而走得更远。现在,基础产品不是机器代码,而是某种中介,它不能揭示基础硬件的工作原理,但效果是它使学生可以专注于代码组织模式。

最后,我认为这是在学习硬件的工作方式或学习代码组织模式之间的权衡。至于哪个更重要,我真的不知道。现实世界至少需要某种程度的知识。

我猜想一个以低级过程编程开始的本科课程很可能会培养计算机科学家/计算机工程师,而一个以较高层次的概念开始的程序则会培养软件工程师/开发人员/程序员。


3

OOP对象的勇气由过程编程组成。

如果您不能进行for循环,请正确使用指针,声明类型和函数,您将无法为类编写接口,更不用说使内部做任何值得做的事情了。

无论如何,您实际上绝对不会在入门类中学习OOP,而只是语法-直接跳入OOP将使事情(一开始)比现在更加复杂。

OOP并不是为了声明形成类的语法,而是关于数据结构,设计模式,多态性,继承和组合。

要完成所有需要了解过程编程的事情,这是用C轻松完成的事情。无论如何,您都可以将通过C所学的大部分内容带入Java或C ++中,您可能不得不重新考虑一些在C,BUT中理所当然的事情...您必须先了解语法(在入门C中的位置),然后才能编写句子(必须编写用于定义接口的过程),然后才可以编写段落(必须知道数据结构),然后才知道一些设计模式(悲剧,喜剧,有缺陷的)英雄,他们如何互动;何时不使用它们),然后才能撰写完整的小说(完整的OOP系统)。

如果我是你,我会拿起以下的一些书籍:C语言Java编程语言设计模式四人帮,和模式孵化。如果我对C / C ++认真的话,我肯定会拿起The C Programming Language的副本。

如果您只是想一直使用Java(并以$的价格完成)id,请阅读一些有关Java设计模式的书籍,以及如何将Java与Apache和Tomcat Web服务器一起使用以及有关SQL数据库编程的书籍。Java在网络上踢了很多屁股,很抱歉,但是PHP已有无数安全漏洞的历史,这使Windows陷入了麻烦,无法阻止服务器植根或注入SQL数据库。

您还应该花时间学习SQL,Oracle MySQL Postgresql和MSSQL在语法方面有很多共同点,但是如果我不得不自己学习一个id则选择Postgresql只是因为它是BSD许可而不是GPL的(您应该进行比较)并对比GPL / BSD许可)


2

我不得不说,大多数用诸如Java之类的面向对象语言编写的代码实际上并不是面向对象的。要真正理解OO背后的思想是很困难的,因为据称大多数OO代码实际上都是程序性的。

但是,用Java编写过程代码并没有错。是的,进行OO有很多好处,但是我不想让初学者感到困惑。因此,在此基础上,我认为教Java没有错。不要指望真正的面向对象,但它可以工作。

但是,Java隐藏了许多有关计算机内部运行情况的底层细节。C公开地保留了更多这些内容。一个很好的例子是,学生应该在使用一种照顾自己的语言之前,先学习这些低级细节的工作原理。但是,您也可以提出一个理由,您应该忽略这些细节并在以后学习。


2

关于这个主题,已经有其他几个答案,但是我认为值得更明确地说明这一点。

即使您开始使用诸如Java之类的面向对象的语言来学习编程,也要在了解OO概念之前先学习过程编程技术。在教新的程序员Java时,您不必首先将它们引入对象和类,而应将它们引入语句和变量。到学生可以学习很多有关对象和类的知识时,他们至少已经具备了程序编程的基础知识。

因此,至少,您必须学习Java中的过程编程,然后学习Java中的面向对象编程。无论您是在程序编程上花费整整一年还是在程序设计课程的前几周,以及是否使用其他语言,都只是在争论细节。


0

对此过分直率,我认为这种势头主要来自希望过时的老程序员。

在不说其他任何事情之前,我绝对不会对年长的程序员产生任何争执,他们中的许多人都非常熟练。不幸的是,有时候那些不是,被洗劫一生,却从未真正真正擅长编程的人……当教授无法在“现实世界”中破解时,就成为了教授。(也不是所有教授...但是...很多)

OOP并不是编程的圣杯,程序编程也不是遗物。这是很好的知道至少有一些的都有,但我想的是什么最终被教作为过程编程一般的做法往往是时间和精力浪费巨大。我们需要在学术界学习编程,而不仅仅是一种风格。我将很多糟糕的代码和误解归因于此,包括我自己的。


2
我有位老师从89年开始使用C,但这是针对希望达到99年的微芯片。然后有其他老师使用“ c ++”,但没有STL或模板。可能还有带有函数指针的结构。
Ape-in​​ago

1
公平地说,STL和模板通常不是C ++入门主题。任何101层级编程课程的基本目标都是教导如何在给定语法的约束下创建结构合理的顺序,条件和迭代逻辑。所有其他语言功能都只是语法糖,它使人们可以对基本控制结构进行分组并将其绑定到数据。
比特币2011年

哎呀,两票。看到一个即将来临的= P对我来说很奇怪,因为这种意见最初来自一位年长的程序员,他帮助我从教学水平低下恢复过来。@Ape:我们的CS部门负责人试图在2004年XD上教我们COBOL一年(至少我对他的“教学”风格感到担心,我有点不介意,因为我可以从事一些销售点工作机器大声笑,但是凝视……是认真的吗?)
Garet Claborn

1
@ bit-twiddler-先生,很奇怪。在这种观点下,我不太依赖那种经验,但是我研究了其他地区。我真的很喜欢这两种编程风格,在我看来,他们应该一起教它们。我只是发现,甚至更年轻的教授对这个问题的狂热态度也不相同。海事组织这是一件好事。我知道有些人认为程序首先很重要。
Garet Claborn

1
@ bit-twiddler:是的,但这不是入门课程。这是数据库设计方面的第4年高级课程,我们应该使用c ++。在以前的课程中对C ++进行了如此高的体验之后,这感觉真不对。
Ape-in​​ago

0

我的两个原因:一种面向对象编程来解决过程编程问题。因此,通过编写一些过程编码,然后在OO中进行相同的编写,可以更轻松地理解它们之间的区别。

这里还有一个附加元素:两种编程主题教育方法。一个可以从最低开始(示例装配,在许多地方是程序性的,其他一些从电路开始),然后又向上(朝OO /功能/可管理)。另一种方法是从物理世界(例如浏览器/ Windows 7等)开始,然后再深入。每种方法都各有利弊。您的大学选择了第一所,并从程序开始。可能有一些理由,或者他们只是抄袭了其他人:-)。


1
“ OO编程来解决过程编程问题。” 那是目标,但是OO创造了许多解决的问题。
2011年

@ bit-twiddler:非常重要的故事。专注于(或缩小其范围)在教学方面,这是一个案例:我们拥有什么,如何使它变得更好:(您争论是否更好)
Dimitrios Mistriotis

0

除了制度上的惯性之外,没有其他理由。看一下CMU,他们放弃了整个OOP课程,并用功能编程代替了它。因此,您的问题的答案再次是,这是您所上的任何学校的管理者都可以选择的。如果有人想知道我在这里所做的事实陈述,那就是一位教授/管理员关于在CMU更改课程的帖子:向新生教授FP


1
-1具有误导性-虽然我确实看到一个线程(通过Google搜索)声称CMU从其第一年的 CS课程中删除了OOP 并将其替换为功能编程,但官方的CMU课程始于Alice编程语言,该语言是-面向[请参阅enr-apps.as.cmu.edu/assets/SOC/CS_SPRING.htm]
史蒂文·A·洛

1
@ davidk01:(1)答案中的事实断言不正确。(2)来自alice.org的“ Alice是一种免费的教学工具,旨在使学生第一次接触到面向对象的编程
Steven A. Lowe

2
@Steven A. Lowe:直言不讳:“面向对象的编程从入门课程中就被完全淘汰了,因为它的本质是反模块化和反并行的,因此不适合现代CS课程。在二年级时将为那些希望学习该主题的学生提供一门有关面向对象设计方法论的新课程。” - 向新生教授FP
davidk01,2011年

1
@ davidk01:很棒的链接,谢谢。从该文章中引用的委员会论文“尽管面向对象的编程(以多种形式)仍然是工业软件开发中的主要主题,但在入门级使用诸如Java之类的面向对象的语言会带来相当大的复杂性并分散注意力从入门级的核心目标来看。似乎更可取的是,在以后的课程中全面介绍OO设计和实现方法,以便在入门级上更加专注于基础知识。” [强调我的] ...
史蒂文·A·洛

1
@ davidk01:我很高兴同意不同意。如果愿意,可以称呼我为学徒,但对我而言,更改入门级重点和“放弃他们的整个OOP课程”之间存在很大的区别。我几乎不认为减少入门班的范围是“彻底的改变” ;-)
史蒂芬·A·洛
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.