2013-02-22 20 views
0

我想知道在我調用它時如何檢查例程的先決條件,以便它可以執行或通知其不可執行。語言是C#。檢查程序是否可以在C#中運行(並運行它)的可能方法

我正在實現一個帶有Controller對象,DataContainer對象和一些Task對象的Pipeline design-pattern。當控制器要求任務執行時,每項任務的責任是檢查其適用性。具體來說,它應該檢查DataContainer對象的可用數據。

我可以想像一些方法來做到這一點在Python:

# 
if Task.can_run(): 
    Task.run() 
else: 
    Task.notify_controller() 

# 
if Controller.check_runnability(Task): 
    Task.run() 
else: 
    Controller.do_something_else() 

# Task.can_run() throws exception instead of returning boolean: 
try: 
    Task.can_run(); 
except: 
    Controller.do_something_else() # or maybe Task.notify_controller() 
else: 
    Task.run() 

# not sure about syntax for the following assertion, but you get the idea 
assert (Task.can_run(), Task.notify_controller()) 
Task.run() 

我想知道些什麼(並沒有與谷歌找到)是「規範」 /最常見的/「右」只有滿足某些先決條件時才能啓動例程的C#習慣用法。

+0

控制器意味着如何處理一個說不能運行的任務? – 2013-02-22 14:58:17

+0

@TonyHopkinson它將取決於任務或甚至控制器範圍之外的更高級別的條件。例如,控制器可能會調用另一個使用不同算法的任務,或者直接向GUI(最終導致)提示某些(以及哪個)先決條件不適用的信息。 – heltonbiker 2013-02-22 17:02:17

+0

鑑於我想eijther有控制器調用canrun,或者只是傳遞無法從運行回跑。看起來沒有任何價值讓它變得更加複雜。 – 2013-02-22 17:19:37

回答

1

第一個例子是最常見的模式。第二個對我來說只是第一個具有較少語義命名約定的變體。

我會遠離第三個例子。例外情況不應用於指導流量的正常控制。 http://msdn.microsoft.com/en-us/library/vstudio/ms229030(v=vs.100).aspx

編輯: 我回來了。第二個例子看起來很相似,但它要求控制器確定任務是否可以運行。如果「可運行性」完全基於任務對象的內容而不是基於控制器的某種狀態,那麼我認爲無需通過將檢查放入控制器來使事情複雜化。如果邏輯足夠相似,我會使用基本任務類來保持乾燥。

編輯: 我不清楚你的確切用例,但這可能是完全關閉的基礎,但對我來說好像控制器會問任務它是否準備運行,如果是的話它會運行任務如果沒有,它會做別的。

if (task.CanRun) 
{ 
    controller.Run(task); 
} 

else 
{ 
    //Do whatver. 
} 

而且,如果邏輯封裝對於控制器內什麼時,任務不能運行,那麼也許run方法應該返回一個布爾值所以調用者在需要時可以做一些更多的應該做的事。在這種情況下,調用者只是將任務傳遞給控制器​​運行方法,並在那裏控制器檢查任務是否可以運行並相應地執行。

+0

有趣。根據我在問題中提供的鏈接,任務應該在被控制器調用時進行預測試,反過來只處理'Task.run()'中的任何異常(正常控制流程之外)。這些例子只是一些建議,因爲我從來沒有這樣做過,但顯然這是生產質量代碼的一個好習慣。 – heltonbiker 2013-02-22 17:09:31

+1

(爲了對這種設計模式「啓發」,微軟稱之爲Pipes-And-Filters,下面的文章絕對值得一讀:http://keyvan.io/pipes-and-filters-pattern-in-淨) – heltonbiker 2013-02-22 17:26:01

相關問題