Преобразование всех функций в классы - PullRequest
4 голосов
/ 20 апреля 2011

Я читал книгу Рефакторинг: улучшение дизайна существующего кода Фаулера, где говорится заменить вызовы функций классами с одинаковыми именами и конструкторами вызовов этого класса вместо исходного вызова функции.

Мой вопрос: хорошая ли идея преобразовать все функции (более или менее, кроме очень тривиальных) в объекты, чтобы код стал более модульным?

Спасибо,

Ответы [ 4 ]

5 голосов
/ 20 апреля 2011

Немного расширяю свой предыдущий комментарий:

В C ++ нет абсолютно никакой причины превращать все функции в классы, какие-то объекты обработки. Функции работают хорошо, когда вам просто нужно вычислить и вернуть значение.

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

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

2 голосов
/ 20 апреля 2011

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

Совет "заменить вызовы функций классами с одинаковыми именами и конструкторами вызовов этого класса вместо исходного вызова функции" совершенно неверен: как вы можете заменить

int y = f(x);

на class f и вызов его конструктора? Конструктор не имеет возвращаемого значения! Единственный способ заставить это работать - перегрузить operator() на class f, чтобы вы могли использовать один из

int y = f(x)();
int y = f()(x);

оба из которых бессмысленны. (Кроме того, вам нужно запомнить, какой из них вам нужен для каждого определяемого вами функционального объекта.)

Там должно быть что-то, что вы нам не говорите.

1 голос
/ 20 апреля 2011

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

Когда вы конвертируете свои функции в объекты, вы ничего не получаете. На самом деле вызов метода - это тот же простой вызов функции, только со скрытым аргументом this. В вашем случае этот аргумент будет избыточным, потому что ваш объект не имеет никакого состояния.

Единственная причина, по которой я могу придумать преобразование функций в объекты, - это передача функций как объектов другим функциям, но для этого у нас есть указатели на функции или boost :: function или c ++ 0x lambdas.

0 голосов
/ 20 апреля 2011

Определенно нет! Нет смысла преобразовывать любую функцию в класс.

Класс собирается управлять некоторым состоянием объекта и скрывать информацию, функции имеют глобальный характер и в основном не имеют состояния. Множество классов потерь делают программное обеспечение неэффективным и не обслуживаемым.

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