这些编程范例之间的区别是什么,它们是否更适合于特定的问题,或者任何用例比其他用例更倾向于一个?
建筑实例不胜感激!
- 这不是一个完整的答案,但我写了一些关于"功能性"如何影响/对比"OO"风格的文章(在f_的上下文中):lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!511.输入‌&8203;ry
- 你可以考虑读这个!有很多例子可以说明何时使用哪一种蚂蚁,主要的区别是什么,优缺点等等。
- 另请参见:-过程编程和函数编程有什么区别?-有人能给我举一些函数式编程和命令式/程序式编程的例子吗?-真正理解程序和功能之间的区别
- 另请参见:stackoverflow.com/questions/1530868
所有这些问题都有各自的优点——它们只是解决相同问题的不同方法。
在纯过程风格中,数据往往与操作它的函数高度分离。
在面向对象的样式中,数据往往带有一组函数。
在函数样式中,数据和函数倾向于彼此拥有更多的共同点(如Lisp和Scheme),同时在函数的实际使用方式方面提供更多的灵活性。算法也倾向于用递归和组合来定义,而不是用循环和迭代来定义。
当然,语言本身只影响哪种风格更受欢迎。即使在像haskell这样的纯函数语言中,您也可以用过程样式(尽管这是非常不鼓励的),甚至在C这样的过程语言中,您也可以用面向对象的样式(例如在GTK+和EFL API中)编程。
清楚地说,每个范例的"优势"仅仅在于对算法和数据结构的建模。例如,如果您的算法涉及列表和树,那么函数算法可能是最明智的。或者,例如,如果您的数据是高度结构化的,将其作为对象组合可能更有意义,如果这是您的语言的本机范式——或者,它可以像Monads的功能抽象一样容易编写,Monads是Haskell或ML等语言的本机范式。
您所使用的选项对于您的项目和您的语言支持的抽象更为合理。
- 你所说的,似乎并不反映你所写的。你说他们没有"利弊",然后说他们是如何不同的方法。为什么有人会根据任何给定的情况选择一种方法而不是另一种方法?优点和缺点,优缺点,不管你叫它们什么,它们确实存在!我不是说一个人天生就更好,你也没有。我相信这就是你真正想说的。除非你真的相信任何选择的方法都没有积极和消极,相对于另一种方法。
- @Techzilla:我同意我的措辞不好,但我的意思是,没有一个真正的功能列表可以让你指出语言x比y更好,而不需要限定语言x更适合编写算法u,语言y可能更适合编写算法v,而这两个功能都可以很容易地在局域网中实现。标尺。
- 程序性和功能性之间的区别我并不清楚。我在大学里学习Scheme/Rackett,但是我真的看不出它和过程C或PHP之间有什么区别,你能举个例子吗?
- @Leonel:大多数人会提到的最大区别是,在过程语言中,您可能会使用for循环,但是函数语言没有这样的功能——相反,您使用对函数的递归调用来执行相同的任务。函数语言也使函数成为第一类对象——你可以像传递数字一样传递它们——但是你不能在C语言中这样做(而且PHP对它的支持也被破坏了)。
- 如果可以,如果可以列出一些优点,一种方法比另一种方法更好。
- @塔斯特罗:那完全是个错误的问题。从本质上来说,没有什么"优势"。每种语言范式只提供了一组不同的抽象。
- @好的,让我换个说法:什么时候一个更好,什么时候另一个更好?
- @塔斯特罗:当一种模式比另一种模式更有意义时。就这些。有时将代码建模为函数的组合更有意义,有时将数据建模为对象更有意义。有很多方法可以表达算法和数据结构。OOP和功能正好是其中的两个。
- @Techzilla,请理解,这一解释非常透彻,为您提供了不同范例之间的真实定义。了解优缺点取决于开发人员/程序员、预期用途、语言等。我建议如果您正在寻找优缺点,请采用这些定义并在任务中对其进行评估,然后将结果分析为优缺点。
- 据我所知,我反对把"利弊"或"各行其是"这句话当作不连贯的垃圾。从字面意义上讲,这些编程方法只是不同的范例。我会修改我的答案,以消除令人反感的语言,除了人们似乎坚持这种胡说八道。
我认为现在可用的库、工具、示例和社区完全胜过这种模式。例如,ML(或其他任何语言)可能是最终的通用编程语言,但是如果你不能为你正在做的事情找到任何好的库,你就完蛋了。
例如,如果你正在制作一个视频游戏,在C++中有更多的好的代码示例和SDK,所以你可能会更好。对于一个小型的Web应用程序,有一些很棒的python、php和ruby框架可以让您很快离开并运行起来。Java是大型项目的一个很好的选择,因为编译时检查和企业库和平台。
过去的情况是,不同语言的标准库很小,很容易复制——C、C++、汇编程序、ML、LISP等等。虽然有一些基础知识,但当涉及到网络通信、加密、图形、数据文件格式(包括XML)等方面的标准化时,往往会被排除在外,甚至像平衡树和哈希表这样的基本数据结构也被排除在外!
像Python、PHP、Ruby和Java这样的现代语言现在有了一个更为体面的标准库,并有许多很好的第三方库,您可以很容易地使用它们,这很大程度上得益于它们采用了名称空间来防止库相互冲突,以及垃圾收集来规范库的内存管理方案。
- Python,红宝石,…没有C或Lisp这样的"标准"库,因为它们是单一的实现语言。guido说的是python,没有标准。现在,任何特定的C或Lisp(或其他)实现都会附带一组超出标准的库。
- 问题在于面向对象编程、函数编程和过程编程之间的差异。虽然这些答案中提到的语言确实适合这些方法中的一种,但是答案没有提到这些概念中的任何一个…不管"可用的库[…][特朗普]范式"是否存在,这都不能回答手头的问题,从而回避了什么是完全有效的问题。
- ircmaxell的相关文章:blog.ircmaxell.com/2012/07/oop-vs-procedural-code.html
这些范例不必互相排斥。如果您看一下python,它支持函数和类,但同时,一切都是一个对象,包括函数。您可以在一段代码中混合和匹配功能/oop/procedural样式。
我的意思是,在功能语言中(至少在Haskell,我唯一研究过的语言),没有语句!函数中只允许有一个表达式!!但是,函数是一流的公民,你可以把它们作为参数传递给其他一些能力。他们可以用几行代码做一些功能强大的事情。
虽然在C这样的过程语言中,传递函数的唯一方法是使用函数指针,而仅此一种方法并不能实现许多强大的任务。
在Python中,函数是第一类公民,但它可以包含任意数量的语句。所以您可以有一个包含过程代码的函数,但是您可以像函数语言一样传递它。
OOP也是如此。像Java这样的语言不允许您在类之外编写过程/函数。传递函数的唯一方法是将其包装在实现该函数的对象中,然后传递该对象。
在Python中,您没有这个限制。
- 我相信你的意思是"这些范例不必互相排斥"。它们中的3个是正交的,理想情况下您可以在单个程序中使用其中的1个、2个或3个(如果您的语言允许)。
- 是的,我想互斥是更好的说法!谢谢
对于GUI,我认为面向对象的范式非常适合。窗口是一个对象,文本框是对象,OK按钮也是对象。另一方面,像字符串处理这样的工作可以用更少的开销完成,因此使用简单的过程范式更简单。
我认为这也不是语言问题。您可以用几乎任何流行的语言编写功能性、过程性或面向对象的语言,尽管在某些语言中可能需要做一些额外的工作。
- 试图对"object=gui widget"这一误解进行否决,但我还是要克制一下。OOP同样适用于表示抽象概念,如"useraccount"或"pendingsale",也适用于"window"和"button"等可见界面元素。
- 我写过窗户可以是一个物体。你如何得出每个物体都是一个窗口的结论?这只是一个例子。当然,OOP也可以用来建模抽象实体及其关系。不管怎样,谢谢你没有投反对票。不管怎样,我也没有多少分:D
- - 1。OOP与GUI没有任何关系。理想情况下,设计GUI的最佳方法是使用外部文本文件(例如HTML)。虽然字符串处理实际上对对象做得更好。(想想C中的字符串)!!
- 我不知道,也许我只是习惯用对象编程来实现它。但是,当文本框Y的值在不使用对象的情况下被更改时,您将如何进行一些交互操作,例如更改文本框X中的值?好吧,你可以简单地使用全局变量…
- 字符串在Perl和PHP中也可以很容易地处理,而不需要使用OOP。但好吧,我可能没有选择最好的例子。我想说的是,不同的模式对于不同的任务是有用的。
- 字符串处理在Perl(100X比爪哇、C++或C语言)好得多,但是语言的字符串功能绝对不是面向对象的。C的字符串处理很糟糕,但C不是唯一的过程语言(也不是最好的)。
- +1代表"你可以用几乎任何流行的语言写功能性的、程序性的或面向对象的,尽管这可能是一些额外的工作。"不过,我不一定同意剩下的答案。
- 你几乎可以用任何语言以函数式的方式写作,但是我很难理解如何在大多数语言中完成标准的日常功能工作。它只是为了在命令式代码中获得函数。
- >"但是,如果文本框Y的值在不使用对象的情况下发生了更改,您将如何执行一些交互式操作,如更改文本框X中的值?"把它们都当作溪流。从x发出一系列更改事件,应用一些转换,pipe到y:xEvents.map(someTransform).pipe(y)
为了回答您的问题,我们需要两个要素:
了解不同建筑风格/模式的特征。
了解不同编程范例的特点。
软件架构风格/模式列表显示在维基百科的软件架构文章中。你可以在网上很容易地研究它们。
简而言之,过程对于遵循过程的模型很好,OOP对于设计很好,而功能对于高级编程很好。
我认为你应该试着阅读每一个范例的历史,看看为什么人们创造了它,你可以很容易地理解它们。
在理解了这两者之后,您可以将体系结构样式/模式的项目链接到编程范例。
我认为它们通常不是"对"的,但是你可以把它们结合起来。我也认为,通常,你提到的词只是流行语。很少有人真正知道"面向对象"是什么意思,即使他们是其中最凶猛的布道者。
我的一个朋友正在使用Nvidia Cuda编写一个图形应用程序。应用程序非常适合OOP范式,并且可以将问题整齐地分解为模块。但是,要使用CUDA,需要使用C,这不支持继承。因此,你需要聪明。
a)你设计了一个聪明的系统,在一定程度上模拟继承。这是可以做到的!
i)您可以使用一个钩子系统,它期望父级p的每个子级c对函数f都有一个特定的覆盖。您可以使子级注册它们的覆盖,这些覆盖将在需要时被存储和调用。
ii)可以使用结构内存对齐功能将子对象强制转换为父对象。
这可以是整洁的,但它不容易想出未来证明,可靠的解决方案。您将花费大量时间设计系统,并且无法保证在项目的中途不会遇到问题。实现多重继承甚至更加困难,如果不是几乎不可能的话。
b)您可以使用一致的命名策略,并使用分而治之的方法来创建程序。它不会有任何继承,但由于您的函数很小、易于理解和格式一致,所以您不需要它。您需要编写的代码数量不断增加,很难集中精力,而且不屈服于简单的解决方案(黑客)。然而,这种忍者的编码方式是C编码方式。在低级自由和编写好代码之间保持平衡。实现这一点的好方法是使用函数语言编写原型。例如,Haskell非常适合于原型算法。
我倾向于使用方法B。我使用方法A编写了一个可能的解决方案,而且老实说,使用该代码感觉非常不自然。
- 第一个C++ COMPELVER只不过是生成C代码的预处理器。因此,C++的所有特性(包括多重继承)都可以使用C来实现(在C中仿真C++异常处理将需要某种平台支持异常,但是C++实现也需要这样,所以我不认为它会使基本思想无效)。
- @克里斯·贝克,你的回答太哲学了。首先,C有多个标准(多年来),几乎没有一个完全被C编译器所采用,更不用说C++了。要说C++是C的一个超集,因为它使用C语法并不重要,因为你甚至不能编写一个C编译器的代码,它编译在另一个C编译器中而不需要很大的努力。此外,还有其他语言提供的语言特性(类型系统、OOD支持),如果不使用C来设计新语言,就无法在C中实现(这正是存在"新语言"的原因)
- 你知道的。我再也看不出我的评论与这篇文章有什么关联了。P
- CUDA支持C++已经有一段时间了。