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

18

Функции используются не только для минимизации дублирования кода - они также используются для разделения длинной функции на более мелкие, чтобы повысить удобочитаемость, а также для обеспечения самокомментирования кода. Тем не менее, это усиление не прямо обратно пропорционально количеству LOC на функцию или метод; иначе у нас было бы множество функций, каждая из которых содержит только одну или две строки кода.

Это заставляет меня задуматься: существует ли оптимальное количество LOC на функцию? Если так, что это, и это отклоняется между языками?

gablin
источник
6
См. Code Complete Vol 2 от Mitch McConnell, глава 7, раздел 4, для хорошего времени.
Питер Тернер
2
@Peter - я думаю, что вы имеете в виду "Стив Макконнелл"
JohnFx
Да, смешно, я бы написал это, глядя на книгу .... Разве не Митч Макконнелл Прес. Начальник штаба Буша?
Питер Тернер
3
Число почти наверняка варьируется в зависимости от языка: я был бы удивлен, увидев 6-строчное предложение Prolog, и в то же время прекрасно с 20-строчным методом Delphi. Мой ответ ниже для Smalltalk, который использует среду для поощрения коротких методов.
Фрэнк Шиарар
1
@ Питер Тернер: Хм ... S1 - S15 и I1 - I11. Похоже, он путает временные переменные с регистрами. ^^
Габлин

Ответы:

33

Вместо числа строк я бы использовал следующие критерии: каждая функция должна выполнять только одну функцию и делает это хорошо.

grokus
источник
Да, если у нас есть единица работы, мне не нужно переключаться между 50 функциями, чтобы понять суть происходящего. Если вы выделите свои функции надлежащим образом, используя эту метрику, они, естественно, должны быть разумного размера.
ChaosPandion
2
@ChaosPandion: но ваша единица работы, вероятно, может быть выражена как последовательность более элементарных шагов. Если вы просматриваете функцию, вы пересмотрите последовательность шагов, а не код каждого отдельного шага.
Wizard79
2
@Lorenzo - В этом случае каждый шаг становится единицей работы. Родительская функция становится высокоуровневым обзором единиц работы.
ChaosPandion
1
Да, это действительно так. Хм, позвольте мне перефразировать вопрос: есть ли оптимальное количество LOC для функций, которое выполняет только одно и хорошо ли это?
Габлин
@ gablin, трудно сказать, а также LOCs зависит от языка, но если вы придерживаетесь этого принципа, обычно вы находитесь в разумных пределах, скажем, 1 ~ 50.
grokus 5.10.10
21

Старое правило большого пальца гласит, что функция должна быть полностью видимой на экране, без необходимости прокрутки.

Основная идея заключается в том, что, если вы не можете одновременно рассмотреть всю функцию, функция слишком сложна, и вам следует разбить ее на несколько основных частей.

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

Wizard79
источник
21
Этот показатель становится все более бесполезным по мере увеличения среднего размера / разрешения монитора.
Адам Лир
2
Наш программист только что сказал этот пример накануне вечером :)
cdnicoll 4.10.10
2
@ Анна: хорошо, у моего монитора высокое разрешение, но также увеличилось количество панелей инструментов / палитр / панелей. И теперь, теперь я могу использовать шрифт 14 pt! :)
Wizard79
4
Размер терминала 24 x 80 не имеет тенденцию изменяться.
альтернатива
1
ерунда, смысл правила таков: «Вы можете увидеть все это без прокрутки». С большим монитором вы можете иметь больше в своей функции, не нарушая этого правила, это не означает, что большие мониторы могут просматривать только небольшие функции (хотя со всеми панелями инструментов и окнами свойств, которые есть в вашей IDE, это, вероятно, все еще остается верным: - ))
gbjbaanb
15

Здесь ничего нет.

Экраны становятся больше, размеры шрифтов меньше. Эмпирические правила не работают так хорошо, когда у людей большие пальцы.

Будьте лаконичны. Если ваша функция делает несколько вещей, вероятно, будет хорошей идеей разбить ее на более мелкие.

Джош К
источник
Самое меньшее, что вы могли бы сделать, это сказать мне, почему вы думаете, что мой ответ не полезен.
Джош К
7
Я думаю, что кто-то был оскорблен вашим использованием тега h1 .
ChaosPandion
@ Chaos: это важный ответ.
Джош К
6
Может быть, я был немного хитрым, но я намеревался подразумевать, что нет никаких веских причин, чтобы отклонить ваш ответ. Кто бы ни делал дело, у него была какая-то случайная личная причина для этого. Они могут просто думать, что Джош ужасное имя.
ChaosPandion
6

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

По умолчанию браузер не очень большой. Вы можете вставить 5 или 6 строк, прежде чем начать прокрутку. Прокрутка, конечно, немного раздражает.

Таким образом, в Smalltalk среда «побуждает» вас писать короткие методы длиной не более 6 строк. (Обычно этого достаточно; Smalltalk - довольно лаконичный язык.)

Фрэнк Шиарар
источник
2

Идеальное количество строк кода в методе является переменным. По сути, вы хотите написать только достаточно кода, чтобы сделать то, что нужно сделать в контексте определения функции. Я считаю это своего рода Принципом единой ответственности , применяемым только к методу, а не к классу.

Если у метода много логики и много шагов для выполнения, то имеет смысл разделить метод на несколько отдельных шагов. Каждый из этих шагов будет извлечен в новые методы по мере необходимости.

«В противном случае у нас было бы множество функций, каждая из которых содержит только одну или две строки кода».

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

S.Robins
источник
1

Ответ, конечно, 42 .

Важно отметить: ни одна функция не может нарушать SRP , или вам придется столкнуться с инквизицией спаниша .

Несколько советов, как уменьшить количество строк:

  • Есть комментарии, отмечающие отдельные разделы? Эти разделы должны быть функциями.
  • Существуют ли цепочки if-else или операторы switch за пределами фабрики / производителя? Вашему дизайну могут потребоваться более совершенные шаблоны проектирования, чтобы помочь вам разделить обязанности.
  • Легко ли проверить ваши функции? Сделайте свои функции легко тестируемыми, они развалится.
  • Это сложно и просто без земли (1000 линейных монстров)? Сделайте рефакторинг лома - это рефакторинг и не сохраняйте его в надежде получить информацию об обязанностях кодов.
Johannes
источник
1
Не ждет испанцев ... ах, черт возьми , я немного опоздал.
оставил около
0

Вот несколько подсказок:

  • Если у вас возникли проблемы с написанием комментария, объясняющего назначение и использование функции, это слишком долго.

  • Если у вас возникает желание написать комментарий, объясняющий действие части кода в функции, то функция слишком длинная.

  • Если вы вставляете код из другой функции, они оба слишком длинные (извлеките этот код как отдельную функцию).

  • Если вам нужно соглашение о кодировании для отделения членов данных класса от локальных переменных, то функция слишком длинная, и у класса слишком много членов.

  • Если вам нужно делать заметки во время чтения функции, это слишком долго.

Наличие «тонны» функций, каждая из которых состоит из одной или двух строк, не обязательно является плохой вещью. Я обнаружил, что эти маленькие функции были использованы намного больше, чем я первоначально ожидал.

Кевин Клайн
источник