Tôi đang cố gắng tuân thủ Nguyên tắc Trách nhiệm Đơn lẻ (SRP) càng nhiều càng tốt và đã quen với một mô hình nhất định (đối với SRP về các phương pháp) phụ thuộc nhiều vào các đại biểu. Tôi muốn biết cách tiếp cận này là âm thanh hoặc nếu có bất kỳ vấn đề nghiêm trọng nào với nó.
Ví dụ: để kiểm tra đầu vào cho hàm tạo, tôi có thể giới thiệu phương thức sau ( Stream
đầu vào là ngẫu nhiên, có thể là bất cứ thứ gì)
private void CheckInput(Stream stream)
{
if(stream == null)
{
throw new ArgumentNullException();
}
if(!stream.CanWrite)
{
throw new ArgumentException();
}
}
Phương pháp này (được cho là) làm nhiều hơn một điều
- Kiểm tra đầu vào
- Ném các ngoại lệ khác nhau
Do đó, để tuân thủ SRP, tôi đã thay đổi logic thành
private void CheckInput(Stream stream,
params (Predicate<Stream> predicate, Action action)[] inputCheckers)
{
foreach(var inputChecker in inputCheckers)
{
if(inputChecker.predicate(stream))
{
inputChecker.action();
}
}
}
Mà được cho là chỉ làm một việc (phải không?): Kiểm tra đầu vào. Để kiểm tra thực tế các đầu vào và đưa ra các ngoại lệ, tôi đã giới thiệu các phương pháp như
bool StreamIsNull(Stream s)
{
return s == null;
}
bool StreamIsReadonly(Stream s)
{
return !s.CanWrite;
}
void Throw<TException>() where TException : Exception, new()
{
throw new TException();
}
và có thể gọi CheckInput
như
CheckInput(stream,
(this.StreamIsNull, this.Throw<ArgumentNullException>),
(this.StreamIsReadonly, this.Throw<ArgumentException>))
Đây có phải là bất kỳ tốt hơn so với tùy chọn đầu tiên, hoặc tôi giới thiệu sự phức tạp không cần thiết? Có cách nào tôi vẫn có thể cải thiện mô hình này không, nếu nó khả thi?
CheckInput
vẫn đang làm nhiều việc: Nó vừa lặp qua một mảng vừa gọi một hàm vị ngữ và gọi một hàm hành động. Có phải đó không phải là vi phạm SRP?