웹 사이트의 비밀번호 재설정 기능을 만들고 있습니다. 비밀번호 재설정을위한 첫 번째 단계는 구현되어야합니다.절차 코드를 리팩토링하는 방법은 무엇입니까?
- 사용자가 비밀번호 재설정 양식으로 이메일을 입력합니다.
- 이메일이있는 사용자가 등록되어 있는지 시스템에서 확인합니다.
- 사용자가 발견되면 시스템은 uniqe 토큰과 함께 비밀번호 재설정 URL이 포함 된 이메일을 전송합니다.
- 사용자를 찾을 수없는 경우 시스템은이 전자 메일에 대해 암호 재설정이 시작되었음을 알리는 전자 메일을 보내지 만 사용자 계정은 존재하지 않습니다.
나는 공공 메소드를 구현하는 서비스 클래스가 - 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");
}
}
이 방법은 원리 싱글 책임을 위반 - 그것은, 사용자의 존재를 확인하여 사용자 토큰을 재설정 이메일을 보냅니다.
이러한 솔루션의 주된 문제는 추가 단계를 추가해야하는 경우 RequestPasswordReset 메서드 및 메서드에 대한 구현을 추가해야한다는 것이므로 점점 더 복잡해집니다. 추가 단계는 예를 들어 사용자가 이미 다른 관련 시스템에 등록되어 있는지 확인하고 시스템에 새 계정을 만들거나 사용자 계정을 만들도록 조언 할 수 있습니다.
커맨드 패턴을 보았습니다. 서비스 클래스를 별도의 명령으로 리팩토링하는 것이 좋을 수 있으며 RequestPasswordReset은 이러한 명령 중 하나 일 수 있습니다. 그러나 RequestPasswordReset 메서드 내부의 주요 문제는 해결되지 않습니다.
또한 Chain of Responsibility 패턴을 보았습니다. 순서대로 단계를 처리하는 것이 좋지만 제어 흐름을 처리하는 데 사용할 수있는 방법이 다른지 - 구현해야하는 여러 조건을 모릅니다. 또한 각 처리기가 유사한 동작을 수행해야하며 전체 제어 흐름이 어떻게 변경되는지는 명확하지 않은 것으로 보입니다.
이러한 절차 코드를 리팩터링하는 것이 가장 좋은 방법은 무엇입니까?
패턴에 대한 접근 방식은 거의 거꾸로 보입니다. 패턴을 조사하여 문제에 대한 해결책을 찾으십시오. 시도하고 솔루션을 (심하게?) 그들이 거기에 있기 때문에 패턴에 맞게하지 마십시오. 리팩토링은 코드가 작성된 방식에 문제가있을 때 필요합니다. 일부 답변에서 알 수 있듯이 사용자의 접근 방식에는 문제가없는 것 같습니다. –
예제는 간단합니다. 그러나 외부 시스템에서 사용자를 검색하고 추가 된 사용자가 있으면 새로 생성 된 사용자의 비밀번호를 재설정하도록 이메일을 보내야합니다. 달성하기 위해 더 많은 단계가 필요한 경우 어떻게해야합니까? – marisks
필요시 리 팩터. 그리고 전에. –