Добрый день!
Вот имеется у меня в проекте класс, реализующий управление неким технологическим объектом. Класс содержит в себе данные о состоянии объекта в целом и о состоянии контуров управления, которые так же реализованы в этом классе.
Что-то типа:
typedef struct
{
int par1;
//.......
} COMMON_DATA;
typedef struct
{
int par1;
//.......
} ALG_ONE_DATA;
typedef struct
{
int par1;
//.......
} ALG_TWO_DATA;
class ControlObject
{
public:
//.................
void Routine();
private:
COMMON_DATA common;
ALG_ONE_DATA alg1;
ALG_TWO_DATA alg2;
// ......................... ........
void RoutineAlg1();
void RoutineAlg2();
//............................
};
Кол-во контуров управления постепенно увеличивалось, их реализация усложнялась. В итоге класс получился довольно тяжелым. Полистав известную книгу господ Фаулера и Бекка, захотелось немного причесать код. А конкретно, выделить каждый контур управления в отдельный класс:
class AlgOne;
class AlgTwo;
//................
class ControlObject
{
public:
//.................
void Routine()
{
pAlg1->Routine();
pAlg2->Routine();
//.....................
}
private:
COMMON_DATA common;
AlgOne *pAlg1;
AlgTwo *pAlg2;
// ......................... ........
};
class AlgOne
{
public:
AlgOne( ControlObject *_owner);
void Routine();
private:
ALG_ONE_DATA alg1;
ControlObject *owner;
};
class AlgTwo
{
//..................
};
Все вроде нормально, но вот только в исходном классе (ControlObject) была такая фича, как доступ ко внутренним переменным класса по их Id. Просто карта параметров (id, адрес параметра):
{ 1, &common.par1},
{ 2, &common.par2},
//.........................
{ 10, &alg1.par1},
//.........................
{ 20, &alg2.par1},
//.........................
После рефакторинга те параметры, которые "переехали" в новые классы ес-но стали недоступны таким образом.
На ум приходит несколько вариантов:
1. (Некрасивый) сделать данные public.
2. (Чуть менее некрасивый) объявить классы друзьями (friend)
3. (Не очень удобный) реализовать свою карту параметров в каждом классе. Неудобства — параметры разбросаны по разным местам, соот-но труднее следить чтобы не пересеклись их Id, да и просто листать куду файлов вместо одного неохота.
4. (Нелогичный) Вернуть все данные обратно в (ControlObject). Но ведь они по сути должны "жить" в своих "домиках".
Ну и наконец 5-й вариант. Вариант, который надеюсь предложите Вы, красивый, удобный и логичный
Заранее спасибо.