2009-04-13 2 views
2

기본적으로 나는 많은 다른 서비스를 제공 할 엔티티 (세션이라고 함)가 있습니다. 각 서비스는 사용자가 선택적으로 켜거나 끌 수 있습니다 (로그인 또는 로그 아웃). 나는 이것을 대표하는 가장 좋은 디자인이 무엇인지 모르겠습니다. 세션 인스턴스와 프로그래밍 사용 사례 관점에서 UML많은 서비스를 제공하는 객체를 모델링하는 올바른 방법은 무엇입니까?

, 상호 작용을 참조하십시오

Session session = new Session("1234"); // 1234 is the userid 
session.start(); 

session.serviceSignIn(ServiceType.DELICIOUS); 
.... do stuff ... 
session.serviceSignOut(ServiceType.DELICIOUS); 

session.serviceSignIn(ServiceType.MAGNOLIA); 
.... do stuff ... 
session.serviceSignOut(ServiceType.MAGNOLIA); 

또 다른 가능한 디자인 : 나는 선호한다

session.delicious().signIn(); 
.... do stuff ... 
session.delicious().signOut(); 

session.magnolia().signIn(); 
.... do stuff ... 
session.magnolia().signOut(); 

를? 어떤 실수를 저질렀습니까?

답변

1

서비스에 명시 적으로 이름을 지정하는 이유는 무엇입니까? 아마 이것은 어떤 GUI 또는 다른 인터페이스에 연결될 것입니까? 아마도 "맛있는"과 같은 문자열로 그들을 참조 할만큼 충분할 것입니다. 또한 왜 각 서비스를 자체 서명 할 수있는 클래스로 만들지 않겠습니까?

interface Service { 
    String getName(); 
    void signin(); 
    void signout(); 
    State getState(); // state could be signed in signed out or signing in perhaps 
} 

class Services { 
    void addService(Service service); 
    void removeService(Service service); 
    Service getService(String serviceName); 

    ... 
} 

또한 서비스 인터페이스에 책갈피 추가와 같은 작업을 수행하는 작업이 있어야합니다.

+0

각 서비스에는 특정 URL도 있습니다. 구성 가능한 매개 변수에 대한 일부 속성 파일의 모든 서비스를 다시 구성해야합니까? 아니면 클래스에 하드 코딩해야합니까? –

0

나는 첫 번째 접근 방식으로 어떤 식 으로든 디자인을 묶어 두지 않는다고 생각합니다. 서비스를 동적으로로드하고 향후 서비스를 쉽게 추가 할 수 있습니다 (두 번째 방법과 같이 정확한 서비스 유형에 바인딩하는 코드가 없으므로).

0

나는이 결정을 내리는 데있어 중요한 요인이 맛있는 음식과 목련이 제공하는 실제 서비스가되어야한다고 생각합니다. 그들은 같은 서비스입니까? 그들이 공유하는 공통점은 로그인/로그 아웃 동작뿐이라면 두 번째 접근 방법을 찾아 보겠습니다. 아마도 인터페이스/믹싱과 같은 로그인/로그 아웃 기능을 사용했을 것입니다.

+0

이들은 표준 유형의 서비스를 표준으로 제공하지만 구현은 완전히 다릅니다. 사용자는 각 서비스에 대해 0 개 이상의 "계정"을 가질 수 있습니다. –

0

내게는 고전적인 외관 패턴처럼 보이지만 서비스에 대해 SOA 구현에 대해 이야기하고 있습니까? 아마도 Service Facade을 살펴보십시오. 특정 구현을 반환하기 위해 Factory를 구동하는 매개 변수를 사용하여 (Facade) 설명한 것처럼 단일 진입 점을 사용할 것입니다. 다음 예에서는 구현을 변경하지 않고 추가 서비스를 추가 할 수 있습니다.

interface ISessionFacade 
{ 
    void ServicesSignIn(string serviceType); 

    void ServiesSignOut(string serviceType); 
} 

interface ISessionService 
{ 
    void ServicesSignIn(); 

    void ServiesSignOut(); 
} 

class ServiceFactory 
{ 
    public static ISessionService CreateService(string serviceType) 
    { 
     ISessionService sessionService = null; 

     // TODO: Configuration lookup of serviceType, returning a fully qualified class name to load 

     // TODO: Dynamically load class, perhaps this should be a singleton? 

     return sessionService; 
    } 
} 

class Session : ISessionFacade 
{ 
    public void ServicesSignIn(string serviceType) 
    { 
     ISessionService serviceSession = ServiceFactory.CreateService(serviceType); 
     serviceSession.ServicesSignIn(); 
    } 

    public void ServiesSignOut(string serviceType) 
    { 
     ISessionService serviceSession = ServiceFactory.CreateService(serviceType); 
     serviceSession.ServiesSignOut(); 
    } 
} 
+0

질문을하는 사람이 아주 좋은 OOP 디자인조차 갖고 있지 않았다는 것을 고려하면 조금 과장된 것처럼 보입니다. 이 경로를 사용하려면 세션을 인터페이스로 만들고 구현을 위해 팩토리를 사용해야합니다. –

+0

불필요한 빈 줄을 어디에나 두지 않으면 코드에 스크롤 상자가 필요하지 않습니다. – Benson

관련 문제