使用STL与自定义实用程序类的程序员生产力

时间:2009-02-26 01:14:34

标签: c++ stl

我在一个环境中工作,由于历史原因,我们正在使用大量的自定义实用程序类,其中大部分是在STL到达现场之前编写的。我认为至少使用STL编写新代码是个好主意的原因有很多,但主要原因是我相信它可以提高程序员的工作效率。不幸的是,这是我不知道如何证明的一点。

是否有任何研究尝试量化,甚至只暗示使用STL提高生产力?

更新:我想我应该更具体一点。我主张重写现有代码,而我担心新员工将会开始运行。前者是愚蠢的,而后者本身并不足以说服人们。

12 个答案:

答案 0 :(得分:6)

没有研究表明STL因STL而更具生产力。使用它所带来的生产力增益是由于它是标准程序员熟悉它,并且因为代码已经编写和测试。

如果您的公司已经拥有员工熟悉的实用程序类,并且在整个现有代码库中使用此实用程序代码,那么切换到STL实际上可能会对生产力产生不利影响。

那说使用STL的新代码将是一个很好的举措。我不一定从生产力的角度来论证这一点,而是可维护性。如果您的代码早于STL,那么您公司的代码听起来就有很长的使用寿命,并且可能会被许多新程序员多年来维护。

您可能还希望将STL的使用作为一种让每个人保持其C ++技能组合的方式。虽然我不会拒绝不了解STL的C ++候选人,但我肯定会将其视为黑色标记。

答案 1 :(得分:3)

STL如此“好”的原因仅仅是因为它已经存在很长时间了,并且实现已经看到了很多用户和眼睛。它们经过了很好的调试,并且供应商对算法进行了很好的优化。

STL对你店里的新开发者来说会更有效率,因为他们可能已经熟悉它了。您的自定义库将是外来的,可能缺乏开发人员习惯使用的功能。然而,在新开发者的最初加速期之后,这不是一个大问题。

没有真正紧迫的理由转移到STL只是因为它。如果你的应用程序中有完全有用的实用程序类,我建议坚持使用它们,除非它们不能用于新代码。在新代码中将STL与自定义库混合会在某些时候导致兼容性问题,并且重构代码以使用所有STL将导致错误。无论哪种方式,你都会失去生产力。

编辑:通过“新”代码,我指的是使用旧类库的现有应用程序中的新代码。

如果您正在开发新的独立应用程序,而不是使用任何旧的应用程序代码,我建议使用STL,因为它存在,大多数每个C ++开发人员都知道如何使用它并且它非常稳定(并且您得到了支持你的工具集供应商,如果不是)。

答案 2 :(得分:2)

我认为关键因素是开发团队的流动率。

如果团队稳定,并且他们已经在这个代码上工作了十年,并且可能是十年之后,他们将更有效地使用他们熟悉的实用程序类,并推动它们使用STL将导致生产力和错误降低。

如果团队翻了很多,那么新的开发人员可能会熟悉STL,显然不是这个专有的实用程序类库,并且会更好地使用STL。

答案 3 :(得分:2)

使用STL提高工作效率的唯一理由我可以想到可以轻松集成其他库 - Boost,Arabica,SOCI等。它们都是为STL而不是内部容器类而设计的。

答案 4 :(得分:2)

我一直处于同样的境地。这取决于有问题的实用程序类。我见过的许多自定义实用程序类都是错误的,或者设计不当,并且在整个源代码中导致错误和效率低下。在这种情况下,直接替换STL等效项将改善代码库,提高生产力,减少错误并降低未来的维护成本。

您有时可以通过将STL样式的迭代器改装到旧类来帮助弥合这两个世界之间的差距,但要小心将它们弄好!

答案 5 :(得分:1)

如果本土公用事业以任何方式特定于您所从事的工作,那么情况可能正好相反。

答案 6 :(得分:1)

STL有用的地方不在STL提供的实际库等中,而是在STL使用的编码风格中。

以下需要进行2项主要测试:

struct DoSomething {
  bool operator ()(Container::value_type const & v) const
  {
    // ...
  }
};

void bar (Container const & c)
{
  std::for_each (c.begin (), c.end (), DoSomething ());
}

第一个测试验证'DoSomething :: operator()'做了它应该做的事情。第二个测试只需要验证是否调用了'DoSomething :: operator()'。

与手写循环相比,这种分离有助于提高生产率。对于上述情况,测试次数是“要完成的事情”和对非空容器进行调用的测试的总和。在for循环的情况下,测试的数量是测试的结果。

答案 7 :(得分:1)

我看到的原因是:

代码质量

STL的编写者(无论是它的接口,还是编译器的实现)都毫无疑问地比贵公司的最佳开发人员更好。

他们的工作是制作一个可用的STL,这意味着无论如何都要对每个函数/方法/对象进行大量测试。

代码的可维护性

随着营业额的增加,一些代码可能会变得缓慢而悄悄地保持不变。这意味着如果此代码中存在错误,或者找不到其性能或界面(请参阅上面的“质量”),那么您将找不到专家改进它的人。

代码更改将在其他地方具有非零概率的代码回归,如果您的内部库未经过单元测试,则该回归将在相当长的一段时间内未被检测到。

我甚至没有提到“我永远不会碰到那些黏糊糊的代码”综合症,当有人试图纠正代码时发现他不明白为什么会这样做(因为宏,奇怪的前条件等。

结论

结合这两者,你会发现对于通用代码(即数组,字符串等),你会从内部库缓慢迁移到STL库,在需要时编写“转换器函数”。

我认为这种迁移是代码维护的一部分,并且您应该尽可能慢地(即使用新代码或重构时)使用STL而不是内部通用库。

答案 8 :(得分:0)

由于您已经拥有实用程序类,因此无需使用STL。当您发现需要开始将STL集成到实用程序库中时,它将很快成为可维护性问题。 IMO,这将是一种生产力损失

也就是说,STL可能会提供许多实用程序库不提供的功能和实用程序。 (特别有用的是<算法>标头,您可以立即开始使用而不会遗留旧代码的许多问题。)如果您正在编写大量新代码,那么使用STL(和Boost,如果你的话)要好得多可以)而不是编写自己的实用程序类和算法。因此,这将是一项主要的生产力增长。

但我不知道有关该主题的任何研究。

答案 9 :(得分:0)

考虑雇用新的C ++程序员时的情况。他/她是否更有可能拥有STL课程或您自己的课程?如果你开始转向STL,你可能会在它们变得高效之前及时看到巨大的节省。

答案 10 :(得分:0)

目前,任何新雇用的员工都必须学习如何使用旧课程,这需要花费时间和金钱。像其他人一样使用STL可以节省公司资金,并使其在候选人群中保持吸引力。

答案 11 :(得分:0)

不幸的是,我认为没有办法证明替换这些自定义类是合理的。如果可能的话,请在课程时用STL组件替换它们。

这是一个维护&可读性问题和任何事情一样多。 (1)使用STL可以帮助维护者一目了然地理解代码,而不是习惯于了解自定义实现的方法。 (2)STL记录良好且易于理解 - 您的自定义类怎么样? (3)STL经过严格审查。 (4)STL带有渐近运行时上限和下限。下限。

祝你好运。

相关问题