0

比較的大きなオブジェクト指向プログラムを構築しています。AerodynamicCalculator多数の計算を実行し、システム全体に結果を配布するというクラスがあります。私の主な懸念は、コンストラクターの署名に mor パラメーターを追加するにつれて、コンストラクターの署名がどんどん大きくなっていることです。

以下に示すように、このコンストラクターには既に 9 つのオブジェクト参照が渡されていますが、さらに 7 つ必要です。このオブジェクトを正しく作成していますか? 私の理解では、関連するオブジェクト参照をコンストラクターに渡し、クラスのローカル変数をオブジェクト参照に割り当てます。この場合、必要なすべてのオブジェクトでクラスを適切に初期化する唯一の方法は、それらをコンストラクターに渡すことです。これにより、非常に長い署名が発生します。

public AreodynamicCalculator(AircraftConfiguration config, AileronOne aOne,
        AileronTwo aTwo, ElevatorOne eOne, ElevatorTwo eTwo, Rudder r,
        Rudder rr, RateGyros rG) {
    // ...
}

このアプローチに関するアドバイスは非常に役に立ちます。事前に感謝します。

4

2 に答える 2

6

前述のように、これはクラスがやりすぎている兆候である可能性がありますが、この問題には一般的に使用される「解決策」があります。

ビルダー パターンはこのような状況でよく使用されますが、異なる引数を持つ多くのコンストラクターがある場合にも非常に役立ちます。ビルダーは、特にブール リテラルが使用されている場合に、引数の意味をより明確にするため優れています。

これがビルダーパターンです。これが機能する方法は次のとおりです。

AreodynamicCalculator calc = AreodynamicCalculator.builder()
    .config(theAircraftConfiguration)
    .addAileron(aileronOne)
    .addAileron(aileronTwo)
    .addElevator(elevatorOne)
    .addElevator(elevatorTwo)
    .addRudder(rudderOne)
    .addRudder(rudderTwo)
    .build()

内部的に、ビルダーはこれらすべてのフィールドを格納し、build()が呼び出されると、これらのフィールドを受け取る (現在はプライベートな) コンストラクターを呼び出します。

class AreodynamicCalculator {
    public static class Builder {
        AircraftConfiguration config;
        Aileron aileronOne;
        Aileron aileronTwo;
        Elevator elevatorOne;
        Elevator elevatorTwo;
        ...

        public Builder config(AircraftConfiguration config) {
            this.config = config;
            return this;
        }

        public Builder addAileron(Aileron aileron) {
            if (this.aileronOne == null) {
                this.aileronOne = aileron;
            } else {
                this.aileronTwo = aileron;
            }
            return this;
        }

        // adders / setters for other fields.

        public AreodynamicCalculator build() {
            return new AreodynamicCalculator(config, aileronOne, aileronTwo ... );
        }
    }

    // this is the AircraftConfiguration constructor, it's now private because
    // the way to create AircraftConfiguration objects is via the builder
    //
    private AircraftConfiguration config, AileronOne aOne, AileronTwo aTwo, ElevatorOne eOne, ElevatorTwo eTwo, Rudder r, Rudder rr, RateGyros rG) {
        /// assign fields
    }
}
于 2012-04-19T15:37:40.793 に答える
0

daveb の応答で提案されているビルダー パターンを使用するのと同様に、Spring のような依存性注入フレームワークを使用できます。

于 2012-04-19T15:39:22.340 に答える