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

StackOverflow https://stackoverflow.com/questions/487243

Вопрос

Я должен реализовать набор из 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, которые не ограничены необходимостью глобальных функций.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top