2009-03-04 12 views
6

私が構築するソフトウェアには、さまざまなステータス間で切り替わる「アプリケーション」が含まれます。特定のタスクは、アプリケーションの状態によって異なります。私はステータスとしてルックアップテーブルとルックアップテーブルと列挙型のリフレクションと状態パターン

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) 

を取得しないように、データベース内のルックアップテーブルを使用するために良いことだと思った私場合と同じようにする必要があります

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

私は上記のような場合はenumで行うのが簡単だと思います。しかし、ステータスのソート順や説明を更新する場合、かなり難しいでしょう。

ルックアップテーブルの値に基づいて列挙型を動的に作成する必要がありますか?または私は状態パターンを使用する必要がありますか? enum relfectionで見られる問題はパフォーマンスに影響します。そして状態パターンは、多くの冗長コードを生成することがあります。

あなたはどう思いますか?前もって感謝します!

答えて

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

データベースにアプリケーションの状態を保存する列挙またはルックアップテーブルのいずれかが必要として、私はエレガントな解決策 としてこれを見ない

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; } 

私は答え3で言及したようにelse文がなければ、ビット? – Jeff

+0

私は問題を理解するのに苦労していると思います。 Statusオブジェクトには、必要な場合には有線キャストを含め、必要なコードを含めることができます。 Applicationオブジェクトは同じままです。内部状態と異なる呼び出しをディスパッチします。 –

+0

私の問題は、あなたの例では、正しい状態のオブジェクトにキャストデータテーブルを戻すときにelse文が書き込まれないようにする方法です。else行を付けずにStatusZeroまたはStatusOneにデータ行を戻す方法を教えてください。 – Jeff

7

あなたは状態パターンを使用し、代わりにどこにでも

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

このチェックを使用してコードを振りかけるべきではありません。アプリケーションのモードが変更されるたびに状態を変更し、すべての呼び出しを状態のメソッドに転送します。はるかに洗練されたコードを簡単に管理できます。

ステータスを変更する方法は、状態パターンとは関係ありません。だから、どちらのアプローチも優雅なものを使うことができます。

0

私の理解は、UIのみまたはメモリ内での実行には非常に適しています。私の状況では、アプリケーションテーブルからデータを取り戻す際に、どのオブジェクトをキャストするかを決定するelse文が必要です。私はまだどのようにuは、オブジェクトにDBとキャストから検索を扱うん

関連する問題