Методы расширения-IsNull и IsNotNull, хорошее или плохое использование?
мне нравится читаемость.
Итак, я придумал расширение mothod несколько минут назад для (x =! null) синтаксис типа, называемый IsNotNull. И наоборот, я также создал метод расширения IsNull, таким образом
if(x == null) becomes if(x.IsNull())
и
if(x != null) becomes if(x.IsNotNull())
однако я беспокоюсь, что могу злоупотреблять методами расширения. Считаете ли вы, что это плохое использование методов Extenion?
9 ответов
Это не кажется более читаемым и может запутать людей, читающих код, задаваясь вопросом, есть ли какая-либо логика, которую они не знают в этих методах.
Я использовал PerformIfNotNull (метод Func) (а также перегрузку, которая принимает действие), которую я могу передать быстрое лямбда-выражение, чтобы заменить весь блок if, но если вы ничего не делаете, кроме проверки на null, кажется, что это не дает ничего полезного.
Я не нахожу это невероятно полезным, но это:
someString.IsNullOrBlank() // Tests if it is empty after Trimming, too
someString.SafeTrim() // Avoiding Exception if someString is null
потому что эти методы фактически избавляют вас от необходимости выполнять несколько проверок. но замена одной проверки вызовом метода кажется мне бесполезной.
вполне допустимо, но я не думаю, что это невероятно полезно. Поскольку методы расширения-это просто обман компилятора, я изо всех сил пытаюсь назвать любое их использование "злоупотреблением", поскольку они все равно просто пух. Я жалуюсь только на методы расширения, когда они вредят читаемости.
Я не полностью согласен с рассуждениями, говорящими "это может запутать".
до некоторой степени я понимаю, что имеется в виду, что нет причин выходить за пределы "общего понимания" - все понимают объект != недействительный.
но в Visual Studio у нас есть замечательные инструменты, где вы можете просто навести курсор на метод, чтобы показать некоторую дополнительную информацию.
Если бы мы сказали, что метод расширения был аннотирован с хорошим объяснением, то я почувствуйте, что аргумент путаница разваливается.
методы .IsNotNull () and .IsNull () объясните точно, что они такое. Я считаю, что они очень разумны и полезны.
честно говоря, это вопрос "что вам нравится". Если вы чувствуете, что методы сделают его более читаемым в контексте вашего проекта, тогда идите на это. Если вы нарушаете конвенцию в своем проекте, то я бы сказал наоборот.
У меня были те же мысли, что и у вас у меня на эту тему и спросили несколько очень опытных разработчиков по месту моей работы. И ни один из них не придумал веской причины (за исключением того, что было упомянуто о-путанице - здесь), которая объяснила бы, почему вы не должны этого делать.
дерзайте :-)
вы также вводите накладные расходы на вызов метода для чего-то, что является внутренней операцией CLR. JIT может встроить его, но может и нет. Конечно, это микроперфория, но я согласен, что она не особенно полезна. Я делаю такие вещи, когда есть значительное улучшение читаемости, или если я хочу какое-то другое поведение, например "бросить ArgumentNullException и передать имя arg", это глупо делать inline снова и снова.
вместо этого я бы пошел с чем-то вроде:
static class Check {
public static T NotNull(T instance) {
... assert logic
return instance;
}
}
тогда используйте его так:
Check.NotNull(x).SomeMethod();
y = Check.NotNull(x);
лично гораздо яснее, что происходит, чем быть умным и позволить следующее:
if( ((Object)null).IsNull() ) ...
Это может иметь смысл, если вы, например, предполагаете, что вы можете захотеть создать исключение всякий раз, когда x равно null (просто сделайте это в методе расширения). Тем не менее, я лично предпочитаю в этом конкретном случае явно проверять (нулевой объект должен быть нулевым :-) ).
чтобы следовать шаблону, это должно быть свойство, а не метод (но, конечно, это не работает с расширениями).
значения данных в системе.Пространство имен данных имеет свойство IsNull, которое определяет, содержит ли значение значение DbNull.
класс DataRow имеет метод IsNull, но он не определяет, является ли DataRow нулевым, он определяет, содержит ли одно из полей в строке данных значение DbNull.