가능한 한 SRP (Single Responsibility Principle)를 준수하려고 노력하고 있으며 대의원에 크게 의존하는 특정 패턴 (SRP on Methods)에 익숙해졌습니다. 이 방법이 올바른지 또는 심각한 문제가 있는지 알고 싶습니다.
예를 들어, 생성자에 대한 입력을 확인하기 위해 다음 방법을 도입 Stream
할 수 있습니다 ( 입력은 임의적이며 무엇이든 가능)
private void CheckInput(Stream stream)
{
if(stream == null)
{
throw new ArgumentNullException();
}
if(!stream.CanWrite)
{
throw new ArgumentException();
}
}
이 방법은 틀림없이 하나 이상의 일을합니다.
- 입력 확인
- 다른 예외를 던져라
SRP를 준수하기 위해 논리를 다음과 같이 변경했습니다.
private void CheckInput(Stream stream,
params (Predicate<Stream> predicate, Action action)[] inputCheckers)
{
foreach(var inputChecker in inputCheckers)
{
if(inputChecker.predicate(stream))
{
inputChecker.action();
}
}
}
한 가지만 수행하는 것은 무엇입니까? 실제로 입력을 확인하고 예외를 던지기 위해 다음과 같은 방법을 소개했습니다.
bool StreamIsNull(Stream s)
{
return s == null;
}
bool StreamIsReadonly(Stream s)
{
return !s.CanWrite;
}
void Throw<TException>() where TException : Exception, new()
{
throw new TException();
}
그리고 CheckInput
같이 전화 할 수 있습니다
CheckInput(stream,
(this.StreamIsNull, this.Throw<ArgumentNullException>),
(this.StreamIsReadonly, this.Throw<ArgumentException>))
이것이 첫 번째 옵션보다 낫거나 불필요한 복잡성을 도입합니까? 이 패턴이 실제로 가능한 경우 계속 개선 할 수있는 방법이 있습니까?
CheckInput
여전히 여러 일을하고있다 : 그것은 모두 배열 반복이다 와 술어 함수를 호출 하고 조치의 함수를 호출. 그렇다면 SRP를 위반하지 않습니까?