Refactoring: Extract Class
От: Аноним  
Дата: 10.11.04 04:18
Оценка:
Добрый день!

Вот имеется у меня в проекте класс, реализующий управление неким технологическим объектом. Класс содержит в себе данные о состоянии объекта в целом и о состоянии контуров управления, которые так же реализованы в этом классе.
Что-то типа:
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-й вариант. Вариант, который надеюсь предложите Вы, красивый, удобный и логичный

Заранее спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.