У меня есть дискуссия с коллегой об API простого класса, который имеет только один общедоступный метод. Я изначально пошел за:
class CalculateSomething
{
public:
void operator()(const SomeObject &obj) const;
private:
// ...
}
Однако мой коллега выступает против использования оператора() и хочет просто называть метод "вычислять" для ясности. Хотя я не считаю этот аргумент убедительным, это заставило меня задуматься о плюсах и минусах.
Преимущества operator()
- Класс является худым и имеет одну четко определенную цель. После создания экземпляра он действует как свободная функция.
- Это функтор и может быть легко использован как таковой (например, алгоритмы STL).
- При использовании алгоритмов с диапазоном объект может передаваться напрямую, а не через указатель функции, который позволяет компилятору встраивать код. Хотя это и не гарантировано, передача его через указатель функции полностью запрещает эту возможность.
Недостатки operator()
- Менее понятно, что делает этот метод, не глядя на имя класса. (Я лично не согласен с тем, что класс имеет только один метод, и поэтому его значение ясно из названия класса)
- Ожидается, что большинство функторов в STL будут неактивными. Это, я думаю, является основной причиной, которая удерживает меня...
Я был удивлен, увидев, что мой поиск по этому поводу не вызвал многого, поскольку я бы предположил, что это довольно распространенный сценарий (один класс, одна ответственность). Таким образом, мне действительно интересно узнать, что думают другие люди.