1

WebサイトのRegisterクラスを作成したいと思います。これが私のユースケースです-

  1. ユーザーは登録用の電子メールIDとパスワードを提供します
  2. 電子メールIDがすでに存在する場合、Registerクラスは、この電子メールがシステムにすでに存在するというエラーメッセージを送信します
  3. 電子メールがシステムに存在しない場合、Registerクラスはユーザーの電子メールIDでアクティベーション電子メールを送信し、ユーザーに次のメッセージを表示します-1つのアクティベーション電子メールはすでにユーザーの電子メールに送信されています

これが私が考えたデザインです

Interface IRegister
{
 string RegisterUser(string email, string password);
}

public class Register:IRegister
{        
    public string RegisterUser(string email, string password)
    {
        //Call IsUserExist and SentActivationEmail method internally
    }

    private bool IsUserExist()
    {            
    }

    private void SendActivationEmail()
    {
    }
}

単純なままにするために、IRegisterのIsUserExistメソッドとSendActivationEmailメソッドについては触れたくありません。次に、IsUserExistメソッドとSendActivationEmailメソッドを使用し、ユースケースで説明したすべての操作を実行する必要があるRegisterクラスを実装する開発者を強制する方法を説明します。そして、この設計はSRPの原則に違反していますか?

4

2 に答える 2

2

開発者がこれらのメソッドを使用するように強制したい場合は、インターフェースではなく、保護された抽象メソッドを使用して抽象クラスを宣言する必要があります。次に、定義によってメソッドが適用されますが、開発者は必要に応じてメソッドを自由に実装できます。

public abstract class Register:IRegister
{        
    public string RegisterUser(string email, string password)
    {
        //Call IsUserExist and SentActivationEmail method internally
    }

    protected abstract bool IsUserExist();

    protected abstract void SendActivationEmail();
}

そうは言っても、SRPの原則を維持するために、SRPの電子メール部分を依存するIActivationEmailerインターフェイスに引き出します。電子メールと登録は実際には2つの異なるアクションであり、別々に保持する必要があります。

public interface IActivationEmailer {
    void SendActivationEmail();
}

public abstract class Register:IRegister
{        
    private IActivationEmailer m_emailer;
    protected Register(IActivationEmailer emailer){
       // store emailer to field
       m_emailer = emailer;
    }

    public string RegisterUser(string email, string password)
    {
        //Call IsUserExist and m_emailer.SentActivationEmail method internally
    }

    protected abstract bool IsUserExist();

}
于 2012-11-05T02:35:52.717 に答える
0

私はマイクの答えに同意します。少し異なるアプローチは、テンプレートメソッドを適用し、サブクラスに登録で何をしたいかを定義させることです(私は、C#に精通していないので、我慢してください)。

public abstract class Register:IRegister
{        
    public string RegisterUser(string email, string password)
    {
        if (this.IsUserExist())
        {
        //throw the error
        }
        else
        {
         this.performRegistration();
         this.notifyUSer();
        }
    }

    protected abstract bool IsUserExist();

    protected abstract notifyUSer();

    protected abstract performRegistration(){}
}

そして、マイクが指摘したように、次のように定義できます。

public interface IActivationEmailer {
    void SendActivationEmail();
}

public class CustomRegister
{        
    private IActivationEmailer m_emailer;

    public CustomRegister(IActivationEmailer emailer){
       // store emailer to field
       m_emailer = emailer;
    }

    protected abstract bool IsUserExist(){...}

    protected abstract notifyUSer() {this.m_emailer.SendActivationEmail();}

    protected abstract performRegistration(){...}
}

したがって、基本的に、Registerクラスは登録中に実行する手順を定義していますが、サブクラスはそれらの手順を実装する方法を示しています。

HTH

于 2012-11-05T13:17:32.430 に答える