Я читал C# книга, в которой автор (какой-то чувак по имени Джон Скит) реализует 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;
}
}
}
, который поднимает вопрос о том, почему можно отделить их от двух функций, учитывая, что накладные расходы памяти/времени и, конечно, больше кода. Я всегда проверяю параметры, и если я начну писать, как в этом примере, я буду писать в два раза больше кода. Есть ли какая-то школа мысли, которая утверждает, что валидация и реализация должны быть отдельными функциями?
BTW используя * код * контракты, возможно, не была бы реальная причина чтобы отделить их двумя способами, поскольку проверка параметров будет выполняться с использованием предварительных условий ... Я не могу проверить это сейчас, но я не уверен, что * кодовые контракты * также будут оцениваться как часть блока итератора –
Ну, наконец, я сам это испытал, мне было любопытно о сценарии, который я сказал вам в вышеупомянутом комментарии. Я отправил свой собственный ответ, чтобы внести вклад в это исключение из правила –