コンストラクターでオブジェクト作成を行うのは悪いスタイルだとどういうわけか読みました...しかし、なぜそれが悪いスタイルと見なされたのかを忘れました(特に依存性注入を使用する場合)。
疑似コードとしてのコンストラクターでのオブジェクト作成の例を次に示します。
Myclass
{
Myclass(MyMemberFactory& fac)
{
for(Some criteria)
push_back(fac.createMyMemberType());
}
vector<MyMemberType*> getMyMember();
{
return myMember_;
}
...
private:
vector<MyMemberType*> myMember_;
}
したがって、MyMemberFactoryをモックアウェイできるため、問題なく単体テストを使用できます。分離された初期化メソッドでforループを移動する場合、二重初期化をチェックする必要があり、初期化がすでに行われている場合は、すべてのゲッターが最初にチェックする必要があります。ここでは、個別の初期化を使用したコードを示します。
Myclass
{
Myclass() : isInitialized_(false)
{
}
void initialize(MyMemberFactory& fac);
{
if(isInitialized_)
throw "Error: Double-Init is not permitted.";
for(Some criteria)
push_back(fac.createMyMemberType());
isInitialized_ =true;
}
vector<MyMemberType*> getMyMember();
{
if(isInitialized_)
throw "Initialize first!";
return myMember_;
}
...
private:
vector<MyMemberType*> myMember_;
bool isInitialized_;
}
では、理由を知っていますか?最初のアプローチよりも2番目のアプローチを使用する必要があるのはなぜですか?それとも、何か間違ったことを考えていたので、最初のアプローチは完全に大丈夫ですか?