coding-style - template - progress bar中文




向用戶報告進度時如何製作最乾淨的代碼? (9)

過去幾個月我一直在努力想出一些乾淨的代碼來向用戶報告進度。 一切總是似乎歸結為:

ReportProgress("Starting Task 1");
doTask1();
ReportProgress("Task 1 is done");

ReportProgress("Starting Task 2");
doTask2();
ReportProgress("Task 2 is done");

//etc... where report progress does some form of output to the user.

我這個好的編碼器尖叫著“要有一個更乾淨的方法!” 但我很難過 有什麼想法嗎?

編輯::我正在尋找更多的信息,而不是具體的實施建築信息。 給出的代碼是非常簡單的。


AOP建議+1。 AOP將會優雅地解決這個問題,這是一個經典的橫切關注點。


一個相當簡單和乾淨的方法是創建一個具有do()方法和抽象doTask()和getName()方法的抽像類:

do() {
    ReportProgress("Starting " + this.getName());
    doTask();
    ReportProgress("Finished " + this.getName());
}

然後在你的任務:

class Task1 extends Task {
    getName(){return "Task 1";}
    doTask() {
        //do stuff here
    }
}

然後你可以有一個任務,它有一個doTask()方法,可以在一大堆其他任務上運行do() 。 這很容易遞歸,因為任何任務都可以運行一些子任務。


你可能使用面向方面的編程 ,並設計一個進步方面?

有很多AOP實現。 在Java世界中,最常見的是AspectJ和Spring(它使用AspectJ或基於代理的方面)。


假設你正在做的模式是:

  • 日誌任務啟動
  • 做任務
  • 日誌任務結束

你可以有一個“任務”類(父所有的任務),其do()方法是子類,並自動記錄任務的開始和結束。

只是一個想法。


在我們的工具包中,我們有一個任務控制器來管理任務。 一個任務是作為一個線程運行的。 除了典型的線程支持外,任務還支持進度方法。 進度的一個可能的觀點是具有標題的視覺進度條,其涉及任務名稱和任務內的步驟。 為了支持可見的統計和狀態,代碼必須偶爾調用任務的進度方法。 通常,這是在for循環內完成的,因為百分比進度可以通過當前索引除以限制來估計。

任務控制器是添加全局線程控制,狀態探測器,其他統計和性能測量鉤子的有用的地方。 一些多線程的錯誤和時間問題可以通過檢查控制器的狀態和所有任務的狀態來分析。


如果您使用的是.NET,我會建議使用Enterprise Library (最低版本:3.1)中的策略注入應用程序塊。 我用一個類似的東西做一個“恢復到應用程序池的身份”為一個模擬的網站是沉重的。

你可以做你的任務一樣。 您可以簡單地使用一個工廠定義一個任務類,該工廠使用企業庫對象工廠構建對象,並自動向該任務添加“之前”和“之後”消息。 這將給予你所要求的優惠。

玩的開心!


您可以創建一個具有名稱屬性和委託的任務類。 將每個任務放在一個集合中,然後遍歷它,打印消息並調用每個任務的委託。


您可以從doTask方法內部調用ReportProgress,這可能會使它看起來更乾淨一些,而您只需要:

doTask1();
doTask2();

報告將在這些方法內處理。

你可以使用AOP,但是在這種情況下,我的大腦尖叫KISS !!(Keep It Simple Stupid)。 如果這只是您正在處理的更複雜的事情的簡單表示,則AOP可能是一種選擇。


這取決於需要多少配置,我期望的代碼是非常普遍的,並有任務通過彈簧或任何ioc容器設置。

這將全部在彈簧配置中:xml配置將為任務對象提供其名稱和參數。 然後將這些任務添加到集合中,並將該集合交給taskrunner。

然後任務運行者就是代碼,它表示每個任務的停止和開始,但是每個任務都可以自由地給出具體狀態。 此外,taskrunner將捕捉任何異常,並繼續前進,如果事情出錯。 可以說可以配置某些任務取決於其他任務的完成,而某些任務如果失敗則應該停止。

我不同意在這裡使用AOP。 矯枉過正。





progress-bar