我对编码实践有一般性问题......
在调试时,在我的代码的某些时候,我需要一些代码来打印当前状态;当我不调试时,我不想将代码保留在那里,因为它会妨碍其他代码的可见性......
很难将它们打包成一个函数,因为大部分时间它都涉及局部变量,而且我不想将所有内容都作为参数传递...
那么你如何管理这种“打印/检查”代码呢?有什么好的做法吗?
答案 0 :(得分:6)
我曾经有一个调试函数,只有在设置了一个标志时才会打印最终的字符串。现在,我更愿意添加if
语句:
我也曾经有过camlp4宏,它会从函数应用程序中生成if
语句,但它只适用于使用camlp4的项目,我现在倾向于避免使用它。
请注意,通常,我不使用一个调试标志,而是使用许多调试标志,每个模块一个,然后是meta标签,它们将触发几个模块或正交方面的调试。它们作为标志列表放在哈希表中,我可以使用参数或环境变量来设置它们。
答案 1 :(得分:5)
我经常使用调试函数,只有在调试标志设置为true时才打印值:
let debug_flag = ref false
let debug fmt =
if !debug_flag then Printf.eprintf fmt
else Printf.ifprintf stderr fmt
答案 2 :(得分:4)
我使用日志语法扩展名:
您还可以使用AuxIO.log
将行号传递给日志功能(在上面的源代码中硬编码为Loc.start_line _loc
)(也许我会添加它)。
请注意,条件应该是语法扩展的一部分,这样如果它不需要打印它们就不会计算参数。此外,我们有灵活的“printf”语法。
另外,我在Emacs中使用命令:
(defun camldev-insert-log-entry ()
(interactive)
(insert "(* {{{ log entry *)
LOG 2 \"\";
(* }}} *)")
(goto-char (- (point) 12)))
与`折叠模式'一起。