2009-03-04 198 views
6

我將建設將涉及到「應用程序」的不同狀態之間切換了大量的軟件。某些任務可以完成取決於應用程序所處的狀態。我想使用枚舉的狀態枚舉VS查找表VS枚舉反射VS State模式

public class Application 
{ 
    public int Id {get;set;} 
    public Status {get;set;} 
} 
public enum Status 
{ 
    [Description("New")]New = 1, [Description("Closed")]Closed = 2 
} 

但轉念一想,也許這是很好用的查找表在數據庫中的地位不會得到更新/重新排序往往

table status (id int pk, desc string, sort_order int) 
table application (id int pk, status_id int fk) 

在我case我需要做的事情,如

if (application.Status == Status.New) 
{ //do something } 
else if (application.Status == Status.Closed) 
{ //do other things } 

我認爲上面的情況是更容易做與枚舉。但是,當涉及到更新狀態排序順序或描述時,這將非常困難。

我應該用反射基於從查找表值來動態創建枚舉?或者我應該使用狀態模式?我看到與枚舉重新感謝問題是性能影響。狀態模式會產生大量的冗餘代碼。

您認爲如何?提前致謝!

回答

3

我想創建一個包含差異的狀態類,並調用這些。所以(在Python):

class StatusZero(object): 
    def call_me(self, app): 
     print 'Hello, from ' + app.name 
     return db.prepare_specific_status_zero_request() 


class StatusOne(object): 
    def call_me(self, app): 
     print 'Hi, from ' + app.name 
     return db.prepare_specific_status_one_request() 

states = { 'status_zero' : StatusZero(), 'status_one' : StatusOne() } 

class Application(object): 
    name = 'My App' 
    status = states['status_zero'] 

    def change_state(self, state): 
     status = state 

    def call_me(self): 
     state_key = self.status.call_me(self) 
     self.change_state(states[state_key]) 

快速,容易保持的功能劃分,並且與狀態之間的合理的遺傳模式,你可以分享這沒有什麼不同的功能。

+0

您是如何從數據庫處理檢索和轉換爲對象如果我在答案3中提到,否則沒有其他陳述? – Jeff 2009-03-04 09:58:15

7

你不應該用這種檢查灑你的代碼到處

if (application.Status == Status.New) 
{ //do something } 
else if (application.Status == Status.Closed) 
{ //do other things } 

相反,使用狀態模式。每當應用程序的模式發生變化時更改狀態,並將所有調用轉發給狀態的方法。您將擁有更簡潔,更易於維護的代碼。

對於改變現狀,已經什麼都沒有做的狀態模式。所以你可以使用任何一種方法都很優雅。

0

我的理解是,國家模式是UI只或只在內存中執行,檢索數據從申請表回來時,凡在我的情況,但仍然需要是如果else語句來決定投什麼對象相當不錯。

public AbstractApplication convert_db_application_to_object(obj db_application) 
{ 
    AbstractApplication app; 
    if (db_application.Status == (int)Status.New) 
     app = application_factory.create(application_state_new); 
    else if(db_application.Status == (int)Status.Closed) 
     app = application_factory.create(application_state_closed); 

    return app; 
} 

我不認爲這是一個很好的解決方案 ,因爲我還需要無論是枚舉或查找表的應用程序狀態保存到數據庫