кусок кода, который вызывается только один раз, заслуживает собственного метода?

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

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

Но, видя эти аккуратно разбитые куски кода на собственные методы (и накладные расходы на вызов собственных методов), я начинаю думать, что, возможно, я что-то упускаю.

Какие другие причины, кроме как для целей документации, могут оправдать размещение только 4 строк кода (которые вызываются только один раз!) в собственный метод?


person an00b    schedule 30.01.2012    source источник
comment
Читаемость? Самодокументирующийся код? Накладные расходы на вызов метода можно в значительной степени игнорировать в Java, поскольку это не имеет большого значения.   -  person Marcelo    schedule 30.01.2012


Ответы (7)


Есть несколько причин, о которых я могу думать, хотя, по общему признанию, есть некоторое совпадение:

  • Это помогает сделать ваш код самодокументируемым.
  • Это упрощает (модульное) тестирование.
  • Это помогает остановить вас от методов длиной в сотни строк.
  • Возможно, вы захотите использовать этот код в другом месте в будущем.

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

person vaughandroid    schedule 30.01.2012
comment
+1 за эмпирическое правило. Я собираюсь выделить это: if you can't think of a name for it, it probably shouldn't be a method. - person an00b; 30.01.2012

Три причины начать с:

  • Вы можете протестировать его отдельно от всего остального. (Это может в конечном итоге пойти против мантры тестирования только общедоступных API, но меня это устраивает. Раздражает, если мне приходится делать метод на уровне пакета вместо частного, чтобы протестировать его, но я бы предпочел сделать это, чем нужно проверить огромный кусок логики за один раз.)
  • Вы можете построить более сложный метод из простых методов, где весь сложный метод находится на одном уровне абстракции, без указания деталей. Чтение высокоуровневого метода означает просто чтение названий строительных блоков, из которых он состоит; затем вы можете углубиться в только детали, которые вас интересуют, если вам это нужно.
  • Вы можете написать методы, каждый из которых хорошо справляется с одной задачей, назвать и документировать их очевидным образом.

Конечно, с этим можно переусердствовать, но это определенно может быть полезно.

person Jon Skeet    schedule 30.01.2012

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

person hvgotcodes    schedule 30.01.2012

Мы надеемся, что это облегчает более чистый код, и его должно быть легче тестировать.

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

person nicholas.hauschild    schedule 30.01.2012
comment
Извините, под звонком только один раз я имел в виду звонили только из одного места. Например, этот код может вызываться много раз в цикле. - person an00b; 30.01.2012
comment
Накладные расходы по-прежнему должны быть незначительными, так как в этом случае компилятор все равно может выполнить некоторые JIT-оптимизации. - person nicholas.hauschild; 30.01.2012

См. обоснования, приведенные для рефакторинга Compose Method.

person Jeff Foster    schedule 30.01.2012

Удобочитаемость — моя главная причина такого поведения при кодировании.

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

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

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

По крайней мере, это моя интерпретация.

person Jamie Taylor    schedule 30.01.2012

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

person Ron    schedule 30.01.2012