限制参数

时间:2015-04-30 01:03:12

标签: oop parameters

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

说我需要存储比赛(我这样做)

在规划期间,我意识到我需要存储以下内容:

  • 比赛的地形
  • 比赛地点
  • 比赛开始的时间
  • 时间录取结束。
  • 种族名称
  • 允许加入的会员类型

简而言之,它是一堆无法真正来自其他地方的无法提供的数据 总而言之,我喜欢我的JuniorRace对象的22个参数,以及我的SeniorRace对象的26个参数,我已经对它进行了编码,但它很乱,我不喜欢我的工作

这不是一个大问题,它实际上不会成为用户的问题,因为他们不会看到商业模式,只看到视图模型,但它是因为我必须经常多次评论这些相同的参数。

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

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

我真的很难过,会发布我的代码,但是,它几乎无处不在 - 我不是一个非常有经验的OO程序员。

3 个答案:

答案 0 :(得分:0)

您可以将所有参数存储为地图,然后传入地图,例如:

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);

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

答案 1 :(得分:0)

由于我无法看到所有22个参数,这是一个猜测但很可能是正确的。

这些参数中的一些是否相关。如果是,那么将相关的那些分组到另一个类中,并使SeniorRace成为所有这些类的组合。

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

这样你最终会得到一组有限的对象,所有相关的信息都会在一起生成并一起发展。

答案 2 :(得分:0)

通过在对象中封装类似的属性来分解它。它被称为分解。

例如,您的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。确保对您的应用程序进行概要分析,确保对象创建的开销不会太糟糕。