提升被认为有害吗?

时间:2009-02-20 11:23:44

标签: c++ boost

这里有很多关于C ++问题的答案包含回复:

  

“你应该使用boost::(插入   这里你最喜欢的智能指针)或   更好的提升:(插入你的   最喜欢的超级复杂提升类型   这里)“

我完全不相信这对提问者有任何好处,而这些提问者大体上都是明显的C ++新手。我的理由如下:

  • 不使用智能指针 了解正在发生的事情 引擎盖将导致一个 一代C ++程序员谁 缺乏一些基本技能 程序员。这似乎相似 发生在Java领域 已经

  • 决定哪种类型的智能指针 使用在很大程度上取决于 问题域正在解决。这个 几乎总是缺少 这里贴出的问题很简单 说“使用共享指针”是 可能至少是无益的 可能完全错了。

  • Boost还不是C ++的一部分 标准,可能无法使用 提问者的具体平台 正在使用。安装它有点 痛苦(我只是使用Jam)和 如果你想要的只是一个,那就太过分了 很少有智能指针。

  • 如果您正在编写FOSS代码,那么就是您 不希望代码严重 依赖于外部库, 再次,您的用户可能没有。 我被推迟使用FOSS代码 很多时候只是因为 拜占庭的复杂性 库之间的依赖关系。

总而言之,我并不是说不建议使用Boost,但在这样做时我们应该更加小心。

19 个答案:

答案 0 :(得分:92)

几点:

  • 使用任何不理解的东西都被认为是有害的。但只有无知的技术用户(和他的经理)才会被烧毁。
  • 您不必安装boost来获取智能指针 - 它们只是标题。安装本身非常简单,只需键入一个或两个命令,最简单的方法。
  • 许多Boost库和解决方案都存在于TR1中,或者存在于C ++ 0x
  • 您将始终依赖外部图书馆...尝试选择在维护和支持方面前景光明的图书馆。
  • 除非你想推出自定义解决方案 - 这会有一些优点和缺点。

答案 1 :(得分:65)

C ++不是一种新手友好的语言。向Scott Meyers道歉,初学者不仅仅学习一种C ++语言,而是学习四种语言:

  1. C部分
  2. 面向对象的部分:类,继承,多态等
  3. STL:容器,迭代器,算法
  4. 模板和元编程
  5. 我认为如果初学者已经攀登这座山,他们应该从一开始就指向C ++的“现代”方面。否则意味着初学者将通过常规指针,资源泄漏等学习C-ish C ++。在痛苦的世界中找到自己,然后发现Boost和其他库来阻止伤害。

    无论如何,这都是一幅复杂的画面,那么为什么不把它们指向一个对所投入的精神上有正面回报的方向呢?

    至于依赖关系,很多Boost只是标题。而Boost的自由许可应该允许它包含在任何项目中。

答案 2 :(得分:42)

你知道编译器的工作原理吗?你知道操作系统是如何工作的吗?你知道处理器是如何工作的吗?你知道电子产品的工作原理吗?你知道电的工作原理吗?

在某些时候你使用的是黑匣子,问题是,“我目前正在做的事情是我的无知问题吗?”。

如果你对知识的喜爱是一件好事 - 我在采访工程师时明确认为这是一个优势 - 但不要忘记工作的最终结果:构建解决问题的系统。

答案 3 :(得分:26)

我不同意。没有人会建议您在没有彻底了解幕后发生的事情的情况下深入了解智能指针,但明智地使用它们可以消除一大堆常见错误。此外,Boost是高质量的生产代码,C ++新手可以从设计和实现方面学到很多东西。它也不是非常复杂,你可以选择你需要的位。

答案 4 :(得分:21)

  • 不可能一直彻底理解一切。因此,请接受许多专业C ++开发人员的说法,即升级的许多部分确实是非常有用的东西,可用于您的日常开发。
  • 在C ++ 0X中包含了相当多的提升,这证明即使是管理语言演变的团队也认为提升是一件好事(tm)
  • C ++是一种奇怪而强硬的语言。与掌握难度难度相比,它相对容易学习。你可以用它做一些非常神秘的事情。 Boost :: mpl建立在一些神秘的东西上。我喜欢提升,但每当我看到组织中的某个人使用boost :: mpl时,我都会感到畏缩。原因是:即使是经验丰富的C ++开发人员也无法解决它的工作原理,而使用它的代码经常会反映出这种情况(最终看起来像是有人将代码撞出来直到它起作用)。这是是一件好事,所以我部分同意不应该谨慎使用boost的某些部分(boost :: spirit是另一个例子)。
  • C ++标准也是一个奇怪的事情。大多数常见的编译器没有实现所有现有标准(例如模板导出)。这只是预期的准则。
  • 如果您的开发人员没有精明的人来决定在特定情况下使用哪个智能指针,那么在没有高级指导的情况下,他们不应该在代码的那部分内乱搞。
  • 总是有外部库,从运行时开始。很多提升只是标题,所以它引入新的外部依赖。

答案 5 :(得分:15)

坦率地说,对于初学者,我认为提升并不是那么合适。我认为初学者最好在使用更高级别的工具/库(如boost或甚至STL)提升食物链之前了解基础知识的工作原理。在初学阶段,它不是关于生产力,而是关于理解。我想知道指针是如何工作的,例如手动创建链表或排序链表是每个程序员应该学习的基础知识的一部分。

答案 6 :(得分:10)

我认为提升是一个很棒的图书馆。我喜欢它。我最喜欢的库是boost :: bind和boost :: function,它使函数指针更灵活,更易于使用。它非常适合不同的框架,并使代码保持整洁。

我也使用不同的Boost类。例如,我使用boost :: graph来创建图形类,我使用boost :: filesystem来处理目录中的文件。

但是,提升非常复杂。您需要成为一名经验丰富的程序员才能了解其价值。此外,您需要具备至少一些C ++经验,以了解Boost如何工作以及在此处或那里使用Boost的含义。

因此,我强烈建议为经验丰富的程序员查看Boost,特别是如果他们试图重新发明轮子(再次)。它真的可以说是锡上所说的:促进你的目标。

但是,如果您觉得提问的人是初学者并且试图理解(例如)内存分配,那么告诉他尝试提升智能指针是一个非常糟糕的主意。它根本没用。只有当人们体验到标准内存分配技术如何工作时,才能理解智能指针类等的优点。

要完成,Boost 就像学习驾驶带自动变速箱的汽车一样。这就像学习驾驶F1赛车一样。

答案 7 :(得分:10)

我完全同意你的看法。这是我首先向他们解释应该如何做的原因(即当推荐boost :: variant时,我解释他们应该通常使用一个有区别的联盟。而我尽量不说它只是一个“神奇的提升物”但是显示他们原则上如何实现它。当我推荐boost :: shared_ptr时,我解释他们需要使用指针 - 但最好使用具有共享所有权语义的智能指针。)。当我看到提问者是初学者时,我尽量不要只说“使用boost::xxx”。它是一种不像某些脚本语言那样简单易用的语言。人们必须理解使用的东西,因为语言不能保护程序员不做坏事。

当然,新手不可能从一开始就理解一切。但他们应该了解他们的升级库解决了什么以及基本如何解决它。

您无法首先将其与学习处理器或汇编语言进行比较。类似地,知道空指针的位模式是什么样子并不重要。了解这些与使用C ++学习编程无关。但是C ++中的指针,数组或任何其他基本事物都不是。在成功使用[boost|std]::shared_ptr[boost|std]::array之前,我们无法学习它们。在我看来,为了成功使用boost工具,必须先了解这些内容。这不是关于如何使用原始指针手动实现pimpl-idiom的细节 - 这不是我正在做的事情。但问题是,首先应该了解指针的基本内容或者升级库帮助的其他部分(例如,指针,它们是什么以及它们有什么用处)。只需查看shared_ptr手册,并尝试在不知道指针的情况下获取它。不可能。

始终将它们指向适当的助推手册非常重要。提升手册质量很高。

答案 8 :(得分:7)

几乎所有答案的共识是,对于经验丰富的开发人员和复杂的现实世界的C ++软件来说,提升非常有价值。我完全同意。

我还认为boost 可以对初学者非常有价值。使用lexical_cast比使用ostringstream更容易吗?或者使用BOOST_FOREACH而不是迭代器语法?最大的问题是缺乏良好的助推器文档,特别是初学者。我们需要的是一本书,它将告诉您如何从boost开始,哪些库是简化任务的简单库,以及哪些库更复杂。使用这些库和良好的文档将使IMO更容易学习C ++。

答案 9 :(得分:5)

我不同意。当然,从头开始编码时,您将始终比使用第三方库时更了解所有内部工作原理。但是时间和金钱都是有限的,使用好的第三方库(如boost)是节省资源的一种非常好的方法。

答案 10 :(得分:5)

我认为你混合了许多不同的问题,并非所有问题都与Boost特别相关:

首先,是否应该鼓励程序员(或者特别是C ++新手)使用他们不理解的库,习语,范例,语言或语言功能?

  • 不,当然不是。每个程序员都应该理解他们使用的工具,尤其是,用C ++这样的语言。但是,我没有在SO上看到很多问题,鼓励人们不理解他们使用的代码。当人们说他们想在C ++中做X时,我认为它会说“Boost有一个X的实现,它不仅仅是一个自制的解决方案,所以使用它”。

当然,如果问题是“X如何工作”,那么“使用Boost的实现”就无法回答这个问题。但我真的没有看到推荐Boost的问题。

我也看不出如何在不理解幕后发生的事情的情况下使用Boost。无论有没有Boost,C ++都不是Java。使用Boost绝不会保护您免受语言的复杂性。你仍然需要担心复制构造函数,指针算术,模板和其他一些可能会在你脸上爆炸的东西。

这与Java中发生的情况完全不同。他们设计了一种能够消除所有细微之处的语言。提升不会那样做。恰恰相反,它在通用编程方面开创了新的习语和技术。使用Boost并不总是很简单。

关于Boost的可用性,我认为这不是问题。它可以在绝大多数问题中使用的平台上使用,如果它们无法使用Boost,则该建议仍然不是有害,只是无用。

此外,大多数Boost库只是标题库,不需要您安装整个文件。如果您只想要智能指针,只需包含这些标题即可。

关于FOSS,在某些情况下你有一点意见但是我认为这对于用户没有的通用库来说是一个问题。但是Boost 非常普遍,如果人们没有它,他们应该得到它,因为它适用于几乎任何问题领域。当然,许可证与您关注的任何FOSS项目兼容。 我宁愿研究一个OSS项目,该项目使用Boost进行繁重的工作,而不是重新发明自己的(有缺陷的和专有的)车轮,并且可以避免陡峭的学习曲线。

所以是的,在某些情况下,推荐Boost是无益的。但我不知道它有多害。

在任何情况下,我都不知道如何将推出自己的教学新手的一半有害。在C ++中,这是灾难的秘诀。这就是为什么C ++仍然以容易出错并生成有缺陷的软件而闻名的唯一原因。因为很长时间以来,人们从头开始编写所有内容,不信任标准库,不信任第三方代码,不信任C中不合法的所有内容。

答案 11 :(得分:5)

我们应尽可能鼓励使用标准的固定库(并且Boost几乎和它们一样标准)。

有些人似乎认为初学者应该首先学习C ++的C方面,然后再介绍更高级的东西。然而,人们倾向于在他们接受培训的情况下工作,因此我们将看到许多使用管理不当的原始指针编写的生产代码(管理良好的原始指针有时非常困难),数组(以及删除之间不可避免的混淆)并删除[]),以及类似的东西。我曾经使用过这样的代码。我不想再这样做了。

以您希望他们编写代码的方式启动初学者。这意味着首先要教他们关于STL容器和算法以及一些Boost库,所以他们在需要一组东西时首先想到的是vector<>。然后教他们较低级别的结构,这样当他们遇到它们时,或者在他们需要微观优化的极少数情况下,他们会知道它们(或者在哪里查找它们)。

基本上有两种类型的程序员:编程人员,他们应该按照他们应该编写语言的方式教授语言,以及爱好者,他们将学习低级的东西,包括操作系统的原理,C,汇编代码,等等。通过学习他们预先使用的语言,两者都可以得到很好的服务,而只有通过学习一些任意级别的基础知识才能为爱好者提供良好的服务。

答案 12 :(得分:4)

  

我完全不相信这对提问者有任何好处,而这些提问者大体上都是明显的C ++新手。 ...

     
      
  • 使用智能指针而不了解幕后发生的事情会导致一代C ++程序员缺乏程序员的一些基本技能。
  •   

我们是否告诉新手程序员在阅读现代编程语言之前必须学习汇编语言?他们显然不知道引擎盖下发生了什么。

“Hello World”是否应包含I / O子系统的实现?

我个人学习了如何在学习如何编写类之前构造对象。我想在学习C风格的数组之前我学会了如何使用STL向量。我认为这是正确的方法:“这里是如何使用std::vector引用几个几乎相同的变量,稍后我将通过C风格的数组和new[]和{{向我展示在地毯下扫描的内容1}}。“

答案 13 :(得分:3)

我可以看到你的观点,但理解某些东西并不意味着你必须从头开始重写所有东西。

它们不是“标准”,但它们是图书馆可以获得的标准。

确实,部署它们会很痛苦(但并非所有的子库都需要编译);另一方面,他们对自己没有进一步的依赖,所以我也不会太担心那部分。

答案 14 :(得分:1)

我同意关于智能指针的观点。我是一个C ++初学者,当问一个关于指针语法的简单问题时,一个answer建议的智能指针是要走的路。我知道我还没有准备好提升(我也没有为STL做好准备),所以在大多数情况下我都会偏离这种建议。

答案 15 :(得分:1)

我同意你的看法,高级别的图书馆会向你隐瞒事情。从短期来看这可能是一个好主意,但从长远来看,新手在理解语言方面会有严重的差距。

我们非新手很容易说“只是使用这个图书馆”,因为我们一直在努力学习事情的漫长道路上,自然而然地我们希望为其他人省去做同样事情的麻烦。

新手应该努力将自己的低级解决方案推向问题。然后,当他们更好地了解他们自己的解决方案如何工作时,他们可以使用第三方解决方案,相信他们已经了解了幕后发生的事情。他们会更好地使用那个库!

我认为这是一个更广泛的主题,而不仅仅是关于Boost。我完全后悔拿起VB作为我的第一语言。如果我刚刚开始丑陋,难以学习c,那么我将比现在好几年。

答案 16 :(得分:1)

范围和动态资源所有权是一般的基本需求,并且强烈建议强化实施的em是非常好的。我经常使用它们并且它们工作正常。

答案 17 :(得分:0)

Boost是一个很棒的图书馆。我真的希望它在广度和接受度上增长。使用它,扩展它并进行推广。

.NET社区的一大优点是它有一个很棒的基类库。我相信,C ++的一个基本问题是简约的C ++标准库。在开发代码,FOSS或企业的任何地方,由于没有广泛的标准库,因此可以使用一些库。所以你最终成为一名INSERT_YOUR_COMPANY_HERE C ++程序员,而且不一定太可转移。是的,你的设计/建筑技能转移,但有一个学习曲线,熟悉下一个地方使用的任何库集。 .NET开发人员基本上会使用相同的类库,并且可以开始运行。此外,构建(和重用)的库具有更广泛的基础构建。

除此之外,你可以使用http://codepad.org代码粘贴垃圾箱,它支持boost!

答案 18 :(得分:0)

我曾为那些将boost视为图书馆的公司工作,以避免部分由于其过去作为管理不善的项目的声誉。我知道项目已经发生了变化,但是想要使用boost的商业项目必须知道库中包含的代码的来源,或者至少要确保他们不会对IP或专利侵权负责。

可悲的是,图书馆有这样的声誉,它在商业领域广泛使用之前需要一段时间才能打破。我也觉得这是不盲目推荐的原因。