Sto cercando di aderire al Principio di Responsabilità Unica (SRP) il più possibile e di abituarmi a un determinato modello (per l'SRP sui metodi) affidandomi pesantemente ai delegati. Mi piacerebbe sapere se questo approccio è valido o se ci sono problemi gravi con esso.
Ad esempio, per verificare l'input di un costruttore, potrei introdurre il seguente metodo (l'input Stream
è casuale, potrebbe essere qualsiasi cosa)
private void CheckInput(Stream stream)
{
if(stream == null)
{
throw new ArgumentNullException();
}
if(!stream.CanWrite)
{
throw new ArgumentException();
}
}
Questo metodo (discutibilmente) fa più di una cosa
- Controlla gli input
- Disponi diverse eccezioni
Per aderire all'SRP, ho quindi modificato la logica in
private void CheckInput(Stream stream,
params (Predicate<Stream> predicate, Action action)[] inputCheckers)
{
foreach(var inputChecker in inputCheckers)
{
if(inputChecker.predicate(stream))
{
inputChecker.action();
}
}
}
Che presumibilmente fa solo una cosa (vero?): controlla l'input. Per il controllo effettivo degli input e il lancio delle eccezioni ho introdotto metodi come
bool StreamIsNull(Stream s)
{
return s == null;
}
bool StreamIsReadonly(Stream s)
{
return !s.CanWrite;
}
void Throw<TException>() where TException : Exception, new()
{
throw new TException();
}
e può chiamare CheckInput
come
CheckInput(stream,
(this.StreamIsNull, this.Throw<ArgumentNullException>),
(this.StreamIsReadonly, this.Throw<ArgumentException>))
È forse meglio della prima opzione o introduisco una complessità inutile? C'è un modo per migliorare ancora questo schema, se è possibile?