次のシナリオのシンプルでエレガントなデザインを見つけるのに苦労しています。クラス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
ます。ComplexData
Helper
編集:Helper
提供されたデータをコピーして実際の流れに似せるように構造を変更しました