Здравствуйте, dosik, Вы писали:
Требование к разбиению кода на функции произрастает из требований читабельности. Т.е. разбиение кода на функции должно увеличивать читабельность кода, а не наоборот. Объявление функции/класса, создаёт новую абстракцию, на которую мы можем ссылаться в дальнейшем, что упрощает понимание кода. Но. Это упростит понимание, только в том случае, если абстракция переиспользуется многократно. В противном случае мы лишь повышаем сложность кода ( вместо однократного прямолинейного чтения кода нам требуется изучить абстракцию, запомнить её имя и вернуться в контекст её использования ). Как следствие, зачастую определять новую функцию имеет смысл только для устранения копи-пасты. И вот тут самое главное, различить что называется common code от coincidental code (общий код vs совпадающий код). Сommon code это код, практически всегда не завязан на контекст использования, и фактически является строительным блоком сам по себе ( для классов есть семантически близкое понятие — ADT ). Coincidental code напротив, бессмысленнен вне контекста использования, и наличие идентичного кода это всего лишь совпадение. Скорее всего при попытке вынести совпадающий код в отдельную функцию, для неё будет очень сложно придумать имя (скорее всего это будет очень специфичное имя). И что самое неприятное, вынесение coincidental code в отдельную абстракцию порождает сильное зацепление (coupling) там, где его не должно быть. Типичные примеры common code — алгоритмы. Типичные примеры coincidental code — одинаковые шаги в тест кейсах.
Немного ссылок для углубления в тему:
https://en.wikipedia.org/wiki/Abstraction_principle_(computer_programming)
https://en.wikipedia.org/wiki/Copy_and_paste_programming
http://zacharyvoase.com/2013/02/08/copypasta/
http://c2.com/cgi/wiki?CopyAndPaste
http://programmers.stackexchange.com/questions/165408/copy-and-pasted-test-code-how-bad-is-this
https://www.reddit.com/r/programming/comments/1d2mff/is_it_ok_to_split_long_functions_and_methods_into/