当涉及到设计合适的执行报告时,我总是怀疑。代码执行期间的报告信息:最佳设计
假设你有以下(愚蠢,简单)的情况。我将使用python。
def doStuff():
doStep1()
doStep2()
doStep3()
现在,假设你想给的各个步骤的报告,如果出现错误等没有真正的调试:应用程序的只是信息的行为。
第一,简单的办法是把打印
def doStuff():
print "starting doing stuff"
print "I am starting to do step 1"
doStep1()
print "I did step 1"
print "I am starting to do step 2"
doStep2()
print "I did step 2"
print "I am starting to do step 3"
doStep3()
print "I did step 3"
在一般情况下,这是相当糟糕的。假设这段代码将在一个库中结束。我不希望我的图书馆打印出来。我希望它能够默默地完成这项工作。不过,有时我想提供信息,不仅在调试情况下,而且还要向用户通知实际正在进行的工作。打印也很糟糕,因为您无法控制消息的处理。它只是stdout,除了重定向之外,你无能为力。
另一种解决方案是有一个记录模块。
def doStuff():
Logging.log("starting doing stuff")
Logging.log("I am starting to do step 1")
doStep1()
Logging.log("I did step 1")
Logging.log("I am starting to do step 2")
doStep2()
Logging.log("I did step 2")
Logging.log("I am starting to do step 3")
doStep3()
Logging.log("I did step 3")
这样做的好处是您可以为您的日志记录服务知道一个独特的位置,并且您可以根据需要调整此服务。您可以将其静音,将其重定向到文件,标准输出或甚至网络。缺点是你与记录模块有很强的耦合。基本上你的代码的每个部分都依赖于它,并且你有打电话到处登录。
的第三种选择是有一个清晰的界面报表对象,而且你通过它周围
def doStuff(reporter=NullReporter()):
reporter.log("starting doing stuff")
reporter.log("I am starting to do step 1")
doStep1()
reporter.log("I did step 1")
reporter.log("I am starting to do step 2")
doStep2()
reporter.log("I did step 2")
reporter.log("I am starting to do step 3")
doStep3()
reporter.log("I did step 3")
最后,你也可以通过记者对象doStepX(),如果他们有更多的话要说。 优点:它减少了与模块的耦合,但它引入了与NullReporter对象实例化的耦合。 另:这可以通过使用无作为默认和检查呼叫日志,这是笨拙的,因为在Python中,你必须有条件每次(在C你可以定义一个宏)
def doStuff(reporter=None):
if reporter is not None:
reporter.log("starting doing stuff")
# etc...
编辑写之前得到解决选项是类似于Qt,并有一个emit()信号策略。随着代码的执行,它会发出带有适当状态代码的信息,任何感兴趣的人都可以订阅这些信号并提供信息。不错,干净,非常分离,但需要一些编码,因为我认为这可以很快用包含的蟒蛇电池来完成。
最后,您可以用有意义的错误消息引发异常,但这当然只能在您退出错误条件时才能使用。它不适用于偶尔的报告。
编辑:我想澄清的事实,情况是更一般的,而不是仅限于一系列被调用的步骤。它也可能涉及控制结构:
if disconnected:
print "Trying to connect"
connect()
else:
print "obtaining list of files from remote host"
getRemoteList()
该报告还可以进入实际程序,所以你必须在connect()和getRemoteList()程序“打印”作为第一条语句。因此
的问题是:
- 你认为什么是一些代码(特别是在图书馆的情况下)最好的设计是在同一时间沉默的时候噪音可能是颠覆性的客户端,但是有用时冗长?
- 如何处理逻辑代码和报告代码之间的平衡混合?
- 代码和错误检查之间的混合已被解决,但有例外。可以做些什么来划分代码逻辑报告的“噪音”?
编辑:为心灵
更多的想法,我认为这不仅是从逻辑代码去耦日志代码的问题。我认为这也是将信息生产和信息消费分开的问题。类似的技术已经存在,尤其是处理UI事件,但我并没有真正看到应用于日志记录问题的相同模式。
编辑:我接受了来自马塞洛的答案,因为他在事实证据表明,妥协是在这种情况下,最好的解决办法,而且也没有银弹指出。然而,所有其他人都是有意思的答案,我很高兴能够全部赞扬他们。谢谢您的帮助!
我添加了一个赏金,看看是否可以在这个问题上做进一步的讨论。此外,这是mu第一次赏金开放,所以我也很好奇。 – 2009-04-14 01:36:39