2010-06-04 3 views
3

Можно создать дубликат:
How many lines of code should a function/procedure/method have?Насколько велика должна быть длина функции (строки кода в функции)?

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

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

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

Хотелось бы услышать, что другие могут сказать об этом.

спасибо.

Примечание: Дубликат When is a function too long?, не смог найти его, когда я разместил.

+1

Прежде чем мы сможем ответить на этот вопрос, нам нужно определить «строку кода». – corsiKa

+5

Двадцать семь с половиной. – Will

+0

будет, спасибо за бессмысленный комментарий. надеюсь, что тебе лучше. – hIpPy

ответ

5

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

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

4

У него должно быть столько, сколько ему нужно.

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

2

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

0

Не думаю, что важно, сколько строк у него есть ... до тех пор, пока оно эффективно.

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

+0

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

+0

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

0

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

+0

Предположим, что никакая часть функции не используется нигде, кроме принципа DRY. Изменился вопрос о принципе DRY. – hIpPy

+0

Часть функции не может быть использована нигде сегодня, но как насчет завтра или в следующем году? Когда вы возвращаетесь к коду и должны использовать эту функциональность, легко ли она доступна в своей собственной функции или вам придется вырвать ее из существующей функции? Когда вы доберетесь до этого момента, это может быть слишком много работы или слишком дестабилизирующей, чтобы перераспределить старую функцию, поэтому вы просто скопируете часть, которую хотите. Это основной способ, которым DRY нарушается. Вы очень редко жалеете о создании дополнительной функции или класса, но часто будете сожалеть о том, что НЕ делайте это. – bshields

17

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

Функция должна выполнять одну задачу, и она должна быть очевидной. Это не должно занять несколько секунд, чтобы точно понять, как и что делает функция.

+3

лучший ответ еще ... – fasseg

+2

Что касается «контроллера» или «основной петли» в моем опыте, то они, как правило, немного сложнее, чем одна цель - возможно, я делаю это неправильно, конечно ... Я согласен с вашим комментарием в целом, но думаю, что всегда есть исключения – blissapp

+2

@blissapp: ну, всегда есть очевидные исключения;) – FrustratedWithFormsDesigner

1

Если необходимо, как можно меньше.

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

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

0

Ядро Linux Стиль кодирования документ говорит:

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

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

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

0

это просто мнение от оо-перспективы:

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

пример простой тривиальной функции вместо функции, которая вычисляет последовательность фибоначчи inline в цикле, я бы добавил функцию-преемник (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) 
0

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