Jon*_*ney 41 language-agnostic language-features
您是否曾限制自己使用语言功能的子集,更重要的是,为什么?
我很想知道谁选择只使用某些语言功能并避免使用其他功能,以便在诸如但不限于内存使用,执行速度或普通旧可读性和可维护性等方面赢得大奖.通过这样做,它产生了预期的结果,或者它可能只是妨碍了生产软件的其他方面.是否有任何关于这个主题的警示故事或狂野的成功故事值得分享?
Bri*_*say 28
Douglas Crockford的书Javascript:The Good Parts就是一个很好的例子.他列出了应该避免的javascript中的"功能",并提供了使用该语言的"好部分"的替代方案.
一些不好的部分是:
eval
慢,难读,危险不安全
==
用不同类型的操作数混淆和模糊
与
不可预知的结果
小智 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应用程序.这样做的一个很好的部分是限制自己的语言功能的子集.
尽管PHP最初是一种模板语言,但它已经发展成为一种成熟的OO编程语言.出于这个原因,有人说它不再适合用作模板语言.
但实际上,这只是一个纪律问题.在创建HTML/PHP模板时,我将自己局限于可能的最简单的子集:条件和循环,没有任何业务逻辑.没有对象实例化.没有功能定义.更复杂的逻辑被分成其他文件.
在.NET中,我们有一个必须在Windows 98上运行的应用程序,因此我们仅限于2.0框架,因为较新的版本不能在此操作系统上运行.这太可悲了.不能使用LINQ,Extensions方法和东西.
当你编写 c/c++ 代码以在 linux 和 windows 上运行时,你肯定会这样做 - 所以你将自己限制在 ANSI c/c++ 上,所以我想多平台支持是原因之一。
其他原因 - 如果您希望与广泛的软件/操作系统(例如 winXP、IE 6.0 )实现最大兼容性 - 那么您将软件定位到这些应用程序/操作系统(例如 dot net Framework 2.0 而不是 3.5 以及 Ie 6 而不是 ie.8) - 与旧用途有更好的兼容性。
旧硬件兼容性/旧图形设备兼容性等也是如此......