Реализация в глобальных функциях или в классе, обернутом глобальными функциями
-
20-08-2019 - |
Вопрос
Я должен реализовать набор из 60 функций в соответствии с предопределенными сигнатурами.Это должны быть глобальные функции, а не функции-члены какого-то класса.Когда я их внедряю, я использую набор хорошо выполненных классов, предоставляемых третьей стороной.
Моя реализация большинства функций довольно короткая, около 5-10 строк, и касается в основном различных обращений к этим сторонним классам.Для некоторых более сложных функций я создал пару новых классов, которые имеют дело со всеми сложными вещами, и я также использую их в функциях.Вся информация о состоянии хранится в статических членах моего класса и сторонних классов, поэтому мне не нужно создавать глобальные переменные.
Вопрос:Было бы лучше, если бы я реализовал один большой класс с 60 функциями-членами и выполнил всю реализацию (которая сейчас находится в глобальных функциях) там?И каждая из функций, которые я должен написать, будет просто вызывать соответствующую функцию-член в классе.
Решение
Вся информация о состоянии хранится в статических членах моего класса и сторонних классов, поэтому мне не нужно создавать глобальные переменные.
Это ключевой момент.Нет, их определенно не следует помещать в классы.Классы созданы для того, чтобы их можно было использовать для создания объектов.В вашей ситуации вы бы использовали их просто как область видимости для данных и функций.Но это то, что пространства имен уже решайте лучше:
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 ...
}
}
Создание классов, состоящих исключительно из статических членов, - плохая идея.
Другие советы
Действительно ли пользователям вашего кода нужен этот большой класс?
Если да, реализуйте это.
Если нет, не тратьте свое время на его реализацию и не тратьте время других, кому поручено его протестировать, или на попытки понять, какова точная роль этого класса за пределами ООП-взгляда.
литб вероятно, это правильно.Единственная причина, по которой вы бы вообще подумали о том, чтобы обернуть 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
методы, вы можете сделать это легко.
Я думаю, что здесь вам следует руководствоваться правилом "один класс - одна ответственность".60 функций, вероятно, можно разделить на различные обязанности, и каждая из них заслуживает отдельного класса.Это также предоставит более OO-интерфейс клиентам API, которые не ограничены необходимостью глобальных функций.