您是否曾限制自己使用语言功能的子集?

Jon*_*ney 41 language-agnostic language-features

您是否曾限制自己使用语言功能的子集,更重要的是,为什么?

我很想知道谁选择只使用某些语言功能并避免使用其他功能,以便在诸如但不限于内存使用,执行速度或普通旧可读性和可维护性等方面赢得大奖.通过这样做,它产生了预期的结果,或者它可能只是妨碍了生产软件的其他方面.是否有任何关于这个主题的警示故事或狂野的成功故事值得分享?

Bri*_*say 28

Douglas Crockford的书Javascript:The Good Parts就是一个很好的例子.他列出了应该避免的javascript中的"功能",并提供了使用该语言的"好部分"的替代方案.

一些不好的部分是:

  • eval
    慢,难读,危险不安全

  • ==
    用不同类型的操作数混淆和模糊


  • 不可预知的结果

  • 谢谢Brian.您或您的团队是否特别应用了这些规则?如果是这样,它会导致任何尴尬或有趣的事情? (2认同)

小智 15

大多数人在他们所熟悉的选择语言的非正式子集中潜意识地编程.例如,我第一次提出需要迭代的C++向量是为了达到for循环,而不是编写谓词并使用标准库算法.可能是我的失败,但至少我知道如果我真的需要它,算法就在那里.

我最后一次记得用子集语言写作是在80年代,当时我的大多数目标平台都支持FORTRAN 77,但其中一个没有正确,所以我不得不用FORTRAN 77/FORTRAN IV混合编写.这是一种痛苦 - 近年来事情变得更好,主要归功于FOSS运动.


Ada*_*ire 12

是的,一直都是.

因为我使用Perl,并且大多数人都同意我们的许多语言功能最好不要使用,除非你真的需要并且你知道你在做什么.例如,支持符号引用,但不应使用它们. goto存在,但你不应该使用它.您可以重复使用变量标签为不同类型,例如$var,@var,%var,但你不应该这样做,无论是.你不能use strict让未声明的变量自动成为符号表条目,但你真的不应该这样做.

主要原因是许多这样的功能具有明显和深奥的后果,如果不小心使用,可能会在程序中引入细微且难以调试的错误.Perl使许多事情成为可能,使用某些不寻常的语言功能来节省几分钟的编码会很有吸引力.当然有时候深奥的功能很方便,而且你可以在Perl中利用它,而不是完全缺席.但是需要经验才能知道什么时候可以节省开支,因为绝大多数时候你只是在为自己和其他人制造维护噩梦.

我喜欢说TMTOWTDI,BMOTWAW; 这样做的方法不止一种,但大多数方法都是错误的.

完全可以创建大型,有文化,可维护的Perl应用程序.这样做的一个很好的部分是限制自己的语言功能的子集.

  • 在Perl中使用goto是有正当理由的 - 如果我使用AUTOLOAD,我几乎总是使用它.(制作一个匿名子程序,将其插入符号表,然后"转到"它,所以如果有人看到`caller`,他们会看到正确的函数,而不是AUTOLOAD) (3认同)

Meh*_*ari 11

一种情况是你在编写一种新语言的编译器.您可以:

  • 使用另一种语言为新语言的子集编写简单的编译器.
  • 使用新语言的子集为其自身的完整版本编写编译器.


Luc*_*man 8

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

但实际上,这只是一个纪律问题.在创建HTML/PHP模板时,我将自己局限于可能的最简单的子集:条件和循环,没有任何业务逻辑.没有对象实例化.没有功能定义.更复杂的逻辑被分成其他文件.

  • 我避免使用所有PHP功能. (3认同)
  • 关于PHP的主题,许多开发人员避免使用某些PHP功能(例如`register_globals`),因为它们被认为会带来安全风险. (2认同)

Ped*_*dro 8

在.NET中,我们有一个必须在Windows 98上运行的应用程序,因此我们仅限于2.0框架,因为较新的版本不能在此操作系统上运行.这太可悲了.不能使用LINQ,Extensions方法和东西.

  • 您实际上可以在.NET 2.0中使用扩展方法(如果使用3.5编译器进行编译),请参阅http://www.danielmoth.com/Blog/2007/05/using-extension-methods-in-fx-20.html (6认同)
  • 其中一些功能仅限编译时,因此您仍然可以使用它们.例如,我使用VS 2008但目标是.NET 2.0.我可以通过http://www.albahari.com/nutshell/linqbridge.aspx使用扩展方法和LINQ到对象. (5认同)
  • 这是一个非常好的例子,当语言更改依赖于运行时更改时,这种情况也会发生.我想补充一点,某些功能在.Net Micro Framework中不起作用,所以如果你试图为两者编写代码,你必须使用有限的子集 (2认同)

Sam*_*rum 6

我避免GOTO在某些圈子中认为有害.

  • 取决于语言.在汇编中,您几乎需要使用goto. (4认同)

Dan*_*ani 3

当你编写 c/c++ 代码以在 linux 和 windows 上运行时,你肯定会这样做 - 所以你将自己限制在 ANSI c/c++ 上,所以我想多平台支持是原因之一。

其他原因 - 如果您希望与广泛的软件/操作系统(例如 winXP、IE 6.0 )实现最大兼容性 - 那么您将软件定位到这些应用程序/操作系统(例如 dot net Framework 2.0 而不是 3.5 以及 Ie 6 而不是 ie.8) - 与旧用途有更好的兼容性。

旧硬件兼容性/旧图形设备兼容性等也是如此......