當涉及到設計合適的執行報告時,我總是懷疑。代碼執行期間的報告信息:最佳設計
假設你有以下(愚蠢,簡單)的情況。我將使用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