Я собрал две отдельные программы, которые играют в карточную игру под названием "Crazy Eights".
Классы, которые я написал для этой программы, основаны на пакете по умолчанию "карта", который предоставляет игровые карты и некоторые общие методы для игры в карты.
Я взял два отдельных подхода для достижения этого, которые оба функциональны сами по себе.
Вот две диаграммы классов UML, которые изображают два подхода:
Метод унаследованного подкласса "преобразование"
Составленный подкласс с аналогичными методами
Как вы можете видеть в подходе 1, класс EightsCard содержит метод convert (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, показанного ниже:
/**
* Removes and returns a legal card from the player 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 'в диаграммах классов.