首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们是否应该避免使用C++所具有的语言特性,而不是Java呢?

我们是否应该避免使用C++所具有的语言特性,而不是Java呢?
EN

Software Engineering用户
提问于 2016-01-25 02:57:26
回答 12查看 19.9K关注 0票数 111

假设项目中的环境限制了我使用C++。防止使用C++拥有但Java没有的一些语言特性(例如:多重继承、操作符重载)好吗?

我认为原因是:

  1. 因为Java比C++新,如果Java没有提供C++所拥有的特性,这意味着这个特性不好,所以我们应该避免使用它。
  2. 具有C++特定特性(例如:朋友函数、多重继承)的C++代码只能由C++程序员维护或审阅,但如果我们只编写像C++这样的C++ (没有C++语言特性),那么代码可以由C++和Java程序员共同维护或审阅。
  3. 总有一天你可能会被要求把代码转换成Java
  4. 没有C++特定特性的代码通常更易于维护。
  5. 每个特定于C++语言的特性(例如:多重继承)都应该有可供选择的方法,以便在Java中实现。如果没有,这意味着设计模式或代码体系结构是有问题的。

这是真的吗?

EN

回答 12

Software Engineering用户

发布于 2016-01-25 03:08:00

不是的。这是可悲和可怕的误导。

  • Java特性在某种程度上并不比C++特性好,特别是在真空环境下。
  • 如果您的程序员不知道如何使用某个特性,那么培训或雇用更好的开发人员;将您的开发人员限制在团队中最糟糕的位置是一种快速而简单的方法,可以让您失去优秀的开发人员。
  • 雅格尼。今天解决你的实际问题,而不是未来某个问题的幽灵。
票数 304
EN

Software Engineering用户

发布于 2016-01-25 09:43:19

仅仅因为语法表面看起来很相似,并不意味着这两种语言是兼容的。

1、4和5实际上是同一个问题:

现在,我并不是C++的粉丝,但是说“没有C++特定特性的代码通常更易于维护”是荒谬的--你真的认为Java做得对吗?你真的认为所有的好特性都是正确的,而忽略了所有不好的特性吗?你真的相信有什么东西是普遍的“坏”或“好”的特征吗?如果有的话,为什么我们没有一种纯粹好的语言呢?不,Java当然不是那种语言。这是否意味着Java和C++是无用的?当然不是。

如果您的领导人决定您要移植到C#,而不是Java呢?C#不仅支持覆盖操作符,而且它也是默认的--如果您要求人们使用obj.Equals(obj2)而不是obj == obj2,那么人们总是会犯错误。即使你只保留两种语言的共同特点,也有不同的期望,不同的文化。如果你在if (myField == null) in C++这样做,人们会立刻看到你是个新手。如果您在if (null == myField)中使用C#,人们会发现您还不是真正的C#本地用户--C开发人员学习使用“翻转”变体的原因不再存在于C#中。

使用您的逻辑,我们应该坚持机器代码或程序集或COBOL,因为为什么要更改为Pascal,而它只是添加了您的程序员必须学习的新特性?当SQL甚至没有循环的时候,我们为什么要使用类似SQL的东西呢?当SQL没有循环而X有循环时,我们为什么要使用SQL以外的其他东西呢?

C++代码当然不能由Java程序员维护。我不明白您是从哪里得到这个想法的--当您将C++限制在与Java完全相同的特性上时,还有什么需要考虑的呢?您甚至不会得到方法调用-甚至函数调用。同样,仅仅因为两个语言都使用花括号,并不意味着语言在任何方面都是可互换的。

无论您做什么,转换类似Java的C++代码都是非常容易出错的。只是有太多的差异。如果您关心必须用不同的语言重写您的应用程序,请考虑合理的方法来模块化所有的东西,这样您就可以在不破坏整体的情况下替换这些部件。但是最终,YAGNI --不管你做什么,让你的代码“准备好转换到Java”需要付出很大的代价。这一时间很可能更好地用于添加或改进您的特性。

我们使用不同的语言,因为它们为我们提供了一套不同的工具来解决问题。如果您需要“无处不在”的可执行文件,可以使用Java。如果您想要编译“处处”的代码,C++可以正常工作。如果您想要易于理解和解析的代码,请使用LISP或其他方法。但是我可以告诉你一件事--用一种语言写代码,就好像你在用另一种语言写代码一样,总是一个错误,你将遭受痛苦。更别提当你雇佣一个C++的人时,他一看到“Java兼容”的代码就会运行。还有..。Java人也会这么做。你知道,即使“知道”C++和Java,我也会拼命地跑:)

实际上,我不得不编写一个Pascal开发人员编写的(普通的)C代码,他的想法似乎和您一样。他用#defines重新定义C,使其看起来和感觉更像Pascal,完成了诸如"BEGIN to { {“之类的东西。结果是相当可预测的-- C和Pascal开发人员都无法理解的代码,以及由于Pascal在C之上的“抽象”泄漏而产生的大量bug,从今天的观点来看,Pascal和C几乎是相同的。即使使用C <-> C++也有很大的不同,对于类似于C++ <->的Java来说,这仍然是微不足道的。

票数 143
EN

Software Engineering用户

发布于 2016-01-25 15:28:35

我会按照顺序回答你的问题。

  1. 如果Java没有提供C++所具有的特性,这意味着该特性不好,因此我们应该防止使用它。

是的,Java中没有的任何特性在硬盘上都是令人讨厌的。它必须从您的代码库中销毁。那些不服从的人会被搜捕,他们的灵魂过去是用来安抚袭击神的。

  1. 具有C++特定特性(例如:朋友函数、多重继承)的C++代码只能由C++程序员维护或审阅,但如果我们只编写像C++这样的C++ (没有C++语言特性),那么代码可以由C++和Java程序员共同维护或审阅。

当有疑问时,为团队中最不称职的成员编写代码。代码的读取频率远远高于所编写的代码,而您所能编写的最聪明的代码太聪明,无法阅读。您的前台员工不理解的代码评审应该被拒绝。为了帮助他们,在周末教他们如何在VisualBasic2.0中编程,然后模仿他们使用的任何语言的编码风格。

  1. 总有一天你可能会被要求把代码转换成Java

是真的!但是为什么停在Java呢?有一天,您可能会被要求将代码转换为basic、assembler和/或perl。由于在所有语言中都有perl解释器,所以只需将程序编写为一个长perl字符串,并以所选择的语言将参数编组到其中。

现在,当您需要更改语言时,只需重写包装perl字符串的代码即可。

  1. 没有C++特定特性的代码通常更易于维护。

确实,使用较少功能的代码更容易维护。由于所有语言都等同于图灵机,而图灵机具有任何编程语言中最少的特性,所以让上面的perl解释器实际运行一个图灵机(磁带和所有的)来解决您的问题。

  1. 每个特定于C++语言的特性(例如:多重继承)都应该有可供选择的方法,以便在Java中实现。如果没有,这意味着设计模式或代码体系结构是有问题的。

C++语言特有的特性实际上具有很好的使用价值。因为他们不是Java,他们是讨厌的,那些使用它的人可以被贴上异端的标签。如果C++没有这些语言特性,您将无法找到您需要牺牲的那些特性。C++语言特性解决问题!

看,C++和Java有一组不同的功能。在C++和Java的交集中进行编程会导致放弃这两种语言的大部分优点的代码。

Java的开发部分是为了应对C++特性的某些滥用。这并不意味着这种反应是合理的,特别是在几年后,当这些特性成熟的时候。

在操作符重载的情况下,您可以做一些可怕的事情;但是,任何语言都无法阻止用语言编写可怕的代码,除非它阻止所有代码都用语言编写。

你也可以做一些非常优雅的事情,操作人员超载。简单的事情,比如复数或矩阵类,像复数或矩阵。

对于使用Java中没有的C++特性,应该谨慎对待。仅仅因为您当前的一组开发人员在他们当前的技能水平上不理解某个特性,并不意味着不应该使用它;同时,仅仅因为您可以使用某个特性,并不意味着您应该使用它。然而,在一个Java重的商店中,抵制的可能性会比非Java风格的特性更强。

语言之间的代码转换最好是通过重写来完成,不管它们在结构上有多相似。如果不进行这样的重写,任何这样做的尝试都将惨遭失败。

许多特定于C++的特性对于维护来说都是奇迹。类型擦除(如std::function)允许您解耦层次结构,从而减少依赖关系。智能指针、确定性生命周期和RAII可以减少运行时的意外,并将资源样板移开。大量的静态类型检查意味着代码无法编译,而不是无法工作。混合输入减少代码重复。ADL允许在类型层次结构之间独立扩展接口.Lambda允许您在使用它的地方旁边编写代码。转发和移动减少副本,并使功能风格(无副作用)编程效率。运算符重载减少了行噪声,并使代码看起来更像它正在建模的数学。

小心图灵焦油坑。您可以用任何语言实现一切(包括带有磁带的原始图灵机),但这并不意味着您应该这样做。在C++中使用Java构造来模拟C++特性是一个可怕的想法;它将导致无法维护的代码,没有人能够阅读或理解这些代码。

您可以从Java设计中获得灵感,并将它们移植到C++。我非常喜欢使用Python特性并在C++中实现它们,因为我喜欢语法。但这并不意味着我将类方法编写为接受显式self的静态方法,然后编写一个包装器,将非静态方法调用转发给它。

现代C++并不完全像Java模仿和拒绝的语言。不要被一种语言的特性所束缚,没有“一种真正的语言”。了解新语言及其特点,并吸收它们的独特性。

票数 94
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/308245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档