Расширьте существующий API:Использовать аргумент по умолчанию или функцию-оболочку?

StackOverflow https://stackoverflow.com/questions/940877

  •  06-09-2019
  •  | 
  •  

Вопрос

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

int foo::bar(int x)
{
 // a whole lot of code here
 return 2 * x + 4;
}

широко используется в кодовой базе.Теперь мне нужно сделать 4 параметром, но любой код, который уже вызывает foo::bar, все равно должен получить то, что ожидает.Должен ли я расширить и переименовать старый метод и обернуть его в новый, например

int foo::extended_bar(int x, int y)
{
 // ...
 return 2 * x + y;
}

int foo::bar(int x)
{
 return extended_bar(x,4);
}

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

int bar(int x, int y=4);

и просто расширим функцию

int foo::bar(int x, int y)
{
 // ...
 return 2 * x + y;
}

Каковы преимущества и недостатки каждого варианта?

Это было полезно?

Решение

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

Причина в том, что существует два уровня Обратная совместимость:

  1. Имея исходный уровень Обратная совместимость означает, что вам придется перекомпилировать вызывающий код без изменений, поскольку новые сигнатуры функций совместимы со старыми.Этого уровня можно достичь обоими способами;значения по умолчанию и оболочки/перегрузка.

  2. Более сильный уровень – это двоичный уровень обратная совместимость, которая работает даже без перекомпиляции, например.когда у вас нет доступа к коду вызова.Представьте, что вы развертываете свою функцию в двоичной форме, например, в DLL и т. д.В таком случае подписи должны быть абсолютно одинаковыми, чтобы все работало, чего нельзя сказать о значениях по умолчанию — они нарушат этот уровень совместимости.

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

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

Чем дольше я использую C++, тем меньше мне нравятся параметры функций по умолчанию.Я не могу назвать какую-то конкретную причину своей неприязни, но обнаружил, что если я их использую, то почти всегда потом удаляю их.Итак, мой (субъективный) голос идет за новую именованную функцию - имя, конечно, может быть таким же, как и у старой.

Лично я считаю, что неявное поведение является (одним из) корнем всего зла.

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

Поэтому я бы категорически возражал против варианта с операцией по умолчанию.

Кроме того, я считаю, что если определенную функцию можно вызвать с разным количеством параметров, то в обеих версиях функции есть что-то разное или они делают слишком много.Различие, вероятно, должно быть в названии и, вероятно, должно быть более значимым, чем «_extended».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top