Ответ 1
Технически Resharper верен в том, что "else" не нужно, я предпочитаю прежнюю версию, хотя, поскольку намерение более очевидно.
Сказав это, я бы предпочел:
return attr != null ? attr.Value : string.Empty;
При попытке добраться до всех зеленых я получил следующее предложение от Resharper.
Исходный код:
static public string ToNonNullString(this XmlAttribute attr)
{
if (attr != null)
return attr.Value;
else
return string.Empty;
}
Предложение: удалить избыточное 'else', что приведет к следующему:
static public string ToNonNullString(this XmlAttribute attr)
{
if (attr != null)
return attr.Value;
return string.Empty;
}
Для меня предлагаемая версия кажется менее читаемой, чем оригинал. Предлагает ли решение Resharper определение хорошего поддерживаемого кода?
Технически Resharper верен в том, что "else" не нужно, я предпочитаю прежнюю версию, хотя, поскольку намерение более очевидно.
Сказав это, я бы предпочел:
return attr != null ? attr.Value : string.Empty;
А, кодовая эстетика. Святое военное время. (Уток)
Я бы пошел либо с выражением::
return attr != null ? attr.Value : String.Empty
или инвертировать if и удалить разрыв строки для создания оговорки охраны:
if (attr == null) return String.Empty;
return attr.Value;
Я думаю, что новая версия намного лучше, если вы инвертируете if
static public string ToNonNullString(this XmlAttribute attr)
{
if (attr == null)
return string.Empty;
return attr.Value;
}
Потому что ваша оригинальная версия слишком симметрична, а нуль-случай - это особый случай.
Новая версия более читаема в терминах "что она возвращает большую часть времени?".
Я согласен с тем, что первая версия вашего кода более читаема.
Я нашел предложения Resharper в этих случаях не всегда полезными, хотя иногда он может очищать вещи. Вот почему я настроил Resharper, чтобы показать изменение как "подсказку", а не "предложение". Это приведет к тому, что зеленое подчеркивание будет менее видимым, и оно не будет выделено на правой боковой панели.
Если вам не нравится, как ReSharper предлагает что-то, просто отключить конкретное предложение (подсказка косой черты). То же самое касается стиля кодирования, который, как мне кажется, довольно с высокой степенью конфигурирования. Утверждение ReSharper непригодным для использования (цитирование "Я рад сказать, что оно не сохранилось, никто здесь больше не использует его" ) только потому, что вы не занимаете 5 минут, чтобы узнать, как настроить его, просто plain stupid.
Конечно, вы не должны позволять некоторому инструменту диктовать какую-то часть вашего стиля кодирования, а ReSharper НЕ делает этого, если вы не говорите ему об этом. Это просто.
Ваш исходный код намного читабельнее и понятен - с первого взгляда вы можете точно увидеть условие, которое возвращает string.Empty
. Без else
вы должны увидеть, что перед этим есть возврат в if
.
Просто помни, ты человек и по своей природе умнее машины. Если он говорит вам, что что-то лучше, и вы не согласны, тогда не слушайте его.
Мой стандарт кодирования всегда использует скобки (даже если есть только одна команда после команды)
Это требует немного усилий (больше набрав), но я так часто убеждаюсь, что это того стоит!
Одной из наиболее распространенных ошибок (и, как это ни парадоксально сложно найти) является добавление дополнительной инструкции после утверждения if и забывания добавления скобок...
Мне нравится то, что предложил Решарпер. Особенно при наличии вложенных операторов if:
Предположим, что у нас есть этот код:
if (condition1) {
instruction1;
}
else {
if (condition2) {
instruction2;
}
}
Его можно изменить так, чтобы он выглядел следующим образом:
if (condition1) {
instruction1;
}
else if (condition2) {
instruction2;
}
И это гораздо более читаемо для меня, чем раньше.
(Это было бы также более заметно, если у вас более 2-х уровневых вложенных операторов)
Я заметил то же самое в ReSharper, поэтому я ценю его способность отключать некоторые элементы или понижать их уровень предупреждения. Я также озадачен этим предложением:
SomeClass varName = new SomeClass();
имеет предлагаемое изменение:
var varName = new SomeClass();
Да, я знаю, что мне не нужен начальный тип объявления, но кажется странным предположить, что форма var как-то лучше, чем другая. Кто-нибудь знаком с обоснованием предложения или согласен со мной, что это тоже странно?
Классический пример исключений, которые ползут во всем, когда вы используете небольшой размер выборки. Рефакторинг огромного блока if-elseif-else в макет предложения охраны делает код более читабельным, но, как вы говорите, если вы применяете одни и те же правила к одному if-else, это не так полезно. Я бы зашел так далеко, чтобы сказать, что это (легкое) отсутствие предвидения со стороны разработчиков-разработчиков, чтобы не пропустить очень маленькие блоки, такие как это, но это было достаточно безвредно.
Являясь noob на С# и больше используемым для C и Java, я до сих пор не могу привыкнуть к размещению угловых скобок в С#.NET и VS. Отложив все это, я согласен с Андреем в том, что инвертирование "if" еще более удобочитаемо. С другой стороны, я лично считаю, что исключение "else" уменьшает читаемость (слегка). Я бы пошел с этим лично:
static public string ToNonNullString(this XmlAttribute attr)
{
if (attr == null)
return string.Empty;
else
return attr.Value;
}
Единственное, что я добавлю, должно быть связано с длиной задействованных выражений. Лично мне нравится компактность тернарных выражений, но что-то вроде
if (testDateTime > BaseDateTime)
return item.TransactionDate <= testDateTime && item.TransactionDate >= BaseDateTime;
return item.TransactionDate >= testDateTime && item.TransactionDate <= BaseDateTime;
во что-то вроде
return testDateTime > BaseDateTime ? item.TransactionDate <= testDateTime && item.TransactionDate >= BaseDateTime : item.TransactionDate >= testDateTime && item.TransactionDate <= BaseDateTime;
для меня действительно не помогает.
Его всегда спорно, когда речь идет о передовой практике и стандартам кодирования. Одной из причин этого является то, что они не могут быть легко реализованы с использованием среды IDE, такой как Visual Studio. Существуют инструменты, доступные как FxCop и StyleCop, которые можно использовать для анализа кода для стандартов. FxCop используется для анализа скомпилированного кода, а StyleCop используется для анализа исходного кода.
Вы можете настроить StyleCop на минутный уровень в отношении того, какое форматирование вы хотите применить к коду. Существует надстройка под названием StyleCop for Resharper, которая дает предложения прямо внутри Visual Studio. У меня было подробное сообщение в блоге о том же в http://nileshgule.blogspot.com/2010/10/refactoring-clean-code-using-resharper.html
Вариант resharper лучше, так как условие "attr!= null" можно рассматривать как ранний путь спасения (или путь исключения в случае использования), позволяя функции продолжать свою основную задачу. (ни у меня не выигрывают высокие пятеро, я ненавижу несколько возвратов).
В этом случае я бы сказал, что единственная линейка one-liner от MrWiggles - лучшая альтернатива.
Некоторые мои коллеги начали использовать Resharper с этого момента на страницах, которые они редактировали, были ужасны в макете и удобочитаемости. Я рад сказать, что он не выжил, никто больше его не использует.
Об этом заявлении я согласен с Джеффри Хэнтином, inline-if, очень хорошо подходит для такого типа утверждения, и решение Whatsit очень доступно. За некоторыми исключениями я (personaly) говорят, что методы/функции должны иметь только 1 оператор return.
Также, если вы (почти) всегда реализуете else с вашим if (даже если это не что иное, как строка комментария, в которой вы ничего не делаете с инструкцией else), это заставляет вас думать об этой ситуации чаще не может предотвратить ошибки.
Оба замечания должны использоваться как "думать о" не как правило, так же как и большинство подобных проблем, всегда используйте свой мозг:) большинство ошибок возникает, когда вы этого не делаете.
В заключение: Скажи "НЕТ", чтобы повторить! (да, я действительно не люблю Решарпера, извините.)