1

我想为网站建立一个注册类。这是我的用例——

  1. 用户将提供用于注册的电子邮件 ID 和密码
  2. 如果电子邮件 ID 已经存在,那么 Register 类将发送一条错误消息,指出该电子邮件已经存在于我们的系统中
  3. 如果我们的系统中不存在电子邮件,则 Register 类将在用户电子邮件 ID 中发送一封激活电子邮件并向用户显示消息——一封激活电子邮件已发送到他/她的电子邮件

这是我想到的设计

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 方法并执行用例中提到的所有操作。这种设计是否违反了 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 原则,我会将其中的电子邮件部分提取到依赖的 IActivationEmailer 接口中。发送电子邮件和注册实际上是两个不同的操作,应该分开。

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 类定义了注册期间要遵循的步骤,但它让子类来说明如何实现这些步骤。

高温高压

于 2012-11-05T13:17:32.430 回答