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 }

上記の場合は列挙型の方が簡単だと思います。ただし、ステータスの並べ替え順序や説明を更新する場合は、かなり難しいでしょう。

リフレクションを使用して、ルックアップテーブルの値に基づいて列挙型を動的に作成する必要がありますか?または、状態パターンを使用する必要がありますか?列挙型の反射で私が目にする問題は、パフォーマンスへの影響です。そして、状態パターンは多くの冗長なコードを生成する可能性があります。

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

4

3 に答える 3

7

このチェックをコードに散りばめるべきではありません

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

代わりに、状態パターンを使用してください。アプリケーションのモードが変わるたびに状態を変更し、すべての呼び出しを状態のメソッドに転送します。コードがよりクリーンで保守しやすくなります。

ステータスの変更に関しては、状態パターンとは関係ありません。したがって、どちらのアプローチもエレガントに使用できます。

于 2009-03-04T07:08:38.943 に答える
3

違いを含む Status クラスを作成し、それらを呼び出します。だから(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])

高速で、機能を区分化するのが簡単で、状態間の適切な継承パターンにより、違いのない機能を共有できます。

于 2009-03-04T07:07:06.280 に答える
0

私の理解では、状態パターンは UI のみまたはメモリ内のみの実行に非常に適しています。私の状況では、アプリケーション テーブルからデータを取得するときに、どのオブジェクトにキャストするかを決定するために if 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;
}

アプリケーションのステータスをデータベースに保存するには、列挙型またはルックアップ テーブルが必要なため、これはエレガントなソリューションとは言えません。

于 2009-03-04T09:51:11.940 に答える