Существуют ли случаи, когда более подробный код (как в более логичных выражениях) является более чистым, чем более сжатый код?
Существуют ли случаи, когда более подробный код (как в более логичных выражениях) является более чистым, чем более сжатый код?
Ответы:
Чтобы ответить на этот вопрос, давайте рассмотрим пример из реальной жизни, который произошел со мной. В C # библиотеке, которую я поддерживаю, у меня был следующий код:
TResult IConsFuncMatcher<T, TResult>.Result() =>
TryCons(_enumerator) is var simpleMatchData && !simpleMatchData.head.HasValue
? _emptyValue.supplied
? _emptyValue.value
: throw new NoMatchException("No empty clause supplied");
: _recursiveConsTests.Any()
? CalculateRecursiveResult()
: CalculateSimpleResult(simpleMatchData);
Обсуждая это с коллегами, единодушным вердиктом было то, что вложенные троичные выражения в сочетании с «умным» использованием is var
привели к краткому, но трудному для чтения коду.
Так что я рефакторинг это:
TResult IConsFuncMatcher<T, TResult>.Result()
{
var simpleMatchData = TryCons(_enumerator);
if (!simpleMatchData.head.HasValue)
{
return _emptyValue.supplied
? _emptyValue.value
: throw new NoMatchException("No empty clause supplied");
}
return _recursiveConsTests.Any()
? CalculateRecursiveResult()
: CalculateSimpleResult(simpleMatchData);
}
Оригинальная версия содержала только одно составное выражение с неявным return
. Новая версия теперь содержит явное объявление переменной, if
оператор и два явных returns
. Он содержит больше операторов и больше строк кода. Тем не менее все, с кем я консультировался, считали, что легче читать и рассуждать, что является ключевыми аспектами «чистого кода».
Таким образом, ответ на ваш вопрос - решительное «да», более подробный может быть чище, чем сжатый код, и, следовательно, является действительным рефакторингом.
!
условие из условия. Я также предложил бы поместить второе возвращение в else
. Но даже в том виде, в каком оно есть, это значительное улучшение.
if (!foo.HasValue)
это идиома в вашем коде, то еще сильнее. Однако if
это не на самом деле выход быстротвердеющий - это «делать это или что в зависимости.»
1. Отсутствие корреляции между LOC и качеством кода.
Целью рефакторинга является улучшение качества фрагмента кода.
LOC - это очень базовая метрика, которая иногда коррелирует с качеством фрагмента кода: например, метод с несколькими тысячами LOC может иметь проблемы с качеством. Следует отметить, однако, что LOC не является единственным показателем, и во многих случаях отсутствует корреляция с качеством. Например, метод 4 LOC не обязательно является более читабельным или более поддерживаемым, чем метод 6 LOC.
2. Некоторые методы рефакторинга состоят из добавления LOC.
Если вы возьмете список методов рефакторинга , вы легко сможете найти те, которые заключаются в намеренном добавлении LOC. Примеры:
Оба являются очень полезными методами рефакторинга, и их влияние на LOC совершенно не имеет значения при рассмотрении, использовать их или нет.
Избегайте использования LOC.
LOC - опасный показатель. Его очень легко измерить и очень трудно правильно интерпретировать.
Пока вы не ознакомитесь с методами измерения качества кода, в первую очередь попробуйте не измерять LOC. В большинстве случаев вы ничего не получите, и в некоторых случаях это может ввести вас в заблуждение и снизить качество вашего кода.
Если вы хотите увидеть конечный результат, сводя к минимуму количество байтов или количество LoC в вашем исходном коде, посмотрите на материалы, представленные на сайте Stack Exchange Code Golf .
Если ваш исходный код сокращен таким образом, у вас скоро будет неразрешимый беспорядок. Даже если вы тот человек, который написал такой код и в то время полностью его понимал, насколько вы будете эффективны, когда вернетесь к нему через шесть месяцев? Нет никаких доказательств того, что такой минимальный код на самом деле выполняется быстрее.
Код должен быть написан таким образом, чтобы любой член вашей команды мог посмотреть на него и сразу понять, что он делает.
Да, рефакторинг определенно может привести к большему количеству строк кода.
Наиболее распространенный случай IMO - когда вы берете код, который не является универсальным, и вы делаете его более универсальным / гибким . Обобщение кода легко приводит к значительному увеличению строк кода (иногда в два или более раз).
Если вы ожидаете, что новый универсальный код будет использоваться другими (а не просто как внутренний программный компонент) в качестве библиотеки, то обычно вы добавляете код проверки кода и разметку документации в коде, что снова увеличивает количество строк кода.
Например, вот очень распространенный сценарий, который происходит для каждого разработчика программного обеспечения:
Некоторые конкретные примеры, которые приходят ко мне из головы: