Чи бувають випадки, коли більше деталізований код (як у більш логічних висловлюваннях) чистіший, ніж більш стислий код?
Чи бувають випадки, коли більше деталізований код (як у більш логічних висловлюваннях) чистіший, ніж більш стислий код?
Відповіді:
Щоб відповісти на це, давайте візьмемо приклад із реального світу, який трапився зі мною. У бібліотеці 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. Більшу частину часу ви не отримаєте нічого актуального, і трапляться випадки, коли це введе вас в оману до зниження якості вашого коду.
Якщо ви хочете побачити кінцевий результат просто мінімізувати кількість байтів або номер локального коду вашого вихідного коду, перегляньте подання на сайт Golf Stack Exchange Code. .
Якщо ваш вихідний код таким чином зменшиться, незабаром у вас виникне незрозумілий безлад. Навіть якщо ви людина, яка написала такий код, і зрозуміла його повністю на той час, наскільки ефективними ви будете, коли повернетесь до нього через півроку? Немає жодних доказів того, що такий мінімальний код насправді виконується і швидше.
Код повинен бути написаний таким чином, щоб будь-який член вашої команди міг поглянути на нього та зрозуміти, що він робить.
Так, рефакторинг, безумовно, може призвести до отримання більше рядків коду.
Найпоширеніший випадок IMO - це коли ви берете код, який не є загальним, і ви робите його більш загальним / гнучким . Генеризуючий код легко змушує рядки коду значно збільшуватися (іноді в два рази і більше).
Якщо ви очікуєте, що нещодавній загальний код буде використаний іншими (а не як внутрішній компонент програмного забезпечення) як бібліотека, ви, як правило, додаєте код unittest та розмітку документації в коді, що знову збільшить рядки коду.
Наприклад, ось дуже поширений сценарій, який відбувається у кожного розробника програмного забезпечення:
Деякі конкретні приклади, які приходять до мене з голови