我正在为网站创建密码重置功能。必须执行密码重置的第一步:

  • 用户以密码重置形式输入他的电子邮件。
  • 系统检查有电子邮件的用户是否已注册。
  • 如果找到用户,系统会发送带有密码重置 URL 和唯一 token 的电子邮件。
  • 如果未找到用户,系统将发送电子邮件通知已为此电子邮件启动密码重置,但用户帐户不存在。

  • 我有实现公共(public)方法的服务类 - RequestPasswordReset 并且这个方法非常程序化:
    public void RequestPasswordReset(string email)
    {
        if(!IsValidEmail(email))
        {
            throw new ArgumentException("email");
        }
    
        var user = this.repository.FindByEmail(email);
        if(user != null)
        {
            user.PasswordResetToken.Set(this.tokenGenerator.NewToken());
            this.emailService.Send(this.from,
                                   user.Email,
                                   "Password reset",
                                   "Your reset url: http://mysite.com/?t=" +
                                         user.PasswordResetToken.Value);
        }
        else
        {
        this.emailService.Send(this.from,
                            user.Email,
                            "Requested password reset",
                            "Someone requested password reset at http://mysite.com");
        }
    }
    

    此方法违反单一职责原则 - 它检查用户存在、重置用户 token 、发送电子邮件。

    这种解决方案的主要问题是,如果我需要添加额外的步骤,我必须为 RequestPasswordReset 方法添加实现,并且方法变得越来越复杂。
    其他步骤可能是,例如,检查用户是否已经在另一个相关系统中注册,我可以建议他在我的系统中创建新帐户或为他创建用户帐户。

    我正在查看命令模式 - 将服务类重构为单独的命令可能会很好,而 RequestPasswordReset 可能是这些命令之一。但它并没有解决 RequestPasswordReset 方法中的步骤的主要问题。

    我也在研究责任链模式 - 按顺序处理步骤会很好,但我不知道如何使用它来处理控制流 - 应该实现的不同条件。此外,看起来每个处理程序都应该执行类似的操作,并且不清楚整个控制流如何变化。

    重构此类程序代码的最佳方法是什么?

    最佳答案

    我认为你的代码很好。如果您绝对想重构某些东西,您可能会为了简化 main 方法的可读性而将代码拆分得更多一些;像这样:

    public void RequestPasswordReset(string email)
    {
        ValidateEmail(email); // May throw exception if invalid
    
        var user = this.repository.FindByEmail(email);
        if(user != null)
        {
            GenerateTokenAndSendPasswordResetEmail(user);
        }
        else
        {
            SendPasswordResetEmail(email);
        }
    }
    

    除此之外,我会保持原样。你的问题真的很简单,所以没有理由寻找复杂的解决方案! :)

    10-06 05:05