通用编程,在工业中使用的频率


11

目前,我在学术环境中进行编程,因此我可以使用任何我想使用的东西。我在使用Boost图形库做一些事情,并且想知道是否值得花更多的精力来更深入地了解GP。

我很好奇-通用编程(GP)在行业中使用率很高吗?我的猜测是,大多数程序员更喜欢OOP或使用不强调或不支持GP的语言,因此,除了在C ++中调用STL数据结构/函数外,我的印象是GP并不是经常使用在实践中。但是,由于目前不在行业内,因此很高兴听到从业者的来信。

(在撰写本文时,我看到通用编程甚至不是有效的标签!)


作为统计依据,StackOverflow上的标记分布可能比此处的标记更为有用。见stackoverflow.com/questions/tagged/generic-programmingstackoverflow.com/questions/tagged/generics
彼得Török

Answers:


7

我很好奇-通用编程(GP)在行业中使用率很高吗?

实际上,它很大程度上取决于团队和项目的环境。

例如,在视频游戏中,代码通常是“最简单”的(甚至有时过于简单),但在大型体系结构中。这是因为游戏开发人员有很多问题需要解决,并且不想打扰元编程(这是一种单独的非常抽象并且很难在C ++中使用的语言)。

同时,即使在那些商店中,模板的基本用法也很常见,您可以在某些引擎的某些非常特定的功能中看到一些基于模板的优化。

但是在游戏开发人员中,大多数人只会避免执行任何元编程。

现在,另一方面,由于不常见的性能和灵活性(在编译时)要求,某些不常见的真正复杂或繁重的处理应用程序需要某种繁重的元编程。我现在正在合力工作。

它并不常见,但它确实存在,并且某些利基领域(在某些科学或数字运算的嵌入式环境中)确实要求人们对元编程了解很多或希望学习。

在中间,大多数人只会将元编程用作“客户端”,而不是“设计师”。大多数元编程代码都捆绑在库中,因为库是用于代码的工具,还有什么比可以适应您迄今为止使用的自定义类型的库更好的呢?

Boost(http://boost.org)是一组库,其中一些库是由繁重的元编程黑魔法构成的,并且在许多C ++商店中都使用“ STL ++”作为STL的扩展(并且是)。并非每家商店都使用它是出于多种原因,例如编译器兼容性(某些Boost库可以使您的编译器在每次伤害您的感觉时都表示原谅...),而更多的时候是因为某些开发人员不喜欢无法理解工具在内部的工作方式(尝试了解Boost.Spirit ...)

无论您要工作的公司是什么,有些公司都会使用这种范例,有些公司会或多或少或什至禁止它们。

没有共识,因为没有人拥有相同的需求,背景或团队。

但是,显然,它仍然被使用。也许请问谁在他们的邮件列表上使用了boost来获取更多真实示例?


1
客户与设计师+1。以我的经验,很少有开发人员了解他们的实现,除非在可维护性方面进行了很大的改进,否则在应用程序中创建新的通用代码是没有意义的。为广泛复用而设计的库在这种情况下的出现频率要比单个应用程序高得多。
Karl Bielefeldt

感谢您的详细回答。我自己是Boost的粉丝,并考虑是否要深入研究BGL,这比其他Boost库需要更多的GP知识。您对游戏开发界的评论很有趣。我对现代游戏的发展壮举感到惊讶,很有趣的是,它们可能与较新的编程方法隔离开来,而不是位于最前沿。
bd1

好吧,游戏开发人员仅通过构建游戏概念就可以管理高级别的复杂性。添加元指令只会使一切复杂化,因此必须要有充分的理由。另一件事是,许多游戏开发人员都在具有非常特定的硬件的控制台上工作,并且具有非常特定的编译器,这些编译器不允许boost尝试做的所有事情(例如,无例外或无多重继承,或者从doc的文档无法正常工作编译器(真实故事))。因此,有充分的理由。
Klaim

5

我很好奇-通用编程(GP)在行业中使用率很高吗?

泛型编程在学术上通常被称为参数多态性。在我公司,我们主要使用它来建立类型独立的数据编辑器,而不论其类型如何。您只是不像其他功能那样经常使用它,但这绝对是我不想错过的功能。当行为适合大量类型时,可以使用它。很明显,当您发现自己多次针对不同类型编写相同的代码时,就需要泛型。

我的猜测是,大多数程序员更喜欢OOP或使用不强调或不支持GP的语言,因此,除了在C ++中调用STL数据结构/函数外,我的印象是GP并不是经常使用在实践中。

至少从我的经验来看,您的观点是错误的。OOP和通用编程不是互斥的。实际上,您应该结合使用它们的协同作用。就像我之前说过的那样,您看不到它出现的频率与其他技术一样高是因为您不需要那么频繁。但这是一个强大的功能,可以极大地帮助您保持代码DRY的状态。哪种语言没有真正强调GP在高级编程中的支持?Tiobe Top 5的5种语言中的3种支持泛型/模板。而且PHP是动态类型的,因此实际上并不需要它们。所以呢?


我的意思并不是说OOP和GP是一个“或/或一个选择”。但是,我见过的许多项目似乎严格来说都是Java的OOP。我认为Java的最新版本支持GP,但是到底有多少Java程序员真正使用了该功能?正如我所说,我不是从事行业工作,而且我的观点可能会歪斜,这就是为什么我问这个问题。
bd1

@ bd1:在Java支持的泛型之前或在特定工具集支持该Java版本之前编写的较旧的应用程序将没有泛型,并且开发人员可能会继续避免对该特定项目使用泛型,以保持代码一致。我已经看到了,它随项目和开发人员而变化。我所见过的任何在广泛支持Java泛型之后启动的项目都倾向于在适当的时候经常使用它们。
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner:Java中的泛型与C ++模板完全不同。Java泛型是100%纯的语法糖,不支持元编程。
凯文·克莱恩

“ OOP和通用编程不是互斥的。”:实际上,它们都是多态的形式,分别是即席多态和参数多态。因此,它们是用于不同种类多态性的两个不同工具。
Giorgio

4

C ++模板广泛用于与容器不同的东西-至少在我的问题领域(定量财务)中。我什至敢说它有时经常使用,目的是使用普通的旧虚拟函数就足够了(不会大大增加编译时间)。

人们使用它来避免代码重复并实现编译时多态(无需虚拟调度)。

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.