Saya berusaha mematuhi Prinsip Tanggung Jawab Tunggal (SRP) sebanyak mungkin dan terbiasa dengan pola tertentu (untuk SRP tentang metode) sangat bergantung pada delegasi. Saya ingin tahu apakah pendekatan ini masuk akal atau ada masalah parah dengan itu.
Misalnya, untuk memeriksa input ke konstruktor, saya bisa memperkenalkan metode berikut ( Stream
inputnya acak, bisa apa saja)
private void CheckInput(Stream stream)
{
if(stream == null)
{
throw new ArgumentNullException();
}
if(!stream.CanWrite)
{
throw new ArgumentException();
}
}
Metode ini (bisa dibilang) melakukan lebih dari satu hal
- Periksa input
- Lempar pengecualian yang berbeda
Untuk mematuhi SRP saya mengubah logika menjadi
private void CheckInput(Stream stream,
params (Predicate<Stream> predicate, Action action)[] inputCheckers)
{
foreach(var inputChecker in inputCheckers)
{
if(inputChecker.predicate(stream))
{
inputChecker.action();
}
}
}
Yang seharusnya hanya melakukan satu hal (bukan?): Periksa input. Untuk pengecekan aktual input dan melemparkan pengecualian saya telah memperkenalkan metode seperti
bool StreamIsNull(Stream s)
{
return s == null;
}
bool StreamIsReadonly(Stream s)
{
return !s.CanWrite;
}
void Throw<TException>() where TException : Exception, new()
{
throw new TException();
}
dan bisa memanggil CheckInput
seperti
CheckInput(stream,
(this.StreamIsNull, this.Throw<ArgumentNullException>),
(this.StreamIsReadonly, this.Throw<ArgumentException>))
Apakah ini lebih baik daripada opsi pertama, atau apakah saya memperkenalkan kompleksitas yang tidak perlu? Apakah ada cara saya masih bisa memperbaiki pola ini, jika itu layak?
CheckInput
masih melakukan banyak hal: Ia melakukan iterasi pada array dan memanggil fungsi predikat dan memanggil fungsi aksi. Apakah itu bukan pelanggaran terhadap SRP?