0

我正在构建一个相对较大的面向对象程序。我有一个名为的类AerodynamicCalculator,它执行大量计算并将结果分布在系统周围。我主要担心的是,当我向其添加 mor 参数时,我的构造函数签名变得越来越大。

如下所示,我已经有九个对象引用被传递到这个构造函数中,但我还需要另外七个。我是否正确地创建了这个对象?我的理解是您将关联的对象引用传递给构造函数并将类的局部变量分配给对象引用。如果是这种情况,使用所有必需对象正确初始化我的类的唯一方法是将它们传递给构造函数,这会导致签名很长。

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 回答