Boost认为有害?

很多C ++问题的答案都包含了这个答案:

“你应该使用boost::(插入你最喜欢的智能指针在这里),或者甚至更好的提振::(插入你最喜欢的兆复杂的提升types在这里)”

我完全不相信这对提问者来说有什么好处,总的来说,他们是明显的C ++新手。 我的理由如下:

  • 使用智能指针而不理解底层的情况会导致一代C ++程序员缺乏程序员的一些基本技能。 这些似乎已经发生在Java领域了。

  • 决定使用哪种types的智能指针非常依赖于正在解决的问题域。 这几乎总是从这里发布的问题中丢失,所以简单地说“使用共享指针”可能是最没有帮助,可能是完全错误的。

  • Boost尚未成为C ++标准的一部分,可能无法在提问者使用的特定平台上使用。 安装它有点痛苦(我刚刚使用了Jam ),如果你想要的只是一些聪明的指针,那就太过分了。

  • 如果您正在编写FOSS代码,那么您不希望代码严重依赖于外部库,而您的用户可能再也没有这些库。 由于拜占庭式的库之间的依赖关系的复杂性,我已经在很多场合使用了FOSS代码。

总而言之,我并不是说不推荐Boost,但是这样做时我们应该更加小心。

几点:

  • 使用任何不理解的东西都是有害的。 但是最终只有无知的技术使用者(和他的经理)才会被烧掉。
  • 你不必安装boost来获取智能指针 – 它们只是标头。 安装本身相当简单,只需input一个或两个命令即可。
  • 许多Boost库和解决scheme都存在于TR1中,或者将以C ++ 0x的forms出现
  • 你总是会依赖外部的图书馆…试着select一个在维护和支持方面有着光明前途的图书馆。
  • 除非你想推出你的定制解决scheme – 这会有一些优点和缺点。

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

  1. C部分
  2. 面向对象的部分:类,inheritance,多态等
  3. STL:容器,迭代器,algorithm
  4. 模板和元编程

我会争辩说,如果初学者已经爬山了,他们应该从一开始就指向C ++的更“现代”的方面。 否则,意味着初学者将学习C-ISH C ++与常规指针,资源泄漏等。发现自己在一个痛苦的世界,然后发现升压和其他图书馆作为一种方法来遏制伤害。

无论如何,这是一个复杂的图景,为什么不把它们指向一个对投入的精神生活有积极回报的方向呢?

至于依赖关系,大量的Boost只是头文件。 而Boost的自由许可证应该允许将其纳入任何项目。

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

在某个时候,你正在使用一个黑匣子,问题是,“我现在正在做什么是我的无知?”。

如果你对知识的品味是一件好事 – 当采访工程师时,我清楚地认为这是一个优点 – 但是不要忘记你的工作的最终性:build立解决问题的系统。

我不同意。 没有人会build议你在没有透彻理解幕后发生的事情的情况下潜入智能指针,但明智地使用它们可以消除大量的常见错误。 而且,Boost是一个高质量的生产代码,从devise和实现的angular度来看,C ++新手可以从中学到很多东西。 这也不是非常复杂,你可以select你需要的位。

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

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

我完全同意你的意见。 这是我第一次解释它应该怎么做的原因(也就是说,当推荐boost :: variant时,我解释他们应该在一般情况下使用歧视的联盟。我尽量不要说这只是一个“魔术增强的东西”,而是显示当我推荐boost :: shared_ptr时,我解释了它们需要使用一个指针 – 但是最好使用具有共享所有权语义的智能指针)。 当我看到提问者是初学者时,我尽量不要说“使用boost::xxx ”。 这是一种不像一些脚本语言那么简单的语言。 人们必须了解所使用的东西,因为语言不能保护程序员不做坏事。

新手从一开始就不可能了解所有事情。 但是他们应该明白他们的提升库能够解决什么问题,基本上它是如何实现的。

您无法将其与学习处理器或汇编语言进行比较。 类似的,知道空指针的位模式是怎样的并不重要。 在学习使用C ++编程时,这些知识是无关紧要的。 但是C ++中的指针,数组或其他任何基本的东西都不是。 在使用[boost|std]::shared_ptr[boost|std]::array之前,一个人不会学习它们。 在我看来,为了成功地使用boost工具,这些东西必须先被理解。 这不是关于如何使用原始指针手动实现pimpl-idiom的详细信息 – 这不是我所做的。 但重要的是,人们应该首先了解关于指针的基本知识,或者提升库帮助的其他部分(例如指针,它们是什么以及它们有什么用途)。 只要看看shared_ptr手册,并试图得到它不知道指针。 不可能。

总是将它们指向适当的增强手册是非常重要的。 提升手册是高品质的。

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

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

但是,提升非常复杂。 你需要成为一个有经验的程序员来了解它的价值。 而且,你需要在C ++方面有至less一些经验来理解Boost的工作原理以及在这里或那里使用Boost的含义。

因此,我强烈build议你去看看Boost的经验丰富的程序员,特别是当他们试图重新发明轮子时。 它的确可以成为它所说的话:促进你的目标。

但是,如果你觉得提问的人是初学者,试图理解(例如)内存分配,告诉他尝试提高智能指针是一个非常糟糕的主意。 这根本没有帮助。 智能指针类的优点只有当用户体验到标准内存分配技术的工作方式时才能被理解。

最后,Boost不像学习驾驶带自动变速箱的汽车。 这就像学习驾驶F1赛车一样。

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

我也认为这对初学者来说可能是非常有价值的。 使用lexical_cast比使用ostringstream更容易吗? 或者使用BOOST_FOREACH而不是迭代器语法? 最大的问题是缺乏良好的提升logging,特别是对于初学者。 所需要的是一本书,将告诉你如何开始boost,哪些库是简单的库,简化任务,哪些库更复杂。 通过将这些库与良好的文档结合使用,IMO将使学习C ++变得更加简单

我不同意。 当然,与使用第三方库时相比,从头开始编写代码时,您始终会了解所有内部工作。 但时间和金钱是有限的,并使用良好的第三方库,如提升是一个很好的方式来节省您的资源。

我认为你正在混合许多不同的问题,并不是所有的问题都和Boost有关:

首先,应该鼓励程序员(特别是C ++新手)使用他们不明白的图书馆,习惯用语,范例,语言或语言特征吗?

  • 不,当然不。 每个程序员都应该理解他们使用的工具, 特别是像C ++这样的语言。 但是,在这里我没有看到很多问题,鼓励人们不理解他们使用的代码。 当人们说他们想在C ++中使用X时,我认为可以这么说:“Boost有一个X的实现,它不仅仅是一个自制的解决scheme,而是使用它”。

当然如果问题是“X如何工作”,这个问题不能用“使用Boost的实现”来解答。 但是我真的没有看到推荐Boost的问题。

我也不明白如果不理解底层的情况,甚至可以使用Boost。 有或没有Boost的C ++不是Java。 使用Boost并不能保护您免受语言的复杂性影响。 你仍然不得不担心复制构造函数,指针算术,模板和其他一切可能炸毁你的脸。

这与Java中发生的事情没有任何关系。 他们devise了一种消除所有微妙之处的语言。 Boost不这样做。 恰恰相反,它开创了generics编程中的新成语和新技术。 使用Boost并不总是很简单。

关于Boost的可用性,我认为这不是问题。 它可以在大多数问题的平台上使用,如果他们不能使用Boost,那么这个build议仍然没有害处 ,只是没用。

此外,大多数Boost库只是头文件,并不要求你安装整个东西。 如果你只需要智能指针,只需包含这些头文件而不需要其他东西。

关于自由和开放源码软件,在某些情况下你有一个问题,但是我认为这是用户不具备的通用库的问题。 但Boost 非常普遍的,如果人们没有它,他们应该得到它,因为它几乎适用于任何问题领域。 当然,这个许可与您所关心的任何FOSS项目都是兼容的。 我宁愿开发一个OSS项目,使用Boost来完成繁重的工作,而不是重新devise自己的(有车的和专有的)车轮,这样可以避免陡峭的学习曲线。

所以是的,在某些情况下,推荐Boost是无益的。 但是我不明白它有什么危害

无论如何,我看不出如何教新手推出自己的一半。 在C ++中,这是一个灾难的秘诀。 这就是为什么C ++仍然因为容易出错而产生错误软件的声誉的唯一原因。 因为太长时间了,人们从头开始写一些东西,不信任标准库,不信任第三方代码,不信任任何C中不合法的东西。

我们应该鼓励使用标准的jar头库(只要可能,Boost几乎和标准一样)。

有些人似乎认为初学者应该首先教C ++的C端,然后再引入到更高层次的东西。 然而,人们倾向于按照训练的方式工作,所以我们将看到许多用严格pipe理的原始指针编写的生产代码(pipe理良好的原始指针有时非常困难),数组(和删除之间不可避免的混淆和删除[]),和那样的东西。 我已经用这样的代码工作了。 我不想再做这件事。

以您希望他们编写代码的方式开始初学者。 这意味着首先向他们介绍STL容器和algorithm以及一些Boost库,所以当他们需要一组事物时,他们首先想到的就是一个向量<>。 然后教给他们较低层的结构,这样他们在遇到它们的时候就会知道它们(或者在哪里查找它们),或者在极less数情况下需要微观优化。

基本上有两种types的程序员:编程者,应该学习语言的人应该写他们的方式,以及发烧友,他们将学习底层的东西,包括操作系统原理,C语言,汇编代码等等。 两者都可以通过学习他们将要使用的语言而得到很好的服务,而只有通过学习某些任意级别的基础知识才能很好地服务于爱好者。

我完全不相信这对提问者来说有什么好处,总的来说,他们是明显的C ++新手。 …:

  • 使用智能指针而不理解底层的情况会导致一代C ++程序员缺乏程序员的一些基本技能。

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

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

我个人学习如何在学习如何编写课程之前构build对象。 我想我在学习C风格的数组之前学习了如何使用STL向量。 我认为这是正确的方法:“这里是如何使用std::vector来引用几个几乎相同的variables,稍后我会告诉你什么是通过C风格的数组和new[]delete[]

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

它们不是“标准的”,但它们是像图书馆一样标准的。

确实,部署它们可能是痛苦的(但并不是所有的子库都需要编译)。 另一方面,他们自己没有进一步的依赖关系,所以我也不会太担心这个部分。

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

我同意你的看法,高层图书馆隐藏你的东西。 从短期来看这可能是一个好主意,但从长远来看,新手对于语言的理解存在严重的空白。

对于我们这些非新手来说,“使用这个图书馆”是很容易的,因为我们已经走过了艰难学习这个漫长道路的艰辛之路,自然而然地我们也想救别人去做这个事情的麻烦。

新手应该努力将自己的低级解决scheme滚动到问题上。 然后,当他们对自己的解决scheme如何工作有了更好的了解时,他们可以使用第三方解决scheme,确信自己对发生了什么事情有了一些了解。 他们会更好地使用这个库

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

范围和dynamic的资源所有权是一般的基本需求,而且强烈推行'em'是非常好的。 我用他们很多,他们工作得很好。

Boost是一个伟大的图书馆。 我真的希望它在广度和接受度上有所增长。 使用它,扩展它,并促进它。

.NET社区的优点之一是它有一个很好的基类库。 我相信C ++的一个基本问题就是简单的C ++标准库。 无论你去开发代码,自由/开源软件或企业,都有一些select的库,因为没有一个宽泛的标准库。 所以你最终成为一名INSERT_YOUR_COMPANY_HERE C ++程序员,并不一定是可转移的。 是的,你的devise/build筑技能转移,但有一个学习曲线,熟悉下一个地方正在使用的任何一套图书馆。 .NET开发人员基本上将使用相同的类库,并且可以开始运行。 而且,构build(和重用)的库有更广泛的基础来构build。

就像旁边一样,你可以使用http://codepad.org代码粘贴bin,它支持提升!;

我曾经为那些曾经把图书馆视为图书馆的公司工作,以避免因为过去的pipe理不善而受到影响。 我知道项目已经发生了变化,但是想要使用boost的商业项目必须意识到库中包含的代码的来源,或者至less要确保他们不会为知识产权或专利侵权承担责任。

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