次のシナリオのシンプルでエレガントなデザインを見つけるのに苦労しています。クラスWorkerはテンプレートクラスHelperを使用して何らかの作業を行います。単純なシナリオでは、次のようになります。
template<typename T>
class Helper {
public:
void Help(T data) : m_data(data) {} //NOTICE: Copy
T const& Data() const { return m_data; }
T m_data;
}
class SimpleWorker {
public:
SimpleWorker() : m_helper(SimpleData()) {} // non-temp used in reality
void DoWork()
{
m_helper.help();
}
Helper<SimpleData> m_helper;
}
テンプレートの引数がより複雑で、ワーカーの同じビジネス ドメインのものである場合、事態は複雑になります。ワーカーはヘルパーを使用する必要がありますが、(この設計では) ヘルパーが認識していないデータ オブジェクトのメソッドを呼び出す必要もあります。何かのようなもの:
template<typename T>
class Helper {
public:
Helper(T data) : m_data(data) {} //NOTICE: Copy
T const& Data() const { return m_data; }
T m_data;
}
class ComplexWorker {
public:
ComplexWorker() : m_helper(ComplexData()) {} // non-temp used in reality
void DoWork()
{
m_helper.help();
m_helper.GetData().DoSomethingComplexNotConst(); // <-------------
}
Helper<ComplexData> m_helper;
}
明らかな問題は、結果に対して not const 関数を呼び出せないData()ことです。Data()非 const にすることは、さまざまなコンテキストでも使用されるため、悪い考えのように思えますHelper。私の目標はComplexData、メンバー関数を使用して変更するエレガントな方法を見つけることです。変更されたデータを引き続き使用できるように、最初に変更する必要がありComplexWorker
ます。ComplexDataHelper
編集:Helper提供されたデータをコピーして実際の流れに似せるように構造を変更しました