Я читал книгу С#, в которой автор (какой-то чувак по имени Джон Скит) реализует функцию Where
, например
public static IEnumerable<T> Where<T> ( this IEnumerable<T> source, Funct<T,bool> predicate )
{
if ( source == null || predicate == null )
{
throw new ArgumentNullException();
}
return WhereImpl(source, predicate);
}
public static IEnumerable<T> WhereImpl<T> ( IEnumerable <T> source, Func<T,bool> predicate )
{
foreach ( T item in source )
{
if ( predicate(item) )
{
yield return item;
}
}
}
Теперь я полностью понимаю, как это работает и что он эквивалентен
public static IEnumerable<T> Where<T> ( this IEnumerable<T> source, Funct<T,bool> predicate )
{
if ( source == null || predicate == null )
{
throw new ArgumentNullException();
}
foreach ( T item in source )
{
if ( predicate(item) )
{
yield return item;
}
}
}
в котором возникает вопрос, почему можно отделить их от двух функций, учитывая, что накладные расходы на память/время и, конечно, больше кода. Я всегда проверяю параметры, и если я начну писать, как в этом примере, я буду писать в два раза больше кода. Есть ли какая-то школа мысли, которая утверждает, что валидация и реализация должны быть отдельными функциями?