Где я должен положить "уродство"? - PullRequest
2 голосов
/ 16 октября 2008

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

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

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

Что повлияет на ваш выбор? Как насчет, если:

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

Ответы [ 5 ]

5 голосов
/ 16 октября 2008

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

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

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

3 голосов
/ 16 октября 2008

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

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

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

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

0 голосов
/ 17 октября 2008

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

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

0 голосов
/ 16 октября 2008

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

//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);
}
0 голосов
/ 16 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...