我使用了大量的元编程来避免重复的任务并建立更安全使用的抽象。我的同事们,因为他们不理解它。

我总是尽力利用这种语言的全部潜能,但是我的一些(并非全部)同事认为这是一种风险(有些人欢迎这种方法)。

我同意编写团队中其他人无法理解的代码是一个问题。另一方面,我们都是专业的C ++开发人员,我认为我们应该追求更高的标准,而不是使用类编写C。

我的问题是,谁是对的,我应该怎么做? >
说明:
试图充分利用语言的全部潜能,并不意味着我在所有问题上都投入了TMP。 C ++是一个工具箱,对我而言,C ++熟练程度是指能够使用包装箱中的所有工具,以及为特定工作选择合适的工具。

评论

最终这是基于意见的。就我个人而言,我的原则是不要使用过于复杂以至于它们偶然被图灵完成的功能-例如C ++模板元编程。

@KilianFoth模板不是“偶然地”图灵完成的。它们始终被用作强大的抽象工具

没有人能理解的代码不是更高的标准。

@Caleth Herb Sutter确实称他们为图灵完全。当然,它们本来是强大的抽象功能,但我不认为它们打算像图灵完整性那样允许作为不可思议的不确定结构。当然,它们的语法并不是为了使这种元编程变得不透明而没有必要。

错误的二分法。您可以按照“更高的标准”进行编程,并用类将C留在后面,使用现代C ++,使用模板(例如STL)以及const,no()强制转换,无指针算术,值语义,很多优点,而无需标题ibnto TMP。如果您看不到C-with-class和TMP之间的日光,那么您做错了。

#1 楼

元编程可以。您要尝试执行的操作不正确。

我在工作中一直使用元编程。它是一个功能强大的工具,可用于以更具可读性和可维护性的方式完成许多事情。它也是那里较难理解的编程风格之一,因此它确实需要保留。当我可以将1000行代码减少到50行时,我很喜欢它,但是我尝试将其限制为这样。 />另一方面,我们都是C ++专业开发人员,我认为我们应该追求更高的标准,而不是使用类编写C。


这是您遇到麻烦的地方。你有意见认为元编程很好是很好的。认为我们都应该渴望成为更好的C ++开发人员是很好的选择。意见。那是你老板的工作。您的老板应该是确保您的代码从长远来看可维护的人。他们(希望)有更多的商务经验,因为当我说这是商业决定而不是意识形态决定时,请相信我。想教别人元程序很好。但是要知道,其他人也可以选择不学习元程序,这也是可以的,除非您处于有能力的位置。 (而且,作为行业机密:当您最终成为首席开发人员时,如果拥有权力,您根本就不会拥有权力。有人控制着掌权的人是谁。)

如果要鼓励他们对元编程没问题,请从小处入手。从单个enable_if开始,它使API易于阅读。然后从中注释日光。然后可能发现一种情况,其中模板元函数将10个大型重复类转换为1个带有10个小助手的类。对此发表评论。得到反馈。找到人们对此的看法。如果他们告诉您不要这样做,那就没事了。找到一个利基元,元编程会如此彻底地保留自己的地位,以至于您的所有同事(勉强地)都同意这是完成这项工作的正确工具。元编程。当其他方法无法遥不可及时,它确实满足了我们当时的需求。它实际上改变了我正在编写的应用程序的方向。但是它是元编程。我整个公司中只有一个或两个其他人可以阅读它。他没有利用元编程来精确地完成所需的工作,而是与领导层一起放松了对问题的限制,从而不需要元编程。也许更准确地说,不需要元编程。他能够将其限制在元编程最适合的范围内。范围更广的开发人员可以维护新代码。我为元编程铺平道路而感到自豪,但这是我的同事的代码将覆盖更广泛的受众,这有充分的理由。

评论


用其他样式,技术,技术,库替换“元编程”,答案仍然是不错的!

– Andrejs
18年3月3日在21:55

您的老板应该是确保您的代码从长远来看可维护的人。大多数老板甚至都不知道什么是代码可维护性。他们几乎没有任何技术知识,因此我不会相信他们具有政治特征的决定。

–t3chb0t
18-3-4在11:27



@ t3chb0t:经验丰富的老板知道应该在客户服务上花费多少钱(即错误修复和新功能),以及如何最大程度地降低成本。为此,可维护性是最强大的工具。那位老板可能不知道技术细节,但应该能够组建一支值得信任的团队。

–mouviciel
18 Mar 4 '18 at 12:22

@DDrmmr我确实为那些认为程序员应该使用元编程来提高标准的人定下了基调。我不认为它应该被愚弄到技能最差的团队成员可以维护的地方。它应该被愚弄到团队可以维护的地方,甚至更强大,应该被愚弄到团队可以在没有您维护的地方。否则,有人在写自己的工作。

–Cort Ammon
18年3月4日在15:00

@Joshua我发现,不存在诸如“不需要维护的代码”之类的东西。

–Cort Ammon
18 Mar 5 '18 at 0:18

#2 楼

首先,这是团队的问题,您必须与团队一起解决。如果您从团队那里获得备份,可以使用某些元素和构造进行编程,请执行此操作;如果不是,请与他们讨论,如果您无法说服他们并提出充分的理由说明“您的方法”显然更好,那么最好不使用它。

请注意,使用模板元C ++中的编程始终是一个权衡:当然,它有时可以帮助设计应用程序的某些部分以更干燥的方式进行,并且绝对有助于创建高效且可重复使用的库。另一方面,这些好处需要付出一定的代价:代码变得更加抽象,通常更难阅读,更难以调试,更难以维护。这使得元编程在应用程序编程中的有用性经常令人怀疑。因此,假设您不打算创建下一个STL,则每次您尝试使用元编程时,都要问问自己这些缺点是否真的值得。而且,如果不确定,请在代码审阅时与同行审阅者讨论。

评论


我同意,但先将其与质量检查部门讨论,然后再将其放入代码中。创建将被拒绝的东西毫无意义。

–shawnhcorey
18年3月3日在12:12

怎么样:“我同意。但是...”将其更改为“至”将完全改变含义。在花费时间之前,应该总是与质量保证讨论一些不寻常的事情。您说过,讨论应该在花时间之后在代码审查中进行。

–shawnhcorey
18 Mar 3 '18 at 16:08

@shawnhcorey:正是我的意思,QA角色在不同组织中差异很大。在许多组织中,质量检查人员不懂编程,因此他们可能不是讨论此类话题的合适人选。

–布朗博士
18 Mar 5 '18 at 13:11

@shawnhcorey:好吧,一方面您写了“ QA是一个通用术语”,另一方面,您在心中有着非常具体的QA角色和责任-听起来与我有点矛盾。

–布朗博士
18 Mar 5 '18 at 13:44

我从未遇到过对编程一无所知的质量检查人员。

–尼克·基利(Nick Keighley)
18年3月7日在9:21

#3 楼

我的一般意见:如果可以选择,通常可以在以下三个选项之间进行选择:


手动重复键入许多非平凡的代码结构;模板元编程以自动执行代码生成;
使用其他一些代码生成机制,例如宏或某些其他编程语言来生成C ++源文件。
这三个选项中最具可读性和可维护性。如果我在您的位置,这就是我要向团队提出的论据。使用实际代码的示例将有助于说服他们。 TMP代码,可以轻松编写正确的客户端代码。这是C ++标准库的设计。

我不认为我们能在没有看到您要编写的代码类型示例的情况下判断谁对谁错。 >

评论


您也可以使用copy + paste来代替手动输入;-)

–PaŭloEbermann
18 Mar 4 '18 at 19:20

@PaŭloEbermann:哎呀!

–约书亚
18 Mar 4 '18 at 23:10

@PaŭloEbermann我去过的一家商店称这种方法为“开始标记错误,结束标记错误,复制错误,复制错误,复制错误”。

–凯利·法文(Kelly S. French)
18 Mar 5 '18 at 17:52

#4 楼

软件开发人员应该渴望编写出行之有效的代码,这些行之有效的,可以测试的,可以审查的,可以调试的,可以在需要更改的情况下进行修改的代码。如果编写“带有类的C”实现了这一点,那就很好了。

这些是您应衡量代码的标准。特别是:它是否明显起作用,可以进行测试,可以进行审查,可以进行调试以及可以在需要时进行调整?

#5 楼

来自同情心的论点:

您的工作是否有空闲时间来学习,或者您是否可以说服老板分配一些时间来学习这些语言功能?

如果不,使用这些本质上是给他们额外的无偿工作。您可能会认为C ++程序员应该了解全部语言或类似的语言,但是从学术角度上讲,这并不能减轻您要加在他们身上的负担。您的同事有孩子,生病的父母,生病的配偶-或地狱,只是一种不涉及学习C ++的合理社交生活。提议中比较直言不讳的反对者可能很懒惰-或者他们可能经历了艰难的时光,现在他们的生活中不需要额外的麻烦。

#6 楼

首先应该编写代码,以供人类阅读,而只是偶然地供编译器解析。

现在要记住的关于非琐碎的TMP的事情是,您限制了可以读取该代码的人数,这可能是一个有效的折衷,但我认为这远不是一个合理的折衷。在图书馆中,并且如果您的专家小组很小,那么它就会在更大的应用程序中使用。

当您掏出书中的所有窍门时,您便在其他所有人身上付出了成本,因为他们现在需要为了理解语言,包括您所利用的所有法律上最棘手的案例,您还增加了聘用成本,因为您提高了以一种有用的方式来处理该应用程序的标准,现在也许值得,但是请注意成本...比我只能维护的一些非常优雅的TMP更有用(因此将永远维护)。还请记住,带班级C的家伙可能恰好是主题专家,而专业知识通常比语言律师更有价值。

我忘了是谁说的,但是“每个人都知道调试起来要比编写它首先要困难,因此,如果您尽可能地巧妙地对其进行编程,那么您将如何调试它?”。

即使我可以在那里真正地编写出现代C ++,我通常不愿意这样做,这意味着我必须减少维护程序的编写。

#7 楼

不,你不应该。您被雇用来生产满足规范的代码。此代码必须易于维护,而不是自我旅行。明天您可能会被公交车撞倒,所以有人必须能够拿起您的代码并完成任务。但是,尝试说服您的雇主将新技术纳入其编程标准是很正面的。

评论


您被雇用来生产满足规范的代码。是的,但就您所知,您也会忘记这一点。

–t3chb0t
18 Mar 4 '18 at 17:10

#8 楼

在上下文中回答此问题的唯一方法是查看特定问题以及通过元编程解决它们的特定方法。除非您在此处发布代码,否则我们不知道您是否沉迷于不必要的复杂性,这对您一个人来说很有趣,它“解决”了一个不存在的问题;或者您是否利用语言的全部力量编写了其他方法无法提供的简单,优雅的解决方案。每个优秀的团队都必须进行有意义的代码审查,这些审查不仅讨论样式问题,而且还讨论程序员的解决方案是否使用最佳方法,使用适当的语言功能,是否可维护和可测试等。您的元编程解决方案应填补一个此类的审查会议,很可能会整个下午。拒绝您的方法的程序员应该提出替代方案(例如,使用perl进行代码生成,代码复制等),并显示与您的解决方案相比,该方法如何按照上述标准执行。您的工作作为论据中友好的“对手”,是为了表明这是一种快速完成工作的方法,维护简单,测试容易,并且一旦克服了障碍,代码实际上就可读解析有趣的语法。 (如果您有策略,可以事先将它展示给办公室的朋友,并说服他或她很酷;这将对您有所帮助,因为您不会孤单。)大多数程序员都很懒惰,喜欢优雅的小型解决方案。如果您是一个人,那么您很有可能说服他们,尤其是如果所展示的替代方法落空了。

#9 楼

对这个问题没有一个正确的答案。确实有一些人被用作编写规范的代码猴子,其他人被用作团队成员,其他人被用作知识工作者或专家。

唯一不变的底线是您需要查看它从您的雇主的角度来看,因为本质上这意味着要成为一名雇员。有时候,促使您的同事变得更好并掌握先进技术确实符合您雇主的最大利益。但是在不同的情况下,您可能会造成很多问题和责任,并危及所涉及项目的成功。

#10 楼

问题并不是真正的关于元编程是否行得通,而是关于是否可以比团队中的其他人更好,所以这里有一些关于我如何看待它的争议点。



我最近搬到了一个新工作,在一个更大的团队中工作,这种[元编程]使我的一些同事感到担心,因为他们不理解。 >

他们担心您比他们更好。那很好。您将成为新专家。您只是破坏了他们的现状世界。



我一直在尝试利用语言的全部潜能,但是我的一些(并非全部)同事认为风险(有些人欢迎这种方法)。



当然,没有人比其他人更喜欢没有技巧,因此他们试图阻止您使用对他们来说太复杂的技术。他们要么无法理解,要么就不会去做,因为他们现在感觉很安全。 。


我不知道。我认为这正在显示您的专业知识。



我的问题是,谁是对的,我该怎么办?


您应该使用所有技巧来编写可以编写的最佳代码,不要对那些不懂的人有所帮助。否则,您将被困在他们的水平上,只是一个普通的编码器。变得比别人更好是一件好事,而努力做到比别人更好是一件好事。如果您不尝试使用任何新事物或做不同的事情,您将永远不会获得任何新的经验。


我知道我会被否决,但这就是它的样子。优于团队中的其他人不是犯罪,使用技能也不是犯罪。只是每个人都害怕承认它……因为他们站在非技术方面,并且讨厌新来的人突然可以做一些他们做不到的事情。如果他们很聪明,他们会向您寻求帮助和建议,而不是因为您的代码难以理解而批评您。


编辑

关于这个问题的很多困惑。如注释所示,许多人认为这与常规代码的可读性有关。不,这不对。关于是否应该禁止或避免某些语言功能/构造,因为某些团队成员不了解它们。

我的回答是“否”。他们不应该被禁止。如果您想禁止某事,您将如何做?您必须准备某种调查表,以了解您的团队成员可以做什么和不能做什么-或者宁愿不想学习,因为我认为所有语言特性在某个地方都很有用,因此了解它们并能够使用它们总是好,知道的越多,您可以编写的代码越好。您还需要一个比例尺来定义哪些功能是初学者,中级或高级功能。

为了演示这种限制有多愚蠢,让我们举一个非常简单的例子:您将被雇用作为一名软件工程师,但您未来的老板告诉您,您将被禁止使用do/while循环,因为团队中有一些人以前从未使用过它们,也不会去使用,因为他们一直在使用for循环对于所有事情,他们发现do/while循环令人困惑。

现在您认为这是愚蠢而疯狂的,不是吗?但是禁止其他功能。一些人可以使用它们,而另一些人则不想学习它们。

如果您知道有什么可以让您以更少的精力完成相同的工作,却又可以使可读性更高的健壮代码产生代码,那么为什么还要生成更差的代码呢?

没关系,您只使用基本语言功能或高级语言功能,就可以使用其中一种功能生成同样难以理解且难以维护的代码,因此这是一个完全不同的主题。

评论


这个答案太可怕了。元编程并不意味着至高无上,反之亦然

– polfosol
18 Mar 4 '18 at 14:04

根据我的经验,任何强烈感到自己比其他团队拥有更高专业水平的人实际上都成为了邓宁-克鲁格效应的受害者。这并不是说某些人的技能不比其他人高,或者在这种情况下,团队的其他成员实际上并不是没有能力的……但是真正的专家将始终专注于简单的代码和大人物工程(包括考虑一段时间内的团队影响),而不仅仅是为样式点编程。

–丹尼尔·普赖登(Daniel Pryden)
18-3-4在21:20



编写他人无法阅读的代码并不能证明您比他们更好。证明您无法编写可读代码。

– Stig Hemmer
18 Mar 5 '18在9:03

@StigHemmer显然您不明白这个问题,并且您正在更改主题。这不是关于不可读的代码,而是关于其他人由于缺乏知识而无法理解的代码。

–t3chb0t
18 Mar 5 '18在9:07



@ t3chb0t我的意思是,这两个是同一件事。

– Stig Hemmer
18 Mar 5 '18 at 10:55