你有没有限制自己使用语言function的子集?

你有没有限制自己使用语言function的一个子集,更重要的是,为什么?

我很想知道谁select只使用某些语言特性,为了在诸如(但不限于)内存使用,执行速度或旧的可读性和可维护性等方面赢得很大的胜利,避免使用其他语言。 这样做会产生预期的结果,或者只是阻碍了软件生产的其他方面。 有没有关于这个主题值得分享的警告故事或者成功的故事?

道格拉斯·克罗克福德(Douglas Crockford)的书“ Javascript:The Good Parts”是一个很好的例子。 他列出了JavaScript中的“function”,应该避免使用,并提供使用该语言的“良好的部分”的替代品。

一些不好的部分是:

  • EVAL
    更慢,更难读,危险不安全

  • ==
    用不同types的操作数混淆和模棱两可


  • 不可预知的结果

大多数人潜意识地编程在他们所熟悉的他们select的语言的非正式子集中。 例如,我的第一个反应是用一个需要迭代的C ++向量来实现,而不是写一个谓词并使用一个标准的库algorithm。 可能是我的失败,但至less我知道algorithm在那里,如果我真的需要它。

上一次我可以用一种子集的语言来有意识地写下来,早在80年代,我的大部分目标平台都支持FORTRAN 77,但是其中一个并不正确,所以我不得不用FORTRAN 77 / FORTRAN IV混合编写代码。 这是一个痛苦的事情 – 近年来情况好转很多,主要归功于FOSS运动。

是的,所有的时间。

因为我使用Perl,大多数人都认为我们的许多语言特性最好不要使用,除非你真的需要,而且你知道自己在做什么。 例如,支持符号引用,但不应该使用它们。 goto存在,但你不应该使用它。 您可以将variables标签重用为不同的types,例如$var ,@ %var%var ,但不应该这样做。 你不能use strict未声明的variables自动变成符号表项,但是你真的不应该那样做。

主要原因是许多这样的function会带来明显和深奥的后果,如果不小心使用,可能会在程序中引入微妙且难以debugging的错误。 Perl使许多事情成为可能,使用某些不寻常的语言function可以节省几分钟的编码时间。 当然有些时候,深奥的function是非常方便的,他们在那里是为了利用Perl,而不是完全没有。 但是需要经验才能知道什么时候节省是值得的,因为绝大多数时候你只是为自己和其他人制造维护噩梦。

我喜欢说TMTOWTDI,BMOTWAW; 有不止一种方法可以做到这一点,但其中大部分都是错误的。

创build大型,有识字的,可维护的Perl应用程序是完全可能的。 而这样做的一个很好的部分是限制自己的语言function的一个子集。

一种情况是当你自己编写一个新语言的编译器时。 您可以:

  • 使用另一种语言为新语言的子集写一个简单的编译器。
  • 使用新语言的子集编写完整版本的编译器。

尽pipePHP最初是一种模板语言,但它已经发展成为一种全面的OO编程语言。 出于这个原因,有人说,它不再适合用作模板语言。

实际上,这只是一个纪律问题。 在创buildHTML / PHP模板时,我将自己限制在最简单的子集:条件和循环,并且没有任何业务逻辑。 没有对象实例化。 没有函数定义。 更复杂的逻辑被分成其他文件。

在.NET中,我们有一个必须在Windows 98上运行的应用程序,所以我们仅限于2.0框架,因为新版本不能在这个操作系统上运行。 不能使用LINQ,扩展方法和东西。

我避免在某些圈子被认为是有害的GOTO

不使用共同开发人员不理解的特性是合理的。 在c ++中,大部分的语言:),但c#也有有趣的结构。 像Delphi这样的旧语言可能仍然包含goto。 我倾向于避免所有模板和XML,因为我发现他们不可能干

你当然要这样做,当你编写c / c ++代码在linux和windows上工作 – 所以你限制自己到ANSI C / C ++,所以我想多平台支持是其中的原因之一。

其他原因 – 如果你想与广泛传播的软件/操作系统(如winXP,IE 6.0)最大的兼容性 – 那么你的软件针对这些应用程序/操作系统(如点networking框架2.0,而不是3.5和6,而不是ie.8) – 与旧用途有更好的兼容性。

旧的硬件兼容性/旧的graphics设备兼容性等… … –

很多次 对我来说主要的原因是跨平台的兼容性。 例子:

1)(很久以前)模板从我公司的编码标准中脱颖而出,因为它们在我们必须支持的编译器范围内太不标准

2)使用exception/ rtti for c ++ – 如果你的目标是一个embedded式平台以及桌面平台的话,这是一个不可能的事情(免责声明 – 这些年来没有做过任何这样的事情,所以现在虽然我怀疑它是否可以接受)

3).NET远程处理,如果你正在编写一个应用程序的.NET桌面和WinCE的 – 现在主要头痛:-(

没有在门户项目中使用某些.NETfunction,这些function在部分信任的环境中运行时会有问题,因为我们必须确保客户端可以将该解决scheme部署在具有弱信任策略的程序集的服务器上。

最伤的东西是没有reflection可以使用!

在很多情况下,你会无意识地做到这一点 – 你使用你知道的子集,并省去未知的特性。 在其他情况下,有多种方法可以做到这一点 – 而且您select始终坚持一种方式,因为在使用较less的语言function时,它使程序更易于阅读。 (特别是当“另一种方式”没有什么特别的优势时 – 例如,只是为了取悦来自不同语言的人)

是。

C ++是一个如此庞大而复杂的语言,很难聘请一个可以在每个function中使用其复杂性的团队。 我写的风格指南指出工程师使用某些function并避免其他function。 让工程师陷入一个bug,让他们告诉你,他们从来不知道某个构造是什么意思。 坏工程师? 也许,但我们必须在现实中工作。

正如人们已经提到的那样,像Javascript这样的语言有一些function可以让你陷入困境,所以最好避免它们。

这两个以及其他成熟的语言,如PHP和Ruby,都具有许多不同范例的特征。 要有效地使用它们,您不一定要避免某些function,而是要就如何使用大量可用工具达成一致。

我对Java感觉有点不同。 这是一个更简单的语言,我认为期望工程师知道整个语言是现实的。 你有时为了向后兼容而避免某些特性,但是否则我希望工程师知道并使用所有的Java。

我计划在接下来的几周内将Lua移交给DLR。

Lotus IBM在LotusScript R5中引入了NotesView类的getAllEntriesByKey方法,直到几年前我才真正开始使用它,现在它成为我编程的一个主要部分,作为getAllDocumentsByKey的替代scheme。

getAllDocumentsByKey并没有什么问题,而且我一直都在使用它,但是如果你所看的视图有数百甚至数千的logging(文档到Notes开发者),那么扫描你得到的集合可能会非常缓慢。 但是,如果文档值是视图列条目,那么扫描从getAllEntriuesByKey返回的viewEntryCollection会更快,不会使旧代码错误甚至无法使用,您只需要知道何时使用每个代码。

上个星期,我重新编写了一个stream程,该stream程必须遍历一个集合,该集合可以包含0到22,000个条目中的任何一个,而200个logging需要60秒运行。 新代码在2秒钟内完成(我添加了临时计时代码),更重要的是花费了相同的时间处理500个文档,这是包括unit testing在内的10分钟工作的主要胜利。 开发人员几年前在写这个子文件的时候就可以使用这个方法,但是他们要么对这个文件不了解,要么就更没有信心/不理解性能影响。

我们只能使用我们熟悉并且有信心的东西。越多的开发工作越有可能扩大您的体验,并且能够使用更多的语言function为您的客户提供高质量的软件。

我们对许多组件大量使用XSLT。 大多数组件是旧的)使用旧的parsing器,它不支持XSLT 2.0,所以即使XSLT 2.0提供了很多好的function,我们仍然在使用XSLT 1.0函数。

显然,如果function已经被弃用,那么避免这些function是个好主意,即使它们在技术上是可用的。

但是,如果您要将解释脚本分发到多台机器上运行,我通常会避免使用全新的function,所以我不强制人们升级PHP / Perl /只是为了能够运行它。

在Verilog和VHDL(用于devise芯片的编程语言)中,我们总是必须使用devise芯片时“可综合”的子集。 整个语言可以用于testing台(unit testing)。

虽然不是严格的“语言function” – 我在C#中避免的一个构造是lock(this)

这是multithreading代码中死锁条件的主要原因,因为任何人都可以locking在同一个引用上。