문제

내가 구축 할 소프트웨어에는 "응용 프로그램"이 다른 상태간에 전환하는 것이 포함됩니다. 특정 작업은 응용 프로그램의 상태에 따라 다를 수 있습니다. 나는 Enum을 상태로 사용하는 것에 대해 생각하고있었습니다

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 }

위의 사례는 열거적으로 더 쉽게 할 수 있다고 생각합니다. 그러나 상태 정렬 주문 또는 설명을 업데이트 할 때는 매우 어려울 것입니다.

반사를 사용하여 조회 테이블의 값을 기반으로 열거를 동적으로 생성해야합니까? 아니면 상태 패턴을 사용해야합니까? 열거적 인 펠트로에서 볼 수있는 문제는 성능 영향입니다. 상태 패턴은 많은 중복 코드를 생성 할 수 있습니다.

어떻게 생각해? 미리 감사드립니다!

도움이 되었습니까?

해결책

차이점이 포함 된 상태 클래스를 만들고 전화를 걸었습니다. 그래서 (파이썬에서) :

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])

빠르고 쉽게 기능을 구획화하고 상태 간의 합리적인 상속 패턴을 사용하여 차이가없는 함수를 공유 할 수 있습니다.

다른 팁

이 수표를 어디서나 코드로 뿌려서는 안됩니다.

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

대신 상태 패턴을 사용하십시오. 응용 프로그램 모드가 변경 될 때마다 상태를 변경하고 모든 호출을 주 방법으로 전달하십시오. 코드를 유지하기가 훨씬 깨끗하고 쉽게 유지할 수 있습니다.

상태를 바꾸는 것에 관해서는 상태 패턴과 아무런 관련이 없습니다. 따라서 우아한 접근 방식을 사용할 수 있습니다.

내 이해는 상태 패턴이 UI 만 또는 메모리에 전용 실행에 상당히 우수하다는 것입니다. 여기서 내 상황에서 응용 프로그램 테이블에서 데이터를 다시 검색 할 때 캐스트 할 객체를 결정하려면 다른 문장이 있어야합니다.

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

응용 프로그램 상태를 데이터베이스에 저장하기 위해 열거 나 조회 테이블이 필요하기 때문에 우아한 솔루션으로 보지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top