可能会因此而被击落,但我的参数存在问题。
说我需要存储比赛(我这样做)
在规划期间,我意识到我需要存储以下内容:
简而言之,它是一堆无法真正来自其他地方的无法提供的数据 总而言之,我喜欢我的JuniorRace对象的22个参数,以及我的SeniorRace对象的26个参数,我已经对它进行了编码,但它很乱,我不喜欢我的工作
这不是一个大问题,它实际上不会成为用户的问题,因为他们不会看到商业模式,只看到视图模型,但它是因为我必须经常多次评论这些相同的参数。
每次创建构造函数时,每次创建新对象实例时,我可以停止使用这么多参数的最佳方法是什么?
我是否只是尝试使用less并将数据存储在其他地方,如果是的话,在哪里? 使用更多类,比如Person会有地址和详细信息吗?
我真的很难过,会发布我的代码,但是,它几乎无处不在 - 我不是一个非常有经验的OO程序员。
答案 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
}
}
如果您愿意,可以创建Location
和TimeCard
的子类来创建特定的实例:
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
。确保对您的应用程序进行概要分析,确保对象创建的开销不会太糟糕。