насколько большой должна быть длина функции (строки кода в функции)?

Возможный дубликат:
Сколько строк кода должно быть у функции / процедуры / метода?

Я хотел бы знать, сколько строк кода должно быть у функции? Сколько строк - это слишком много.

Я читал это некоторое время назад, там было около 10 или 20 строк, но это было потому, что на экране было не так много строк. Теперь, когда размер экрана становится больше, этого не происходит.

Предположим, что никакая часть функции не используется где-либо еще, т.е. игнорирует принцип DRY.

Я хотел бы услышать, что другие говорят по этому поводу.

благодаря.

Примечание: дубликат Когда функция слишком длинная?, не смог найти, когда разместил.


person hIpPy    schedule 04.06.2010    source источник
comment
Прежде чем мы сможем ответить на этот вопрос, нам нужно определить строку кода.   -  person corsiKa    schedule 04.06.2010
comment
Двадцать семь с половиной.   -  person    schedule 04.06.2010
comment
будет, спасибо за бессмысленный комментарий. надеюсь, ты чувствуешь себя лучше.   -  person hIpPy    schedule 05.06.2010


Ответы (10)


Ответы на этот тип вопросов можно найти в Code Complete. Стив МакКоннел написал целую страницу, чтобы ответить на этот вопрос. Его вывод:

Десятилетия свидетельств говорят о том, что подпрограммы такой длины (> 100 строк) подвержены ошибкам не больше, чем более короткие подпрограммы. Пусть такие вопросы, как согласованность процедуры, количество точек принятия решения, количество комментариев, необходимых для объяснения процедуры, и другие соображения, связанные со сложностью, определяют продолжительность процедуры, а не налагают ограничение на длину как таковое. Тем не менее, если вы хотите написать подпрограммы длиной более 200 строк, будьте осторожны.

person JRL    schedule 04.06.2010

Линии не имеют значения, но сложность имеет значение.

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

person CaffGeek    schedule 04.06.2010
comment
Что касается контроллера или основного цикла, по моему опыту, они, как правило, немного сложнее, чем функция с одной целью - возможно, я делаю это неправильно, конечно ... Я согласен с вашим комментарием в целом, но думаю, что всегда исключения - person blissapp; 04.06.2010
comment
@blissapp: ну, всегда есть очевидные исключения;) - person FrustratedWithFormsDesigner; 04.06.2010

Его должно быть столько, сколько нужно.

Я не вижу смысла ограничивать количество строк функции размером экрана (хорошо, если честно, я не начинал программировать, пока экраны не могли вместить более 10-20 строк - возможно, это имело смысл в некоторых средах) . Просто напишите функцию так, как она имеет смысл. Когда он становится настолько большим, что фрагменты кода начинают повторяться, реорганизуйте эти фрагменты в другие функции / классы / компоненты.

person FrustratedWithFormsDesigner    schedule 04.06.2010

Это довольно произвольное практическое правило. Некоторым нравится 20 строк, другим нравится правило запрета прокрутки. В конце концов, просто убедитесь, что он читается и легко понимается с первого взгляда. Прочтите свои принципы SOLID и убедитесь, что за метод возложена только одна ответственность. , и т.д.

person Andy_Vulhop    schedule 04.06.2010

Как можно дольше и как можно короче.

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

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

person Morfildur    schedule 04.06.2010

Я не думаю, что имеет значение, сколько в нем строк ... если это эффективно.

Любой код, который можно повторно использовать в любом месте вашей кодовой базы, следует переместить в другую функцию / метод того же класса или общего класса и вызвать.

person Ed B    schedule 04.06.2010
comment
Размер имеет значение - удобочитаемость очень важна, и, столкнувшись со стеной текста, мы, программисты (будучи очень эффективными), не замечаем функции. Я знаю, нам всем нравится делать вид, что мы этого не делаем, но мы делаем это. - person corsiKa; 04.06.2010
comment
Вы можете сделать код читабельным, не создавая дополнительных функций. - person Ed B; 04.06.2010

Я слышал о метрике размера экрана и раньше, но, очевидно, не предназначен для жесткого ограничения или масштабирования с размером монитора. Он просто предназначен для передачи принципа DRY и того, что сохранение функций как можно меньшего размера - один из лучших способов написать код, который можно масштабировать (в размере проекта).

person bshields    schedule 04.06.2010
comment
Предположим, что никакая часть функции не используется где-либо еще, т.е. игнорирует принцип DRY. Поменял вопрос по принципу СУХОЙ. - person hIpPy; 04.06.2010
comment
Часть функции сегодня не может быть использована где-либо еще, но как насчет завтра или в следующем году? Когда вы вернетесь к коду и вам нужно будет использовать эту часть функциональности, будет ли она доступна в отдельной функции или вам придется извлекать ее из существующей функции? Когда вы дойдете до этой точки, может оказаться слишком много работы или слишком дестабилизировать для повторного факторинга старой функции, поэтому вы просто копируете ту часть, которую хотите. Это основной способ нарушения DRY. Вы очень редко пожалеете о создании дополнительной функции или класса, но часто будете сожалеть, что НЕ сделали этого. - person bshields; 04.06.2010

В документе о стиле кодирования ядра Linux говорится:

Функции должны быть короткими и понятными и делать только одно. Они должны умещаться на одном или двух экранах с текстом (размер экрана ISO / ANSI составляет 80x24, как мы все знаем), и делать что-то одно, и делать это хорошо.

Теперь я понимаю, что это происходит в контексте кода ядра, но я думаю, что некоторые моменты, которые он затрагивает в re: function length, в целом верны. Найдите копию здесь. Раздел о функциях - это Глава 4.

В общем, длина функции не должна ограничиваться каким-то искусственным правилом; вычеркните материал, если он имеет смысл и потому что это облегчает чтение, но правило об 1-2 экранах не высечено на камне.

person Roadmaster    schedule 04.06.2010

это просто мнение с точки зрения oo:

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

очень тривиальный функциональный пример: вместо функции, которая вычисляет последовательность Фибоначчи, встроенную в цикл, я бы добавил функцию-преемник (int a, int b), которая вызывается функцией fibonacci ().

более сложным примером может быть http-клиент, который выполняет запрос GET. я бы разбил это на что-то вроде этого:

Connection getConnection(String host, int port)
Request createRequest(String[] params)
void sendRequest(Request r)
String getResponse(Connection c,Request r)
person fasseg    schedule 04.06.2010

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

person blissapp    schedule 04.06.2010