Я создаю приложение, и мне нужна мудрость SO-сообщества в вопросе дизайна.
В моем приложении должен быть ТОЛЬКО один экземпляр класса UiConnectionList
, UiReader
и UiNotifier
.
Теперь я нашел два способа сделать это:
Метод 1:
Каждый файл имеет глобальный экземпляр этого класса в самом заголовочном файле.
Метод 2: существует отдельный файл globals.h, содержащий отдельные глобальные экземпляры каждого класса.
Пример кода:
Метод 1
файл: uiconnectionlist.h
#ifndef UICONNECTIONLIST_H
#define UICONNECTIONLIST_H
#include <QObject>
#include <QList>
class UiConnection;
class UiConnectionList : public QObject
{
Q_OBJECT
public:
UiConnectionList();
void addConnection(UiConnection* conn);
void removeConnection(UiConnection* conn);
private:
QList<UiConnection*> connList;
};
namespace Globals {
UiConnectionList connectionList;
}
#endif // UICONNECTIONLIST_H
файл: uinotifier.h
#ifndef UINOTIFIER_H
#define UINOTIFIER_H
class UiNotifier
{
public:
UiNotifier();
};
namespace Globals {
UiNotifier uiNotifier;
}
#endif // UINOTIFIER_H
Метод 2:
файл: uiconnectionlist.h
#ifndef UICONNECTIONLIST_H
#define UICONNECTIONLIST_H
#include <QObject>
#include <QList>
class UiConnection;
class UiConnectionList : public QObject
{
Q_OBJECT
public:
UiConnectionList();
void addConnection(UiConnection* conn);
void removeConnection(UiConnection* conn);
private:
QList<UiConnection*> connList;
};
#endif // UICONNECTIONLIST_H
файл: uinotifier.h
#ifndef UINOTIFIER_H
#define UINOTIFIER_H
class UiNotifier
{
public:
UiNotifier();
};
#endif // UINOTIFIER_H
файл: globals.h
#ifndef GLOBALS_H
#define GLOBALS_H
#include "uiconnectionlist.h"
#include "uinotifier.h"
namespace Globals {
UiConnectionList connectionList;
UiNotifier uiNotifier;
}
#endif // GLOBALS_H
Мой вопрос
Какой лучший / правильный способ сделать это?
PS: Я не думаю, что синглтон - правильный ответ, не так ли?
Спасибо
Хорошо, поэтому два ответа сказали мне сделать экземпляры UiConnectionList
и UiNotifier
, при желании обернуть их в UiContext
и передать их везде, где требуется.
Может ли кто-нибудь перечислить причины (с примерами), почему лучше обходить контекст, чем наличие глобально доступных переменных.
Это поможет мне определить, какой метод лучше (или лучше подходит для моего приложения).
Спасибо