【发布时间】:2010-11-08 06:50:09
【问题描述】:
所以我在开始一个新项目或调试现有项目时使用了大量的跟踪代码/日志记录。我想知道你用什么技术来管理它,因为我总是在提交之前删除它,然后如果出现其他问题就必须重写它。
我在考虑有一个包含所有跟踪代码的开发分支,并且 master 会很干净,但似乎很难筛选出什么是调试代码,什么应该合并。
有什么建议吗?
【问题讨论】:
所以我在开始一个新项目或调试现有项目时使用了大量的跟踪代码/日志记录。我想知道你用什么技术来管理它,因为我总是在提交之前删除它,然后如果出现其他问题就必须重写它。
我在考虑有一个包含所有跟踪代码的开发分支,并且 master 会很干净,但似乎很难筛选出什么是调试代码,什么应该合并。
有什么建议吗?
【问题讨论】:
怎么样
def debug_only
if $DEBUG
yield
end
end
...
debug_only { puts "Some tracing code." }
在命令行中传递-d 将使$DEBUG 为真。
% ruby -e 'p $DEBUG'
false
% ruby -de 'p $DEBUG'
true
在这种情况下,一种可能性是将跟踪代码与您正在跟踪的代码分开。
对于每个示例:
release.rb:
class A
def stuff(a, b)
# do stuff ...
end
end
debug.rb:
require 'release'
class A
alias release_stuff stuff
def stuff(a, b)
puts "calling stuff with (#{a.inspect}, #{b.inspect})"
rv = release_stuff(a,b)
puts "Done calling stuff."
rv
end
end
这有问题,粒度是一种方法,那么它可能再次鼓励您编写更小的方法。当然,您可以通过一些“元编程”使其不那么冗长。
您还可以使用 instance_method、bind 和 define_method 使旧方法的副本匿名。
然后你会使用类似的东西
ruby -d -rdebug program.rb
【讨论】:
def verbose() $verbose = true; yield; ensure $verbose = false end 我有一个 log() 函数,它只在 $verbose 为真时输出。但我的问题在于实际的跟踪代码,它真的很乱,我只是不希望它出现在生产代码中,我希望我的代码没有任何特定于调试的绒毛。