Я обсуждаю с коллегой API простого класса, который имеет только один публичный метод. Я изначально пошел на:
class CalculateSomething
{
public:
void operator()(const SomeObject &obj) const;
private:
// ...
}
Тем не менее, мой коллега выступает против использования operator () и желает просто назвать метод «вычисления» для ясности.
Хотя я не считаю этот аргумент убедительным, он заставил меня задуматься о плюсах и минусах.
Я был удивлен, увидев, что мой поиск по этому вопросу не принес много пользы, так как я предположил, что это довольно распространенный сценарий (один класс, одна ответственность). Таким образом, мне действительно интересно услышать, что другие люди думают об этом.
Если лямбды действительно не вариант, ваш выбор должен зависеть от объема работ, выполняемых объектом … и от ваших соглашений или стилей кодирования. Вы можете решить быть явным (см. Werolikответ), это хорошо, если метод относительно незнаком и требует состояний, но
Давайте возьмем простые варианты использования из стандартной библиотеки …
Общее, что вы видите во всем этом, это то, что они глаголы… С моей точки зрения, если ваш класс в точности соответствует фрагменту, который вы опубликовали, CalculateSomething
означает действие для меня, поэтому я всегда могу создать его экземпляр как CalculateSomething()(my_object...)
,
И, как вы указали, это очень удобно при использовании самого алгоритма STL и многих других библиотек C ++. Если вы используете метод вашего коллеги, вам, возможно, придется прибегнуть к использованию std :: binds и lambdas, потому что вы хотите «адаптировать» интерфейс.
Пример:
class CalculateSomething
{
public:
void operator()(const SomeObject &obj) const;
private:
// ...
}
class CalculateNothing
{
public:
void calculate(const SomeObject &obj) const;
private:
// ...
}
Пример использования:
std::for_each(container.begin(), container.end(), CalculateSomething());
против
std::for_each(container.begin(), container.end(), [ c = CalculateNothing()](auto x) { c.calculate(x); });
Я думаю, что предпочитаю первое.
Ну, вот и мои 5 центов.
Прежде всего, если возможно, я бы просто использовал лямбду или свободную функцию. Вы уверены, что вам нужен класс для ваших нужд?
Во всяком случае, предполагая, что класс необходим.
SomethingCalculator
«- разве это не объект?DoWork
‘,’Calculate
или что угодно.Это сделает это намного более явным.
UPD. Все вышеизложенное можно до сих пор аргументировать, но я искренне верю в то, что добавление достаточного количества документации в коде будет иметь реальное значение, независимо от имени метода.