这些编程范例之间有什么区别,它们是否更适合于特定问题,还是任何用例都比其他用例更受青睐?
欣赏建筑实例!
这些编程范例之间有什么区别,它们是否更适合于特定问题,还是任何用例都比其他用例更受青睐?
欣赏建筑实例!
Answers:
他们每个人都有自己的优点-它们只是解决相同问题的不同方法。
在纯粹的过程样式中,数据往往与对其上运行的功能高度去耦。
在面向对象的样式中,数据倾向于带有一系列功能。
在功能样式中,数据和功能趋向于彼此之间有更多的共同点(如Lisp和Scheme),同时在实际使用功能方面提供了更大的灵活性。还倾向于根据递归和组合而不是循环和迭代来定义算法。
当然,语言本身只会影响首选哪种样式。即使使用像Haskell这样的纯函数式语言,也可以以过程样式(尽管不鼓励这样做)编写,甚至可以使用像C这样的过程语言,以面向对象的样式(例如GTK +和EFL API)。
需要明确的是,每个范例的“优势”仅在于算法和数据结构的建模。例如,如果您的算法涉及列表和树,那么功能性算法可能是最明智的。或者,例如,如果您的数据是高度结构化的,则如果这是您语言的本机范式,则将其组合为对象可能更有意义-或者,可以将其作为monad的功能抽象一样容易地编写,是Haskell或ML之类的语言的原生范例。
您选择使用哪种方法,对您的项目和语言支持的抽象才更有意义。
我认为这些天可用的库,工具,示例和社区完全取代了范例。例如,ML(或其他任何语言)可能是最终的通用编程语言,但是如果您无法为正在做的事情获得任何好的库,那么您就搞砸了。
例如,如果您要制作视频游戏,那么C ++中会有更多优秀的代码示例和SDK,因此您可能会更好。对于小型Web应用程序,有一些很棒的Python,PHP和Ruby框架可以使您快速启动并运行。由于编译时检查以及企业库和平台,Java是大型项目的理想选择。
过去的情况是,用于不同语言的标准库很小并且易于复制-C,C ++,Assembler,ML,LISP等。这些库具有基础知识,但是当涉及到事物标准化时,往往会遇到麻烦像网络通讯,加密,图形,数据文件格式(包括XML),甚至基本的数据结构(如平衡树和哈希表)都被忽略了!
如今,Python,PHP,Ruby和Java等现代语言都提供了更为完善的标准库,并且您可以轻松使用许多优秀的第三方库,这在很大程度上要归功于它们采用了命名空间来防止库相互冲突,和垃圾回收,以标准化库的内存管理方案。
这些范例不必相互排斥。如果您看一下python,它支持函数和类,但是同时,所有内容都是一个对象,包括函数。您可以在一个代码中混合并匹配功能/ oop /过程式样式。
我的意思是,在函数式语言中(至少在Haskell中,是我学习的唯一语言),没有任何语句!函数内部只能有一个表达式!!但是,函数是一等公民,您可以将它们作为参数以及一系列其他功能来传递。他们可以用几行代码来完成功能强大的事情。
在像C这样的过程语言中,传递函数的唯一方法是使用函数指针,仅此一项并不能启用许多强大的任务。
在python中,函数是一等公民,但它可以包含任意数量的语句。因此,您可以有一个包含过程代码的函数,但是可以像函数语言一样传递它。
OOP也是如此。像Java这样的语言不允许您在类之外编写过程/函数。传递函数的唯一方法是将其包装在实现该函数的对象中,然后传递该对象。
在Python中,您没有此限制。
对于GUI,我会说面向对象的范式非常适合。窗口是对象,文本框是对象,“确定按钮”也是一个。另一方面,诸如字符串处理之类的东西可以用更少的开销来完成,因此可以通过简单的程序范式来更加直接。
我也不认为这不是语言问题。您可以用几乎任何流行的语言编写功能,过程或面向对象的语言,尽管在某些情况下可能需要付出额外的努力。
我的一位朋友正在使用NVIDIA CUDA编写图形应用程序。应用程序非常适合OOP范例,并且可以将问题整齐地分解为模块。但是,要使用CUDA,您需要使用C,它不支持继承。因此,您需要变得聪明。
a)您设计了一个可以在一定程度上模拟继承的巧妙系统。可以办到!
i)您可以使用一个钩子系统,该系统希望父P的每个子C都具有对函数F的特定替代。您可以使子注册其替代,该替代将在需要时存储并调用。
ii)您可以使用结构内存对齐功能将孩子投给父母。
这可能很整洁,但是要想出一种面向未来的可靠解决方案并不容易。您将花费大量时间来设计系统,并且不能保证在项目进行到一半时就不会遇到问题。即使不是几乎不可能,实现多重继承也更加困难。
b)您可以使用一致的命名策略,并使用分而治之的方法来创建程序。它没有任何继承,但是因为您的函数很小,易于理解并且格式一致,所以您不需要它。您需要编写的代码量增加了,很难集中精力并且不屈从于简单的解决方案(黑客)。但是,这种忍者编码方式是C编码方式。在低级自由和编写好的代码之间保持平衡。实现此目的的好方法是使用功能语言编写原型。例如,Haskell非常适合原型算法。
我倾向于方法b。我使用方法a编写了一个可能的解决方案,老实说,使用该代码感觉非常不自然。