2015-12-14 5 views
5

多くのWebアプリケーション(主にASP.NET)は、複数の異なるユーザータイプを処理する必要があります。アプリケーションで異なるユーザータイプを処理する

あなたが生徒と教師の両方が毎日使っている学校ポータルがあるとします。アプリケーションのフロントページには、教師だけがアクセスできるツールへのリンクを除き、ほぼ同じGUIが表示されます。これがメッセージングツールだとしましょう。教師は、教師が誰に送ることができるかを定義する異なる役割を持つことができます。例えば

Publisherは、学校のみんなに送信することが許可されている役割を持つ

  • 教師。
  • 余分な役割を持たない教師は、そのクラスのすべての人にのみ送信することができます。
  • 今後、両親はこのポータルにアクセスして、自分の子供に関する詳細情報を見ることもできます。

問題はいつも私のコードはアプリケーション全体で異なるユーザータイプを処理するときに常にif - 文が混乱しているということです。ユーザーの種類が異なるだけでなく、異なるビジネスルールによっても影響を受けます。私は、さまざまなユーザータイプを適切に処理する方法を見つけることができないと感じています。

私は、ASP.NETの種類の役割の考え方がこれを解決すると思いますが、アプリケーションの周りにはまだifのステートメントがあります。

私の質問は:if - ステートメントでコードに感染することなく、アプリケーション内のさまざまなユーザー/ユーザーの種類を処理する方法に関するベストプラクティスですか?

答えて

2

これらの責任を分割する必要があります(たとえば、教師の送信機能など)。これを行うには、戦略パターンを使用します。

教師には、インターフェイスとして機能する追加のプロパティPublishingがあります。実装では、複数の実現方法(たとえば、公開機能を持たない教師のNoPublishingやDefaultPublishingなど)を使用できます。各教師は、PublishingプロパティをNoPublishingまたはDefaultPublishingに設定できます。必要に応じてランタイムを変更することもできます。

例:

public class Teacher 
{ 
    public IPublishing Publishing { get; } 
} 

interface IPublishing 
{ 
    void Send(); 
} 

public NoPublishing : IPublishing 
{ 
    public void Send() 
    { 
    // Implementatation 
    } 
} 

public PublishDefault : IPublishing 
{ 
    public void Send() 
    { 
    // Send a message the default way 
    } 
} 

教師を作成します。

var teacher = new Teacher(); 

は、出版社の戦略を作成します。

var defaultStrategy = new PublishDefault(); 

teacher.Publishing = defaultStrategy; 

今、あなたがしてメッセージを送信することができ、それらを接続しますパブリッシング戦略は、それは何も送信しないか何かにデフォルトの方法を送信するか接続されているに応じて、

teacher.Publishing.Send(); 

あなたは一度だけ、各使用パブリッシング戦略をインスタンス化し、(送信できるようにする必要があり、さらには他のクラス)の各先生のためにそれを再利用する必要があります。

他の公開機能が必要な場合は、新しい戦略(例:SmsPublishing、LetterPublishingなど)を追加するだけです。

公開戦略を必要に応じて変更することもできます(公開プロパティを再割り当てすることによって)。

教師に直接インターフェイスを実装しないのはなぜですか?

  • 分離の原則:IPublishには、具体的かつ異なる責任が含まれています。
  • 可能性として、IPublishには、後に異なるクラスや他のプロジェクトで使用できる機能が含まれているため、再利用が可能です。
  • IPublishではTeacherについての知識が必要ないため、テストは簡単です。
  • 教師のパブリッシングの動作をリアルタイムで変更することができます。

(注:ここにはコンパイラはありません。説明のためだけです)。

+0

各ユーザータイプごとに異なるクラスがある場合は、クラスの動作を「飾り付ける」ことができます(インターフェイスで完了しましたか?)。 –

+0

私はあなたの質問を正しく理解していないのではないかと心配しています。 –

+0

私の質問です:これはどのように実装しますか?たとえば、ユーザータイプごとに異なるC#クラスがあるとします。何が彼らに、例えば出版のこの振る舞いを与えるでしょうか?私はこれが戦略パターンを見て答えられると思いますが、コードがどのように見えるかをスケッチできるなら本当に甘いでしょう。 –