创建一个新的对象类或编写一个转换子类对象的方法?还是别的什么?性能而非偏好
我把两个独立的程序放在一起,玩一个名为“Crazy Eights”的纸牌游戏。
我为此程序编写的类基于默认的“card”包,该包提供扑克牌对象和一些用于扑克牌的通用方法。
我采取了两种不同的方法来实现这一目标,这两种方法本身都是功能性的。
下面是两个描述这两种方法的 UML 类图:
继承的子类“转换”方法
使用类似方法组合的子类
正如您在方法1中看到的,Class EightsCard包含一个方法转换(Card)这是方法:
/**
* Converts a Card into an EightsCard
* @param card The card to be converted
* @return The converted EightsCard
*/
public EightsCard convert(Card card) {
if (card != null) {
EightsCard result = new EightsCard(card.getRank(), card.getSuit());
return result;
}
return null;
}
}
此方法允许您从 CardCollection 调用方法,否则这些方法将不合法。例如,在 EightsPlayer 类的 play 方法中,如下所示:
/**
* Removes and returns a legal card from the player's hand.
*/
public EightsCard play(Eights eights, EightsCard prev) {
EightsCard ecard = new EightsCard(0, 0);
ecard = ecard.convert(searchForMatch(prev));
if (ecard == null) {
ecard = drawForMatch(eights, prev);
return ecard;
}
return ecard;
}
方法2不需要任何转换,因为类似的方法已经写在一个新的类EightsCardCollection中,它扩展了CardCollection。现在播放方法可以这样写:
public EightsCard play(Eights eights, EightsCard prev) {
EightsCard card = searchForMatch(prev);
if (card == null) {
card = drawForMatch(eights, prev);
}
return card;
}
这让我想到了几个问题:
- 除了个人偏好之外,这两种方法有什么好处吗?
- 有没有更好的方法来编写这个程序?
例如,编写更具体的“类似”类1 并且根本不使用默认类2 是否更好。
1 在类图中标记为“crazyeights.syd.jjj”或“chaptwelvetofort”。
2 在类图中标有“defaults.syd.jjj” 或 cards.syd.jjj'。