Реализация в глобальных функциях или в классе, обернутом глобальными функциями

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

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

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


person Igor Oks    schedule 28.01.2009    source источник


Ответы (4)


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

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

namespace stuff {
    ... 60 functions ...
    namespace baz {
        ... if you want, you can have nested namespaces, to ...
        ... categorize the functions ...
    }

    namespace data {
        ... you can put data into an extra namespace if you want ...
    }
}

Создание классов, состоящих только из статических членов, — плохая идея.

person Johannes Schaub - litb    schedule 28.01.2009

Действительно ли пользователям вашего кода нужен этот большой класс?

Если да, реализуйте.

Если нет, не тратьте свое время на его реализацию и не тратьте время других, которым поручено его тестирование или попытки понять, какова точная роль этого класса за пределами взгляда ООП.

person mouviciel    schedule 28.01.2009

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

Кстати, боритесь с искушением using namespace stuff;! Всегда обращайтесь к функциям, используя квалификацию пространства имен:

#include <stuff.h>
void some_function() {
    stuff::function_wrapper();
}

вместо:

#include <stuff.h>
using namespace stuff;
void some_function() {
    function_wrapper();
}

Преимущество в том, что если вам когда-нибудь понадобится преобразовать namespace в класс, полный static методов, вы сможете легко это сделать.

person D.Shawley    schedule 28.01.2009
comment
Не согласен. Преобразование пространства имен в класс, полный статических методов, почти никогда не выполняется. Для этого есть только одна веская причина, и она не связана с присоединением ваших данных для использования в методах. Это когда вы хотите передать результирующий класс в качестве аргумента шаблона (шаблон стратегии для бедняков). - person ; 29.01.2009

Я думаю, что здесь вам следует руководствоваться правилом «один класс — одна ответственность». 60 функций, вероятно, можно разделить на разные обязанности, и каждая из них заслуживает отдельного класса. Это также даст больше объектно-ориентированного интерфейса для клиентов API, которые не ограничены потребностью в глобальных функциях.

person On Freund    schedule 28.01.2009
comment
@ On, вы предлагаете 60 классов для 60 методов? Как предполагалось в предыдущих ответах, функции должны быть обернуты в пространство имен, а не сходить с ума по классам. - person Jagannath; 03.01.2010
comment
Конечно, нет, но с 60 классами обязательно будут определенные обязанности (вероятно, где-то между 4 и 15). - person On Freund; 03.01.2010