您是否曾限制自己使用语言功能的子集,更重要的是,为什么?
我很想知道谁选择仅使用某些语言功能并避免使用其他功能,以便在内存使用,执行速度或普通旧可读性和可维护性等方面赢得大奖。通过这样做,它产生了预期的结果,或者它可能只是妨碍了生产软件的其他方面。是否有任何关于这个主题的警示故事或狂野的成功故事值得分享?
答案 0 :(得分:27)
一些不好的部分是:
<强> EVAL 强>
<强> == 强>
与不同类型的操作数混淆和模棱两可
<强>与强>
不可预知的结果
答案 1 :(得分:14)
大多数人在他们所熟悉的选择语言的非正式子集中潜意识地编程。例如,我第一次提出需要迭代的C ++向量是为了达到for循环,而不是编写谓词并使用标准库算法。可能是我的失败,但至少我知道如果我真的需要它,算法就在那里。
我最后一次记得用子集语言写作是在80年代,当时我的大部分目标平台都支持FORTRAN 77,但其中一个没有正确,所以我不得不用FORTRAN 77 / FORTRAN IV混合编写。这是一种痛苦 - 近年来事情变得更好,主要归功于FOSS运动。
答案 2 :(得分:12)
是的,一直都是。
因为我使用Perl,并且大多数人都同意我们的许多语言功能最好不要使用,除非你真的需要并且你知道你在做什么。例如,支持符号引用,但不应使用它们。 goto
存在,但您不应该使用它。您可以将变量标签重新用作不同类型,例如$var
,@var
,%var
,但您也不应该这样做。您不能use strict
让未声明的变量自动成为符号表条目,但真的不应该这样做。
主要原因是许多此类功能具有明显和深奥的后果,如果不小心使用,可能会在程序中引入细微且难以调试的错误。 Perl使许多事情成为可能,使用某些不寻常的语言功能来节省几分钟的编码会很有吸引力。当然有时候深奥的功能很方便,而且你可以在Perl中利用它,而不是完全缺席。但是需要经验才能知道什么时候可以节省开支,因为绝大多数时候你只是在为自己和其他人制造维护噩梦。
我喜欢TMTOWTDI,BMOTWAW; 这样做的方法不止一种,但大多数方法都是错误的。
完全可以创建大型,有文化,可维护的Perl应用程序。这样做的一个很好的部分就是限制自己使用语言功能的一部分。
答案 3 :(得分:10)
一种情况是你自己编写一种新语言的编译器。你可以:
答案 4 :(得分:8)
虽然PHP最初是一种模板语言,但它已经发展成为一种成熟的OO编程语言。出于这个原因,有人说它不再适合用作模板语言。
但是,真的,这只是一个纪律问题。在创建HTML / PHP模板时,我将自己局限于可能的最简单的子集:条件和循环,没有任何业务逻辑。没有对象实例化。没有功能定义。更复杂的逻辑被分成其他文件。答案 5 :(得分:8)
在.NET中,我们有一个必须在Windows 98上运行的应用程序,因此我们仅限于2.0框架,因为较新的版本不能在此操作系统上运行。这太可悲了。不能使用LINQ,扩展方法和东西。
答案 6 :(得分:6)
我避免在某些圈子中被视为有害的GOTO
。
答案 7 :(得分:4)
不使用您的共同开发人员不理解的功能是有意义的。在c ++中,大多数语言都是:),但c#也有一些有趣的结构。像Delphi这样的老语言可能仍然包含goto。我倾向于避免使用所有模板和XML,因为我发现它们无法干掉
答案 8 :(得分:3)
当您编写c / c ++代码以在Linux和Windows上运行时,你肯定会这样做 - 因此你将自己局限于ANSI c / c ++, 所以我认为多平台支持是其中一个原因。
其他原因 - 如果你想与广泛传播的软件/操作系统(如winXP,IE 6.0)最大程度的兼容 - 那么你将你的软件定位到那些应用程序/操作系统(如dot net framework 2.0而不是3.5和Ie 6而不是ie .8) - 与旧用途具有更好的兼容性。
同样适用于旧硬件兼容性/旧图形设备兼容性等......
答案 9 :(得分:3)
很多次。我的主要原因是跨平台兼容性。例子:
1)(很久以前)模板从我公司的编码标准中删除,因为它们在我们不得不支持的编译器范围内太不标准了
2)对c ++使用例外/ rtti - 如果你的目标是嵌入式平台以及桌面平台,那就是禁忌(免责声明 - 多年来没有做过任何这样的事情,所以现在可能更容易接受我对此表示怀疑)
3)如果您正在为.NET桌面和WinCE编写应用程序,请进行.NET远程处理 - 现在主要是头痛: - (
答案 10 :(得分:2)
未在门户项目中使用某些.NET功能,这些功能在部分受信任的环境中运行时会出现问题,因为我们必须确保客户端可以在具有弱信任策略的程序集的服务器上部署解决方案。
最受伤害的是没有反思可以使用!
答案 11 :(得分:1)
在许多情况下,你无意识地这样做 - 你使用你知道的子集并省略未知的功能。在其他情况下,有多种方法可以做到 - 并且您选择始终坚持一种方式,因为它使程序在使用较少的语言功能时更容易阅读。 (特别是当“另一种方式”没有特别的优势时 - 例如,它只是为了取悦来自不同语言的人们)
答案 12 :(得分:1)
我们对许多组件大量使用XSLT。大多数组件都是旧的)使用旧的解析器,它不支持XSLT 2.0,所以我们仍然使用XSLT 1.0函数,即使XSLT 2.0提供了许多好的功能。
答案 13 :(得分:1)
Lotus IBM在LotusScript R5中引入了NotesView类的getAllEntriesByKey方法,直到几年前我还没有真正开始使用它,现在它已成为我编程的主要部分,作为getAllDocumentsByKey的替代。
getAllDocumentsByKey没有任何问题,我一直都在使用它,但如果您查看的视图有数百甚至数千条记录(Notes开发人员的文档),那么扫描您收到的集合可能会非常慢。但是,如果文档值是一个视图列条目,那么扫描viewEntryCollection,你从getAllEntriuesByKey返回的速度更快,不会使旧代码错误甚至无法使用,你只需要知道何时使用每个代码。
上周我重新编写了一个必须遍历一个集合的进程,该集合可以包含0到22,000个条目之间的任何内容,200个记录需要60秒才能运行。新代码在2秒内完成(我添加了临时计时代码),更重要的是花费了500个文档的相同时间,这是包括单元测试在内的十分钟工作的重大胜利。几年前,当他们编写sub时,开发人员可以使用这种方法,但他们要么不知道它,要么更可能没有信心/不了解性能影响。
我们只能使用我们熟悉的并且有信心。您开展的开发工作越多,您就越有可能扩大您的体验,并能够使用更多语言功能为您提供高质量的软件。客户。
答案 14 :(得分:1)
我计划在接下来的几周内将Lua移植到DLR。
答案 15 :(得分:1)
是
C ++是一种如此庞大,复杂的语言,很难雇用一个可以完全复杂地使用每个功能的团队。我编写风格指南,指出工程师使用某些功能并避免使用其他功能。让工程师坚持使用bug并让他们告诉你他们从未知道某个构造意味着什么是令人痛苦的。坏工程师?也许,但我们必须在现实中工作。
正如人们所提到的,像Javascript这样的语言有一些功能可以让你遇到麻烦,所以最好避免使用它们。
这些以及其他成熟语言(如PHP和Ruby)都具有许多不同范例的功能。要有效地使用它们,您不一定要避免使用某些功能,而是要就如何使用现有的大量工具达成一致。
我觉得Java有点不同。这是一种更简单的语言,我认为期望工程师了解整个语言是切合实际的。您有时会避免某些功能以实现向后兼容,但我希望工程师知道并使用所有Java。
答案 16 :(得分:0)
显然,如果功能被弃用,最好避免使用它们,即使它们在技术上可用。
但是,如果您要分发解释脚本以在混合机器上运行,我通常会避免使用全新功能,因此我不会强迫人们升级PHP / Perl /只是为了能够运行它。
答案 17 :(得分:0)
在Verilog和VHDL(用于设计芯片的编程语言)中,我们总是必须在设计芯片时使用“可合成”的子集。整个语言可用于测试台(单元测试)。
答案 18 :(得分:0)
虽然不是严格意义上的“语言特征” - 我在C#中避免的一个构造是lock(this)
这是多线程代码中死锁条件的主要原因,因为任何人都可以锁定相同的引用。