Хорошо, у вас есть множество методов, разбросанных по основному классу вашей системы.Таким образом, вы делаете правильные вещи и выполняете рефакторинг, создавая новый класс и выполняя метод (ы) перемещения в новый класс.Новый класс несет единоличную ответственность, и с миром все в порядке:
class Feature
{
public:
Feature(){};
void doSomething();
void doSomething1();
void doSomething2();
};
Так что теперь у вашего исходного класса есть переменная-член типа object:
Feature _feature;
Что вы и сделаетепозвонить в основной класс.Теперь, если вы будете делать это много раз, у вас будет много объектов-членов в вашем основном классе.
Теперь эти функции могут или не потребоваться в зависимости от конфигурации, поэтому в таком случае дорого иметь все эти объекты, которые могут илине нужно.
Кто-нибудь может предложить способ улучшить это?
РЕДАКТИРОВАТЬ: Основано на предложении использовать шаблон проектирования пустых объектов, я придумал это:
Абстрактный класс, определяющий интерфейс объекта:
class IFeature
{
public:
virtual void doSomething()=0;
virtual void doSomething1()=0;
virtual void doSomething2()=0;
virtual ~IFeature(){}
};
Затем я определяю два класса, которые реализуют интерфейс, одну реальную реализацию и один нулевой объект:
class RealFeature:public IFeature
{
public:
RealFeature(){};
void doSomething(){std::cout<<"RealFeature doSomething()"<<std::endl;}
void doSomething1(){std::cout<<"RealFeature doSomething()"<<std::endl;}
void doSomething2(){std::cout<<"RealFeature doSomething()"<<std::endl;}
};
class NullFeature:public IFeature
{
public:
NullFeature(){};
void doSomething(){std::cout<<"NULL doSomething()"<<std::endl;};
void doSomething1(){std::cout<<"NULL doSomething1()"<<std::endl;};
void doSomething2(){std::cout<<"NULL doSomething2()"<<std::endl;};
};
Затем я определяю класс Proxy, который будет делегировать либо реальному объекту, либо нулевому объекту в зависимости от конфигурации:
class Feature:public IFeature
{
public:
Feature();
~Feature();
void doSomething();
void doSomething1();
void doSomething2();
private:
std::auto_ptr<IFeature> _feature;
};
Реализация:
Feature::Feature()
{
std::cout<<"Feature() CTOR"<<std::endl;
if(configuration::isEnabled() )
{
_feature = auto_ptr<IFeature>( new RealFeature() );
}
else
{
_feature = auto_ptr<IFeature>( new NullFeature() );
}
}
void Feature::doSomething()
{
_feature->doSomething();
}
//And so one for each of the implementation methods
Затем Iиспользуйте прокси-класс в моем основном классе (или там, где это требуется):
Feature _feature;
_feature.doSomething();