Реализация в глобальных функциях или в классе, заключенном в глобальные функции - PullRequest
3 голосов
/ 28 января 2009

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

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

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

Ответы [ 4 ]

4 голосов
/ 28 января 2009

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

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

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 ...
    }
}

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

2 голосов
/ 28 января 2009

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

Если да, внедрите его.

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

1 голос
/ 28 января 2009

лит , вероятно, правильно. Единственная причина, по которой вы бы даже рассмотрели обертывание 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 методов, вы можете сделать это легко.

0 голосов
/ 28 января 2009

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

...