Существует не только одно решение для такого рода проблем.
Boolean имеет очень низкую семантику. Если вы хотите добавить в будущем новое условие, вам нужно будет добавить новый параметр ...
После четырех лет обслуживания ваш метод может иметь полдюжины параметров, если все эти параметры булевы, это очень хорошая ловушка для сопровождающих.
Enum - хороший выбор, если дела исключительные.
Перечисления могут быть легко перенесены в битовую маску или объект контекста.
Битовая маска : C ++ включает язык C, вы можете использовать некоторые простые старые практики. Иногда битовая маска для неподписанного целого является хорошим выбором (но вы теряете проверку типов), и вы можете ошибочно передать неправильную маску. Это удобный способ плавного перехода от логического аргумента или аргумента enum к этому типу шаблона.
Битовая маска может быть перенесена с некоторым усилием в объект контекста. Возможно, вам придется реализовать некоторую побитовую арифметику, такую как operator |
и operator &
, если вам нужно поддерживать совместимость во время сборки.
Наследование иногда является хорошим выбором, если разделение поведения велико и это поведение связано с жизненным циклом экземпляра. Обратите внимание, что вы также должны использовать полиморфизм, и это может замедлить метод, если этот метод интенсивно используется.
И, наконец, наследование вызывает изменения во всем вашем заводском коде ... И что вы будете делать, если у вас есть несколько методов для изменения эксклюзивным способом? Вы будете загромождать свой код конкретных классов ...
На самом деле, я думаю, что это вообще не очень хорошая идея.
Метод разделения : Другое решение - иногда разделить метод на несколько закрытых и предоставить два или более открытых метода.
Объект контекста : отсутствие именованных параметров в C ++ и C можно обойти, добавив параметр контекста. Я использую этот шаблон очень часто, особенно когда мне приходится передавать много данных через уровень сложной структуры.
class Context{
public:
// usually not a good idea to add public data member but to my opinion this is an exception
bool setup:1;
bool foo:1;
bool bar:1;
...
Context() : setup(0), foo(0), bar(0) ... {}
};
...
Context ctx;
ctx.setup = true; ...
MyObj.foo(ctx);
Примечание:
Что это также полезно для минимизации доступа (или использования) статических данных или запроса к одноэлементному объекту, TLS ...
Контекстный объект может содержать намного больше данных кэширования, связанных с алгоритмом.
...
Я даю волю твоему воображению ...
Анти-узоры
Я добавляю сюда несколько анти-паттернов (для предотвращения изменения подписи):
* НИКОГДА НЕ ДЕЛАЙТЕ ЭТОГО *
- * НИКОГДА НЕ ДЕЛАЙТЕ ЭТОГО * используйте статический int / bool для передачи аргументов (некоторые люди, которые делают это, и это кошмар для удаления такого рода вещей). Прервите хотя бы многопоточность ...
- * НИКОГДА НЕ ДЕЛАЙТЕ ЭТОГО * добавьте элемент данных для передачи параметра в метод.