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