Куда девать «уродство»?

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

Вопрос в том, какой вариант выбрать и почему?

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

Что повлияет на ваш выбор? А если:

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

разве уродство в названии не имело бы я где-нибудь

stephenbayer 16.10.2008 04:08

лол .. тебе не нужно было его менять на моем аккаунте, я просто ломал твои отбивные .. :)

stephenbayer 16.10.2008 04:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
308
5

Ответы 5

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

Процедурное / ООП-программирование существует для того, чтобы убрать "уродливое" из интерфейса (среди прочего). Важно понимать, что чем больше кода требуется для вызова функции, тем менее полезным она становится. Также не забудьте четко задокументировать код и отметить, что там уродливый код и почему.

Кроме того, если эта функция достаточно велика, вы можете поместить ее в отдельный файл .cs или пару .cpp / .h (в зависимости от того, какой язык вы используете).

часто дело не в том, насколько уродливым является интерфейс, а в том, где он находится; код некрасивый для использования (много настроек) или его некрасиво понимать (много угловых случаев)

BCS 16.10.2008 04:24

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

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

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

Кто это написал, не повлияет на мое решение.

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

Уродливый №1 на этом сайте вызова, Уродливый №2 на этом сайте вызова. Или Уродливые с №1 по №42 подряд в функции

BCS 16.10.2008 04:26

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

junkforce 19.10.2008 00:53

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

//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);
}

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

Конечно, лучший вариант - вообще не иметь уродства ... о каком конкретном примере вы думаете прямо сейчас?

Другие вопросы по теме