2

コンストラクターでオブジェクト作成を行うのは悪いスタイルだとどういうわけか読みました...しかし、なぜそれが悪いスタイルと見なされたのかを忘れました(特に依存性注入を使用する場合)。

疑似コードとしてのコンストラクターでのオブジェクト作成の例を次に示します。

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番目のアプローチを使用する必要があるのはなぜですか?それとも、何か間違ったことを考えていたので、最初のアプローチは完全に大丈夫ですか?

4

2 に答える 2

3

コンストラクタが例外をスローした場合、デストラクタは呼び出されないため、手動で割り当てたすべてのメモリが失われます。

于 2012-09-13T07:05:57.117 に答える
2

最初のアプローチは実際には問題ありません。コンストラクターでのオブジェクトの作成に問題があるのではなく、コンストラクターでオブジェクトを作成するのに問題があるということです。それで

Myclass()
{
    MyMemberFactory fac;
    for(Some criteria)
        push_back(fac.createMyMemberType());
}

クライアントは別のファクトリを使用できなくなるため(たとえば、テスト用)、問題が発生します。

于 2012-09-13T07:06:39.803 に答える