"Сутності не повинні примножуватися поза необхідністю".
- Бритва Оккама
Код повинен бути максимально простим. Клопи люблять ховатися між складністю, тому що їх важко помітити. То що робить код простим?
Невеликі одиниці (файли, функції, класи) - хороша ідея . Невеликі одиниці легко зрозуміти, тому що є менше речей, які ви повинні зрозуміти одразу. Звичайні люди можуть підмітати лише 7 концепцій одночасно. Але розмір не просто вимірюється рядками коду . Я можу записати якомога менше коду, використовуючи «гольф» коду (вибираючи короткі імена змінних, беручи «розумні» ярлики, розбиваючи якомога більше коду на один рядок), але кінцевий результат не простий. Намагання зрозуміти такий код більше схоже на зворотну інженерію, ніж читання.
Один із способів скоротити функцію - це витягнути різні допоміжні функції. Це може бути хорошою ідеєю, коли вона витягує самодостатню частину складності . Ізоляційно цей складний склад набагато простіше в управлінні (і тесті!), Ніж коли він вбудований у непов'язану проблему.
Але кожен виклик функції має когнітивний наклад : мені не просто потрібно розуміти код у моєму поточному фрагменті коду, я також повинен розуміти, як він взаємодіє з кодом зовні . Я думаю, що справедливо сказати, що функція, яку ви видобули, вносить більше складності у функцію, ніж вона витягує . Це те, що ваш начальник мав на увазі під « дрібними функціями [це] біль, тому що він змушує вас перейти до кожної невеликої функції, щоб побачити, що робить код» "
Іноді довгі нудні функції можуть бути неймовірно простими для розуміння, навіть коли вони складають сотні рядків. Це трапляється в коді ініціалізації та конфігурації, наприклад, при створенні GUI вручну без редактора перетягування. Немає жодної складової складності, яку ви могли б розумно витягти. Але якщо форматування читається і є якісь коментарі, насправді не складно простежити за тим, що відбувається.
Існує багато інших показників складності: Кількість змінних в області застосування повинна бути якомога меншою. Це не означає, що нам слід уникати змінних. Це означає, що ми повинні обмежувати кожну змінну до найменшої можливої області, де вона потрібна. Змінні також стають простішими, якщо ми ніколи не змінюємо значення, яке вони містять.
Дуже важливою метрикою є цикломатична складність (складність МакКейба). Він вимірює кількість незалежних шляхів через фрагмент коду. Це число зростає експоненціально з кожним умовним. Кожен умовний або цикл подвоює кількість шляхів. Існують докази того, що оцінка більшої ніж 10 балів є надто складною. Це означає, що дуже довга функція, яка, можливо, має бал 5, можливо, краще, ніж дуже коротка і щільна функція з балом 25. Ми можемо зменшити складність, витягнувши контрольний потік в окремі функції.
Ваш умовний приклад - це приклад складності, який можна отримати повністю:
function bigFatFunction(...) {
...
phoneNumber = getPhoneNumber(headers);
...
}
...
function getPhoneNumber(headers) {
return headers.resourceId ? headers.resourceId : DEV_PHONE_NUMBER;
}
Це все ще дуже зручно. Я не впевнений, чи це суттєво зменшує складність, оскільки це умовне не дуже умовне . У виробництві воно завжди піде однаковим шляхом.
Складність ніколи не може зникнути. Його можна лише перетасувати навколо. Чи багато дрібних речей простіше, ніж кілька великих речей? Це дуже залежить від обставини. Зазвичай є якесь поєднання, яке відчуває себе правильно. Виявлення того, що компроміс між різними факторами складності вимагає інтуїції та досвіду та трохи удачі.
Знання, як писати дуже маленькі функції та дуже прості функції - корисний навик, тому що ви не можете зробити вибір, не знаючи альтернатив. Сліпо слідування правилам чи найкращим практикам, не замислюючись про те, як вони застосовуються до нинішньої ситуації, призводить до середніх результатів у кращому випадку, у найгіршому - програмування культового культу .
Ось де я не згоден з вашим начальником. Його аргументи не є недійсними, але жодна з книг «Чистий код» не є правильною. Напевно, краще слідувати вказівкам свого начальника, але сам факт, що ти думаєш над цими проблемами, намагаючись знайти кращий шлях, дуже перспективний. Отримавши досвід, вам буде легше знайти хороший факторинг для вашого коду.
(Примітка. Ця відповідь частково ґрунтується на думках із публікації блогу Reasonable Code на Білій дошці Джиммі Хоффа , яка забезпечує перегляд високого рівня на те, що робить простий код.)