J'essaie d'adhérer autant que possible au principe de responsabilité unique (SRP) et je me suis habitué à un certain modèle (pour le SRP sur les méthodes) qui repose fortement sur les délégués. J'aimerais savoir si cette approche est valable ou si elle pose de graves problèmes.
Par exemple, pour vérifier l'entrée dans un constructeur, je pourrais introduire la méthode suivante (l' Stream
entrée est aléatoire, peut être n'importe quoi)
private void CheckInput(Stream stream)
{
if(stream == null)
{
throw new ArgumentNullException();
}
if(!stream.CanWrite)
{
throw new ArgumentException();
}
}
Cette méthode (sans doute) fait plus d'une chose
- Vérifiez les entrées
- Lancer différentes exceptions
Pour adhérer au SRP, j’ai donc changé la logique pour
private void CheckInput(Stream stream,
params (Predicate<Stream> predicate, Action action)[] inputCheckers)
{
foreach(var inputChecker in inputCheckers)
{
if(inputChecker.predicate(stream))
{
inputChecker.action();
}
}
}
Ce qui est censé ne faire qu’une chose (le fait-il?): Vérifiez l’entrée. Pour le contrôle effectif des entrées et la levée des exceptions, j'ai introduit des méthodes telles que
bool StreamIsNull(Stream s)
{
return s == null;
}
bool StreamIsReadonly(Stream s)
{
return !s.CanWrite;
}
void Throw<TException>() where TException : Exception, new()
{
throw new TException();
}
et peut appeler CheckInput
comme
CheckInput(stream,
(this.StreamIsNull, this.Throw<ArgumentNullException>),
(this.StreamIsReadonly, this.Throw<ArgumentException>))
Est-ce meilleur que la première option, ou est-ce que j'introduis une complexité inutile? Est-il possible d'améliorer encore ce modèle, s'il est viable?
CheckInput
fait toujours plusieurs choses: c'est à la fois de parcourir un tableau , d' appeler une fonction de prédicat et d' appeler une fonction d'action. N’est-ce pas une violation du PÉR?