Як ідеальну модель я використовую такі критерії (з аналогічним обґрунтуванням того, що запропонував Мартін Беккет, тобто думати з точки зору логічної структури, а не з точки зору рядків коду):
Правило 1
Один клас на файл (у C ++: один клас -> один заголовок та один файл реалізації).
Правило 2
Сім вважається кількістю предметів, які наш мозок може спостерігати одночасно, не плутаючись. Вище 7 нам важко тримати огляд того, що ми бачимо. Тому: у кожному класі не повинно бути більше 7-10 методів. Клас, який має більше 10 методів, ймовірно, занадто складний, і вам слід спробувати розділити його. Розщеплення - це дуже ефективний метод, оскільки щоразу, коли ви розділяєте клас, ви зменшуєте складність кожного окремого класу хоча б на 2 рази.
Правило 3
Тіло методу, яке не вміщується в одному або двох екранах, занадто велике (я припускаю, що вікно екрана / редактора приблизно 50 рядків). В ідеалі ви можете побачити весь метод в одному вікні. Якщо це не так, вам потрібно лише трохи прокрутити вгору і вниз, не забуваючи про частину методу, що приховується. Отже, якщо вам потрібно прокрутити більше екрана вгору або вниз, щоб прочитати все тіло методу, ваш метод, ймовірно, занадто великий, і ви можете легко втратити огляд.
Знову ж таки, розщеплення методів приватних довідкових методів може дуже швидко зменшити складність методу (при кожному розщепленні складність принаймні зменшується вдвічі). Якщо ви ввели занадто багато методів приватної допомоги, ви можете розглянути можливість створення окремого класу для їх збирання (якщо у вас більше приватних методів, ніж публічних, можливо, другий клас ховається всередині вашого основного класу).
Збираючи разом ці дуже приблизні оцінки:
- Максимум один клас на вихідний файл.
- Максимум 10 публічних методів на заняття.
- Максимум 10 приватних методів на клас.
- Максимум 100 рядків за методом.
Отже, вихідний файл, що містить понад 2000 рядків, ймовірно, занадто великий і починає бути занадто безладним.
Це дійсно дуже приблизна оцінка, і я не дотримуюсь цих критеріїв систематично (тим більше, що не завжди вистачає часу для належного рефакторингу). Крім того, як запропонував Мартін Бекетт, існують ситуації, коли клас - це велика колекція методів, і немає сенсу розділяти їх якимось штучним способом лише для того, щоб зробити клас меншим.
У будь-якому випадку, з мого досвіду, файл починає не читатись, коли один із наведених параметрів не дотримується (наприклад, тіло методу 300 рядків, що охоплює шість екранів, або вихідний файл із 5000 рядками коду).