Если я не ошибаюсь, каждый ответ здесь осуждает тот факт, что метод расширения может быть вызван для нулевого экземпляра, и из-за этого они не поддерживают, считают, что это хорошая идея.
Позвольте мне опровергнуть их аргументы.
Я ВООБЩЕ не верю, что вызов метода для объекта, который может иметь значение NULL, сбивает с толку. Дело в том, что мы проверяем нули только в определенных местах, а не в 100% случаев. Это означает, что есть процент времени, когда каждый вызов метода, который мы делаем, потенциально связан с нулевым объектом. Это понятно и приемлемо. Если бы это было не так, мы бы проверяли null перед каждым вызовом метода.
Итак, что сбивает с толку, что конкретный вызов метода может происходить с нулевым объектом? Посмотрите на следующий код:
var bar = foo.DoSomethingResultingInBar();
Console.Writeline(bar.ToStringOr("[null]"));
Вы растеряны? Вы должны быть. Потому что вот реализация foo:
public Bar DoSomethingResultingInBar()
{
return null; //LOL SUCKER!
}
Видеть? Вы читаете образец кода, совершенно не запутавшись. Вы поняли, что потенциально foo вернет null из вызова этого метода, а вызов ToStringOr на bar
приведет к NRE. Голова кружилась? Конечно, нет. Понятно, что такое может случиться. Теперь этот метод ToStringOr незнаком. Что вы делаете в таких ситуациях? Вы либо читаете документацию по методу, либо изучаете код вызова. Вот:
public static class BarExtensions
{
public static string ToStringOr(this bar, string whenNull)
{
return bar == null ? whenNull ?? "[null]" : bar.ToString();
}
}
Сбивает с толку? Конечно, нет. Очевидно, что разработчику нужен сокращенный метод проверки, является ли bar
нулевым, и замены его ненулевой строкой. Это может значительно сократить ваш код и повысить удобочитаемость и повторное использование кода. Конечно, вы можете сделать это и другими способами, но этот способ запутывает не больше, чем любой другой. Например:
var bar = foo.DoSomethingResultingInBar();
Console.Writeline(ToStringOr(bar, "[null]"));
Когда вы сталкиваетесь с этим кодом, что у вас должно отличаться от исходной версии? Вам все еще нужно изучить код, вам все равно нужно определить его поведение, когда bar
имеет значение null. Вы все еще должны иметь дело с этой возможностью.
Запутывают ли методы расширения? Только если вы их не понимаете. И, откровенно говоря, то же самое можно сказать о ЛЮБОЙ части языка, от делегатов до лямбд.
person
Community
schedule
26.04.2009