限制参数

Limiting Parameters

可能会因此而被击落,但我的参数有问题。

假设我需要存储一场比赛(我这样做了)

在规划过程中,我意识到我需要存储以下内容:

简而言之,这是一大堆无法真正从其他地方获得的数据 总而言之,我的 JuniorRace 对象有 22 个参数,SeniorRace 对象有 26 个参数,我已经对其进行了编码,但它很乱,我不喜欢我的工作。

这不是什么大问题,实际上对用户来说根本不是问题,因为他们不会看到业务模型,只会看到视图模型,但对我来说必须不断地多次评论这些相同的参数。

每次创建构造函数和每次创建新对象实例时停止使用这么多参数的最佳方法是什么?

我是否只是尝试减少使用并将数据存储在其他地方,如果是,在哪里? 使用更多 类 比如 Person 会有地址和详细信息?

我在这里真的很困惑,post 我的代码,但是,是的,它几乎无处不在——我不是一个非常有经验的 OO 程序员。

您可以将所有参数存储为一个映射,然后只传入该映射,例如:

Map myParams = new HashMap<String,Object>();
myParams.add("Terrain","terrible");
myParams.add("Location","Bobs back yard");
myParams.add("Length (yards)", 100);
myParams.add("Hazards", new String[] {"Bob's cat","The old tire","the fence"});

然后你可以这样调用你的程序:

SaveRaceCourse(myParams);

地图等非常适合传递数据。

因为我看不到所有 22 个参数,这是一个猜测,但很可能是正确的。

这 22 个参数中有一些是相关的。如果是这样,将相关的分组在另一个 class 中,并使 SeniorRace 成为所有这些 classes.

的组合

例如:位置和地形似乎有关,入场时间和允许的会员类型似乎与入场有关(也许费用也是其中的一部分)。

通过这种方式,您最终将传递一组有限的对象,所有相关信息共同存在并共同发展。

通过在对象中封装相似的属性来分解它。这叫分解。

例如,您的 Race 可以接受封装所有时间细节的 TimeCard,包含地形和其他(可能是方向)的 Location,封装要求等...

class RaceTimeCard {
    private final Timestamp admissionStart;
    private final Timestamp admissionEnd;
    private final Timestamp raceStart;
    private Timestamp raceEnd;

    public RaceTimeCard(Timestamp admissionStart, Timestamp admissionEnd, Timestamp raceStart) {
        //init final fields
    }

    public void endRace() {
        //clock the time that the race ended
    }
}

class RaceLocation {
    private final Terrain terrain;
    private final Directions directions;
    private final GPSCoordinates coordinates;

    public RaceLocation(Terrain terrain, Directions directions, GPSCoordinates coordinates) {
        //init final fields
    } 
}

class Race {
    private RaceTimeCard timeCard;
    private RaceLocation location;

    public Race(RaceTimeCard timeCard, RaceLocation) {
        //init fields
    }
}

如果您愿意,可以子类化 LocationTimeCard 以创建特定实例:

final class Mountains extends RaceLocation {
    public Mountains() {
        super(Terrain.ROCKY, new Directions(...), new GPSCoordinates(...));
    }
}

final class EarlyBirdTimeCard extends RaceTimeCard {
    public EarlyBirdTimeCard() {
        //specify super constructor with params
    }
}

现在实例化 Race 对象非常简单:

RaceTimeCard timeCard = new EarlyBirdTimeCard();
RaceLocation location = new Mountains();
...

Race race = new Race(timeCard, location, ...);

如果还是太长,可以再分解一下。在我看来,你可以有一个包含所有(已经分解的)细节的 RaceDetails 对象,然后将它传递给 Race。确保分析您的应用程序,确保对象创建的开销不会太糟糕。