Чи існує оптимальна кількість рядків коду на функцію? [зачинено]


18

Функції використовуються не тільки для мінімізації дублювання коду - вони також використовуються для поділу довгої функції на більш дрібні для збільшення читабельності, а також для створення коду самокоментуванням. Однак цей коефіцієнт посилення не прямо пропорційний кількості LOC на функцію чи метод; інакше ми мали б тонни функцій, які містять лише один рядок або два коду.

Це змушує мене замислитися: чи існує оптимальна кількість LOC на функцію? Якщо так, що це таке, і чи відхиляється він між мовами?


6
Дивіться Code Complete Vol 2 від Мітча МакКоннелла в розділі 4, розділ 4.
Пітер Тернер

2
@Peter - Я думаю, ти маєш на увазі "Стів МакКоннелл"
JohnFx

Так, смішно, я б це написав, дивлячись на книгу .... Wasnt Mitch McConnell Pres. Начальник штабу Буша?
Пітер Тернер

3
Кількість майже напевно змінюється залежно від мови: я був би здивований, побачивши 6-рядкову пропозицію Prolog, при цьому я був повністю нормальний із методом Delphi з 20 рядків. Моя відповідь нижче - для Smalltalk, який використовує середовище для заохочення коротких методів.
Френк Ширар

1
@ Петер Тернер: Хм ... від S15 до S15 і від I1 до I11. Здається, що він плутає тимчасові змінні з регістрами. ^^
габлін

Відповіді:


33

Замість кількості рядків я б використав критерії, що кожна функція повинна виконувати лише одне і робить це добре.


Так, якщо у нас є одиниця роботи, я не хочу пересуватись між 50 функціями, щоб отримати суперечку з того, що відбувається. Якщо ви правильно розбиєте свої функції, використовуючи цей показник, вони, природно, мають бути розумними.
ChaosPandion

2
@ChaosPandion: але ваша одиниця роботи, можливо, може бути виражена як послідовність більш елементарних кроків. Якщо ви переглядаєте функцію, ви переглянете послідовність кроків, а не код кожного окремого кроку.
Wizard79

2
@Lorenzo - Якщо це так, кожен крок стає одиницею роботи. Батьківська функція стає оглядом одиниць роботи на високому рівні.
ChaosPandion

1
Так, це справді справді так. Гм, дозвольте мені перефразувати питання: Чи існує оптимальна кількість LOC для функцій, яка робить лише одне, і чи добре це?
габлін

@gablin, важко сказати, а також LOC - це залежно від мови, але якщо ви дотримуєтесь цього принципу, зазвичай ви потрапляєте в розумний діапазон, скажімо, 1 ~ 50.
grokus

21

Старе правило великого пальця полягає в тому, що функція повинна бути повністю видимою на екрані, не потребуючи прокрутки.

Основна ідея полягає в тому, що якщо ви не можете переглянути всю функцію одночасно, функція є надмірно складною, і вам слід розділити її на більш основні частини.

Хоча це правило є дуже практичним і корисним, формальне правило полягає в тому, що ви повинні зберігати лише один логічний крок у функції. Функція виконує лише елементарну роботу, якщо ви можете розділити завдання на більш елементарні частини, функцію потрібно розділити.


21
Цей показник стає прогресивно більш марним із збільшенням середнього розміру / роздільної здатності монітора.
Адам Лір


2
@Anna: ну, мій монітор з високою роздільною здатністю, але також збільшилася кількість панелей інструментів / палітри / панелі. І тоді, тепер я можу використовувати шрифт висоти 14 пт! :)
Wizard79

4
Розмір терміналу 24 х 80 не має тенденції до зміни.
альтернатива

1
нісенітниця, суть правила полягає в тому, "чи можете ви все це бачити без прокрутки". З великим монітором ви можете мати більше своїх функцій, не порушуючи це правило, це не означає, що великим моніторам дозволяється переглядати лише невеликі функції (хоча з усіма панелями інструментів та вікнами властивостей, які має ваш IDE, це, ймовірно, все ще справедливо: - ))
gbjbaanb

15

Немає жодної.

Екрани стають більшими, розміри шрифтів - меншими. Правила великого пальця не працюють настільки добре, коли у людей великі великі пальці.

Будьте лаконічними. Якщо ваша функція робить кілька речей, можливо, це гарна ідея розбити її на більш дрібні.


Щонайменше, ти міг би сказати мені, чому ти вважаєш, що моя відповідь не корисна.
Джош К

7
Я думаю, що хтось образився вашим використанням тегу h1 .
ChaosPandion

@Chaos: Це важлива відповідь.
Джош К

6
Можливо, я був занадто тонким, але мій намір полягав у тому, що немає жодних поважних причин відмовитись від голосування вашої відповіді. Хто б не робив вчинок, мав якийсь випадковий особистий привід зробити це. Вони можуть просто подумати, що Джош - жахливе ім’я.
ChaosPandion

6

У Smalltalk є дещо незвичний спосіб зменшення розміру методів. Коли ви пишете код, ви записуєте його у віджет під назвою браузер. Браузер складається з двох основних частин, розділених горизонтально. Ваш код знаходиться в нижній половині.

За замовчуванням браузер не дуже великий. Ви можете помістити 5 або 6 рядків, перш ніж вам потрібно буде починати прокручування. Прокручування, звичайно, трохи дратує.

Тож у Smalltalk середовище "заохочує" писати короткі методи довжиною, щонайменше, приблизно 6 рядків. (Це звичайно багато; Smalltalk - досить лайлива мова.)


2

Ідеальна кількість рядків коду в методі є змінною. По суті, ви хочете написати лише достатній код, щоб зробити те, що потрібно зробити в контексті визначення функції. Я думаю, що це як якийсь принцип єдиної відповідальності , застосований лише до методу замість класу.

Якщо метод має багато логіки та кілька кроків для виконання, то має сенс розбити метод на кілька дискретних етапів. Кожен з цих кроків буде необхідний для отримання нових методів.

"інакше ми мали б тонни функцій, і всі вони містять лише один рядок або два коду."

Чим менше кожен метод робить, тим легше його визначити та простіше зрозуміти та керувати ним. Немає нічого поганого в тому, щоб мати сотні методів, якщо вони вам потрібні. Крім того, відповідно до SRP, про який я згадував раніше, стає легше витягувати нові класи, коли методи розбивали на більш дрібні та більш керовані шматки.


1

Відповідь звичайно 42 .

Важливо зауважити: жодна фунція ніколи не може порушити СРП , або вам доведеться зіткнутися зі спанішкою .

Кілька підказок, як зменшити кількість рядків:

  • Чи є коментарі, що позначають окремі розділи? Ці розділи повинні бути функціями.
  • Чи є ланцюги if-else або перемикають заяви поза фабрикою / будівельником? Можливо, ваш дизайн потребує кращих моделей дизайну, які допоможуть вам розділити обов'язки.
  • Чи легко перевірити свої функції? Зробіть легко тестувати свої функції, вони розпадуться.
  • Це складний і просто немає землі в сигті (1000 лінійних монстрів)? Робіть металобрухт - це рефактор, і не економте його в надії отримати освіту про обов'язки кодексів.

1
Nᴏʙᴏᴅʏ очікує, що іспанські ... ах, гадюка, я тут трохи запізнився.
Приблизно о

0

Ось декілька підказок:

  • Якщо у вас виникли проблеми з написанням коментаря, що пояснює мету та використання функції, це занадто довго.

  • Якщо ви спокусилися написати коментар, що пояснює активність розділу коду у функції, функція занадто довга.

  • Якщо ви вставляєте код з іншої функції, вони обидва занадто довгі (витягніть цей код як окрему функцію).

  • Якщо вам потрібна умова кодування для відокремлення членів даних класу від локальних змінних, то функція занадто довга, а клас має занадто багато членів.

  • Якщо вам потрібно робити нотатки під час читання функції, це занадто довго.

Маючи "тонни" функцій, довжиною яких є лише один або два рядки, це не обов'язково погано. Я виявив, що ці маленькі функції були використані набагато більше, ніж я спочатку очікував.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.