2009-04-13 9 views
2

私は基本的に、多くの異なるサービスを提供するエンティティ(セッションと呼ばれる)を持っています。ユーザーは、各サービスを選択的にオンまたはオフに切り替えることができます(サインインまたはサインアウト)。私はこれを表現するための最良のデザインが何であるか分かりません。 Sessionインスタンスでプログラミングユースケースの観点から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

私は最初のアプローチでは、あなたのデザインを決して束縛していないと思います。サービスを動的にロードし、将来新しいサービスを簡単に追加することができます(2番目の方法のように、正確なサービスタイプにコードがバインドされていないため)。

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デザインさえしていなかったと考えると、ちょっと残念です。あなたがこのルートに行くつもりなら、Sessionをインターフェイスにして、実装を得るためにファクトリを使用してみましょう。 –

+0

不要な空白行をどこにでも置かないと、スクロールボックスは必要ありません。 – Benson

関連する問題