avva: (Default)
[personal profile] avva
Эта запись будет интересна только программистам.

Предлагаю вопрос о том, как обустраивать код. Представьте себе, что у вас есть функция foo() (неважно, на каком языке; может, это метод, а не функция - неважно), вся работа которой - вызвать какие-то другие четыре функции A(), B(), C(), D(), которые расположены в других файлах и которые и делают всю основную работу. foo() должна приготовить для них аргументы, передать результаты работы A() в B(), и так далее. Логика foo() выглядит очень просто:

1. Вызвать A().
2. Вызвать B().
3. Вызвать C().
4. Если результат, который вернула C, интересный (условие на одну строчку), вызвать D().

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

Есыь предложение разбить функцию foo(), выделив каждый из логических кусков в отдельную функцию - скажем, doA(), doB() итд. - чтобы foo() только их вызывала. Противник этого преедложения говорит, что на данный момент нет никаких оснований считать, что кому-то еще понадобиться вызывать doA(), doB() итд., кроме foo(). Кроме того, тестировать отдельно doA(), doB() итд. тоже не надо - у главных функций A(), B() итд. есть свои тесты, и у foo() будет свой тест. С другой стороны, сторонник этого предложения, соглашаясь с этим, говорит, что все равно foo() слишком длинна, и что раз есть возможность выделить ее части в отдельные функции, правильным будет сделать этот рефакторинг. После него код будет читабельнее, понятнее, и удобнее для поддержки.

Как вы считаете? И какие аргументы выдвинули бы в поддержку своей точки зрения?

Date: 2010-01-05 04:40 pm (UTC)
From: [identity profile] vodianoj.livejournal.com
Я думал о специфических комментария для отделения логики от шелухи, как если бы у тебя был жёлтый маркер, с помощью которого можно было бы выделить вызовы А, Б, С и Д.

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

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



December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 30th, 2025 08:19 am
Powered by Dreamwidth Studios