2009-03-04 2 views
6

제가 구축하게 될 소프트웨어에는 서로 다른 상태간에 "응용 프로그램"전환이 필요합니다. 특정 작업은 응용 프로그램의 상태에 따라 수행 할 수 있습니다. 나는 상태로열거 형 vs 조회 테이블 vs 열거 형 반사 vs 상태 패턴

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

차이점이 포함 된 상태 클래스를 만들고 호출하십시오. 그래서 (파이썬) :

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 답변에서 언급 한대로 다른 문장없이? – Jeff

+0

문제를 이해하는 데 어려움이 있습니다. Status 객체에는 필요한 경우 하드 배선 된 캐스트를 포함하여 원하는 모든 코드가 포함될 수 있습니다. Application 개체는 동일하게 유지 될 수 있습니다. 내부 상태와 다른 호출을 디스패치합니다. –

+0

내 문제는 어떻게 당신의 예제에서 정확한 상태에있는 객체에 데이터 테이블을 다시 캐스팅 할 때 다른 문장이 쓰여지는 것을 피하는 것입니다. else statment없이 StatusZero 또는 StatusOne에 어떻게 데이터 행을 다시 캐스팅합니까? – Jeff

7

대신 사방이 체크와

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

를 코드를 뿌려 안, 상태 패턴을 사용합니다. 응용 프로그램의 모드가 변경 될 때마다 상태를 변경하고 모든 호출을 주 메소드로 전달하십시오. 훨씬 깔끔하고 쉽게 코드를 관리 할 수 ​​있습니다.

상태를 변경하는 것과 관련해서는 상태 패턴과 아무런 관련이 없습니다. 따라서 어느 것이 든 우아한 접근 방식을 사용할 수 있습니다.

0

나의 이해는 상태 패턴이 아주 좋기 때문이다. UI에서만 또는 메모리 내에서 실행하기에 좋다. 내 상황에서 응용 프로그램 테이블에서 데이터를 다시 가져올 때 어떤 객체를 캐스팅할지 결정할 필요가있다. 난 아직 객체 데이터베이스 u는 DB에서 검색하는 처리 어떻게