Про рефакторинг
От: andyp  
Дата: 16.01.12 13:30
Оценка:
Здравствуйте,

Есть некая реализация штуковины System из предметной области. Она включает несколько подсистем:

//заголовок system.h
class Subsystem1;
class Subsystem2;
class Subsystem3;

class System
{
    Subsystem1* _s1;        
    Subsystem2* _s1;        
    Subsystem2* _s2;        
public:
    System();
    ~System();
    //интерфейс System 
    void some_method();
    //часть методов используется только subsystem1
    void used_only_by_subsystem1();
    //часть методов используется только subsystem2
    void used_only_by_subsystem2();
};

//реализация методов system.cpp
#include "system.h"
#include "subsystem1.h"
#include "subsystem2.h"
//etc...
System::System()
{
    //создаем подсистему
    _s1 = new Subsystem1; //аналогично для Subsystem1, Subsystem2, ...
}

void System::some_method()
{
    //используем ее
    _s1->some_method();    
}

System::~System()
{
    //убираем за собой
    delete _s1;

}

//заголовочный файл subsystem1.h
class System;
class Subsystem1
{
    System* _owner;
public:
    Subsystem1(System* o);
    void some_method();
};

//реализация методов  - файл subsystem1.cpp
#include "subsystem1.h"
#include "system.h"

Subsystem1::Subsystem1(System* o):_owner(o){}
void Subsystem1::some_method()
{
    //...
    //иногда приходится что-то делать с владельцем
    _owner->used_only_by_subsystem1();

}



Получается, что:
1.заголовочные файлы, описывающие подсистемы не включаются в system.h (это хорошо, так как подсистемы — деталь реализации)
2. заголовочный файл системы не включается в заголовочный файл подсистемы (это тоже хорошо, так как интерфейс подсистемы не зависит от системы)

Хотелось бы, сохраняя свойства 1 и 2, как-то убрать методы used_by_subsyst из public секции описания класса System потому что они только замусоривают интерфейс системы,
а по факту используются только при ее реализации. Как этого добиться проще всего не теряя скорости выполнения?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.