(примечание: tl; dr доступно в самом низу для моего реального мнения)
Я не собираюсь цитировать какое-либо громкое имя и говорить, что это правильный ответ, потому что это всегда очень зависит от того, как вы все это делаете. Например, количество методов: Если вы создаете управляющее программное обеспечение для пульта ДУ современного HD LCD телевизора, который имеет около 40-50 кнопок, как вы можете разбить его на классы связно , чтобы у вас было только как, скажем, 7 методов в классе?
Лично мне нравится хранить все методы одного уровня доступа в одном классе, что означает, что некоторые служебные классы могут иметь сотни методов, но, по моему мнению, проще сделать что-то вроде StringUtil.escapeXMLspecialCharacters(someString)
, чем StringUtil.XML.escapeSpecialCharacters(someString)
или * 1009. *. Хотя все эти решения кажутся нормальными, первое процветает (по крайней мере, на мой взгляд, так!), Потому что это простой и очень простой способ получить доступ к этому методу: вам не нужно думать, содержит ли строка, которую вы обрабатываете XML, XHTML, JSON или что-то еще, вы просто выберете один метод из общей группы методов и все.
Продолжая аналогию с предыдущим телевизионным пультом, давайте предположим, что вы все равно делите их на различные классы. Если мы позволим себе иметь в среднем по 7 таких методов на класс и сумеем сгруппировать кнопки на пульте в сенсорные группы, такие как MenuButtons
, AdjustmentButtons
и NumberSelectorButtons, мы получим около 8 классов. Это на самом деле неплохо, но легко запутывается, особенно если они не разделены на чувственные группы с большой осторожностью. Представьте себе, что вокруг вашего офиса TVRemotes'R'Us Inc. - шум: «Кто сказал, что кнопка включения / выключения - это кнопка управления?» «Кто тот джокер, который поставил громкость +/- на кнопки меню? PRE / CH (кнопка, которая переключается между текущим и предыдущим каналом и / или источником изображения) * Кнопка 1015 * не является цифровой кнопкой!» «Кнопка гида открывает как телепрограмму, так и навигационное меню в зависимости от контекста, что мы будем с этим делать!?»
Так что, как можно надеяться, видно из этого примера, использование некоторого произвольного числа для ограничения себя может внести некоторую ненужную сложность и нарушить логический поток приложения.
Прежде чем я добавлю свои последние два цента, одну вещь о количестве строк в методе: думайте код как блоки. Каждый цикл является блоком, каждый условный блок является блоком и так далее и так далее. Какое минимальное количество этих блоков необходимо для единицы кода, которая несет единоличную ответственность? Это должно быть вашим ограничителем, а не желанием иметь «Семерку везде». из числа классов в пакете, методов в классах и строк кода в методах.
А вот и TL; DR :
Итак, мое реальное мнение на самом деле таково: количество классов в пакете должно быть довольно низким. В последнее время я начал делать следующее, но я не уверен, что буду придерживаться этого:
- Пакет
foo
содержит интерфейсы и другие общие классы для реализаций.
- Пакет
foo.bar
содержит реализацию указанных интерфейсов для функции bar
- Пакет
foo.baz
содержит реализацию указанных интерфейсов для функции baz
Обычно это означает, что вся моя структура имеет согласованное (и, скорее всего, низкое) количество классов, и, прочитав интерфейсы классов верхнего уровня (и их комментарии), я смогу понять и другие пакеты.
Методы в классе: все, что необходимо, как я объяснил выше. Если ваш класс не может жить без 170 методов, то пусть у них есть. Рефакторинг - это добродетель, а не то, что можно применять постоянно.
Строк на метод: как можно меньше, обычно я получаю от 10 до 25 строк на метод, и 25 для меня немного выше, поэтому я бы сказал, что 10 - это хороший баланс для этого.