如果您选择的脚本语言没有类似Perl的strict模式,您如何捕捉错别字?你是否正在测试一切?每个构造函数,每个方法?这是唯一可行的方法吗?
答案 0 :(得分:32)
真正彻底的单元测试是最重要的技术(是的,我总是以100%的覆盖率为目标),因为它们还会捕获许多其他拼写错误(例如我在哪里写+
并且意味着-
执行每个功能的集成和负载测试是抵御各种错误的第二道防线(主要是,更深层次和更难的错误; - )。
接下来是pylint和pychecker等工具以及着色编辑器(我不使用真正的IDE,但它们也有助于我可靠的gvim编辑器的工作方式; - )。
强制性代码审查等技术(例如,参与我对该主题的访谈的视频here)虽然至关重要,但应关注其他问题 - 自动化的问题工具只是不会捕获,例如评论/文档字符串的完整性和正确性,优秀/快速算法的选择等(请参阅here以获取我给出的演讲摘要在我接受采访的同一会议上的主题,以及幻灯片“PDF”的链接。
答案 1 :(得分:3)
“拼写错误”以外的错误。如果你没有测试某些东西,那么知道发现拼写错误的变量名称的东西无论如何都不能保证你。
答案 2 :(得分:3)
某些编辑器(例如,NetBeans)会分析您的代码并为“可疑”部分加下划线,例如未使用的变量,这可能是拼写错误的标志。 NB还会在屏幕的其他位置突出显示光标上方的标识符,这也有帮助。
当然,没有聪明的IDE技巧可以取代正确的测试。
答案 3 :(得分:1)
TDD - 首先编写测试,然后编写最简单的代码以通过测试。这样你就可以更加确定你没有任何未经测试的代码。这有助于确保代码中的拼写错误或其他错误更少。
结对编程/代码审查 - 两双眼睛比一对眼睛好。
具有智能感知的IDE - 不是灵丹妙药,但在不拼写错误方面有很大帮助。如果使用intellisense,通常会出现替换错误,而不是拼写错误。通过测试不难发现这些。答案 4 :(得分:1)
在ruby中,拼写错误的局部变量会导致程序死亡,这很好。
拼写错误的实例变量不会导致程序死得很厉害,这很糟糕。要检测此类案例,use warnings。不幸的是,你不能轻易地告诉ruby treat warnings as errors。
答案 5 :(得分:1)
就我而言,我广泛使用单元测试(用Python开发)。因为有很多轻量级的测试框架很好地集成到语言中(如果你愿意,还可以使用IDE),使用它们会让你几乎不会感到痛苦;)
看看这个例子:
def unpack_args(func):
def deco_func(*args):
if isinstance(args, tuple):
args = args[0]
return func(*args)
return deco_func
def func1(*args):
"""
>>> func1(1,2,3)
(1, 2, 3)
>>> func1(*func2(1,2,3))
(1, 2, 3)
>>> func1(func2(1,2,3))
((1, 2, 3),)
"""
return args
def func2(*args):
"""
>>> func2(1,2,3)
(1, 2, 3)
"""
return args
@unpack_args
def func3(*args):
return args
def test():
"""
>>> func3(func2(1,2,3))
(1, 2, 3)
"""
import doctest
doctest.testmod(verbose=True)
test()
-----------------------------
Results:
Trying:
func1(1,2,3)
Expecting:
(1, 2, 3)
ok
Trying:
func1(*func2(1,2,3))
Expecting:
(1, 2, 3)
ok
Trying:
func1(func2(1,2,3))
Expecting:
((1, 2, 3),)
ok
Trying:
func2(1,2,3)
Expecting:
(1, 2, 3)
ok
Trying:
func3(func2(1,2,3))
Expecting:
(1, 2, 3)
ok
3 items had no tests:
__main__
__main__.func3
__main__.unpack_args
3 items passed all tests:
3 tests in __main__.func1
1 tests in __main__.func2
1 tests in __main__.test
5 tests in 6 items.
5 passed and 0 failed.
Test passed.
答案 6 :(得分:1)
我认为'拼写'你的意思是错误输入变量/函数/类名。这在Python中比在Perl中少一个问题,因为默认情况下Perl(我相信Ruby)会自动创建一个变量并在第一次使用时将其初始化为零或“”。 Python没有这样做,因为使用尚未显式创建的变量是一个错误,所以从这个意义上说它已经处于'严格'模式。
我将Vim与pyflakes插件一起使用,一旦您输入它就会突出显示大多数类型的拼写错误。我也经常使用pylint和pychecker,因为它们可以捕获许多其他类型的错误。
我做的另一件事是大量使用Vim的自动完成 - 我只输入一次完整的名字,然后在名字的后续使用中输入前几个字母并使用 <ctrl-n>
或 <ctrl-p>
循环比赛。
我还使用测试驱动开发,目标是100%单元测试覆盖率。
我发现所有这些实践的结合意味着由错别字引起的问题几乎不存在。
答案 7 :(得分:0)
许多单元测试工具可以显示他们测试的行数百分比。这个百分比越接近100%,变量名称拼写就越不可能。
答案 8 :(得分:0)
在Groovy中,构成程序的抽象语法树(AST)随时可用。因此可以编写检查AST的工具,并针对可能出错的事情发出警告。
例如,如果您尝试调用在编译时不存在的方法,GroovyLint将警告您,但是非常接近存在的方法。
示例:
class Test{
static def foobar(){ return 5; }
}
Test.fooBar() //Here GroovyLint suggests calling foobar instead of fooBar.
答案 9 :(得分:-1)
我在eclipse IDE中编写了所有Python代码。正如MladenJablanović所暗示的那样,eclipse强调了可疑部分。
下一步是运行代码。现在我可能面临两种错误。
解释器捕获的错误并给我一个行号:这些通常很容易调试,特别是如果你在该行之前打印该行中的所有变量,以确保它们包含值你期望的那样。
意外行为:您的代码很好,解释器不会抱怨,但您的代码行为不符合您的要求。当这种情况发生时(很少,因为我通常很好地设计我的模块 - 一个大约需要7分钟的过程 - 在我开始编码之前)我开始按照它们被调用的顺序查看模块/函数并尝试执行程序我的头像翻译一样会看到它。如果这不起作用,那么我继续探索调试器。通常情况下,它并没有归结为这一点,但如果确实如此,这是一个相当大的bug,它需要相当长的时间来修复。单元测试有帮助,但坦率地说,我认为作为一名计算机科学家,我应该能够从算法分析的角度进行调试,这通常比单元测试更快(至少对我而言)。另外,选择对单元测试进行算法分析可以锻炼我的大脑,这样我就不会在将来犯这样的错误,而不是单元测试,这有助于我现在解决问题,但在帮助方面做得不多我避免在将来犯同样/类似的错误。
希望这有帮助