Tek Sorumluluk Prensibi'ne (SRP) mümkün olduğunca bağlı kalmaya çalışıyorum ve delegelere büyük ölçüde güvenerek belirli bir düzende (yöntemlerin SRP'si için) alıştım. Bu yaklaşımın sağlam olup olmadığını veya bununla ilgili ciddi sorunlar olup olmadığını bilmek istiyorum.
Örneğin, bir kurucu için girişi kontrol etmek için, aşağıdaki yöntemi tanıtabilirim ( Stream
giriş rastgele, herhangi bir şey olabilir)
private void CheckInput(Stream stream)
{
if(stream == null)
{
throw new ArgumentNullException();
}
if(!stream.CanWrite)
{
throw new ArgumentException();
}
}
Bu yöntem (tartışmalı) birden fazla şey yapar
- Girişleri kontrol et
- Farklı istisnalar at
SRP'ye bağlı kalmak için bu nedenle mantığı değiştirdim.
private void CheckInput(Stream stream,
params (Predicate<Stream> predicate, Action action)[] inputCheckers)
{
foreach(var inputChecker in inputCheckers)
{
if(inputChecker.predicate(stream))
{
inputChecker.action();
}
}
}
Sözde hangi bir şey yapar (öyle mi?): Girişi kontrol edin. Girdilerin gerçek kontrolü ve istisnaların atılması için aşağıdaki gibi yöntemler getirdim
bool StreamIsNull(Stream s)
{
return s == null;
}
bool StreamIsReadonly(Stream s)
{
return !s.CanWrite;
}
void Throw<TException>() where TException : Exception, new()
{
throw new TException();
}
ve çağırabilir CheckInput
gibi
CheckInput(stream,
(this.StreamIsNull, this.Throw<ArgumentNullException>),
(this.StreamIsReadonly, this.Throw<ArgumentException>))
Bu, ilk seçenekten daha iyi midir, yoksa gereksiz bir karmaşıklık getirebilir miyim? Eğer uygulanabilirse, bu kalıbı geliştirebilmemin bir yolu var mı?
CheckInput
yine de birden fazla şeyler yapıyor: Hem dizisi üzerinde yineleme olduğunu ve bir yüklem işlevinin çağrılması ve bir eylem fonksiyonunu çağırarak. Öyleyse bu SRP'nin ihlali değil midir?