Сценарий: у меня есть функция, которую мне нужно как-то настроить (например, заставить ее работать немного по-разному в разных местах). По какой-то причине мне приходится добавлять что-то уродливое в код либо в функции, либо на существующих сайтах вызовов. Предположим, что общая сумма «уродливых» одинакова в обоих случаях.
Вопрос в том, какой вариант выбрать и почему?
Должен ли я инкапсулировать его, чтобы мне не нужно было его смотреть, или мне следует извлечь его, чтобы он не добавлял семантический мусор к функции?
Что повлияет на ваш выбор? А если:
лол .. тебе не нужно было его менять на моем аккаунте, я просто ломал твои отбивные .. :)





Положите уродливое в функцию, руки вниз. Если это на C++, убедитесь, что у вас есть реализация в файле .cpp. Возможно, вы можете подумать о написании двух функций, чтобы абстрагироваться от уродливого тела основной функции.
Процедурное / ООП-программирование существует для того, чтобы убрать "уродливое" из интерфейса (среди прочего). Важно понимать, что чем больше кода требуется для вызова функции, тем менее полезным она становится. Также не забудьте четко задокументировать код и отметить, что там уродливый код и почему.
Кроме того, если эта функция достаточно велика, вы можете поместить ее в отдельный файл .cs или пару .cpp / .h (в зависимости от того, какой язык вы используете).
часто дело не в том, насколько уродливым является интерфейс, а в том, где он находится; код некрасивый для использования (много настроек) или его некрасиво понимать (много угловых случаев)
Если уродство не требуется новым вызывающим абонентам, я бы инкапсулировал уродство в новую функцию / помощник / что угодно и вызвал бы его из старых вызывающих, чтобы он не загрязнял существующую функцию для новых вызывающих, и не дублируется для старых абонентов.
Если он никогда не понадобится новым вызывающим абонентам, я бы добавил его в функцию (если это имеет смысл в контексте функции), поскольку это, по сути, устаревший компонент в любом случае, если вы можете надлежащим образом протестировать функциональность.
В итоге, я бы попытался свести к минимуму уродство как в отсутствии дублирования между несколькими вызывающими, так и в минимизации воздействия нового кода. Я бы инкапсулировал его до такой степени, чтобы можно было провести модульное тестирование.
Кто это написал, не повлияет на мое решение.
Я бы лично поместил это в объявление функции - я не могу понять, как включение его в вызовы функции было бы «менее уродливым», поскольку вы, вероятно (по крайней мере, вы подразумевали), что вам придется использовать "некрасиво" не раз.
Уродливый №1 на этом сайте вызова, Уродливый №2 на этом сайте вызова. Или Уродливые с №1 по №42 подряд в функции
Понятно. Нет никакого способа рекурсивно сделать "уродливое" определение функции, чтобы вам не приходилось делать это 42 раза?
Я бы инкапсулировал уродливое в функцию-оболочку и изменил все функции, которые нуждаются в уродливом, чтобы использовать оболочку.
//old call
call_some_function_with_ugly(params, case)
// new call
call_some_function(params)
void call_some_function(params){ }
void call_some_function_with_ugly(params, case){
// do ugly depending on case
switch(case) { ... }
call_some_function(params);
}
Совершенно положите безобразие в функцию. Одна из худших вещей, которую вы можете сделать, - это распространить уродство по остальной части кода, где оно будет изолировано во многих отдельных случаях. Их будет невозможно отследить, если уродство изменится каким-то непредвиденным образом (что часто случается с уродством).
Конечно, лучший вариант - вообще не иметь уродства ... о каком конкретном примере вы думаете прямо сейчас?
разве уродство в названии не имело бы я где-нибудь