¿Cómo me deshago de todo este código duplicado?
Eres un traductor de español que traduce documentos de IT. Traduce lo siguiente al español. No traduzcas el código ni la salida en markdown“`
private Optional
{
Player scoringPlayer = null;
int maxCount = 0;
for(Player p : players) { final int count = p.pile.size();
if(count > maxCount) { scoringPlayer = p; maxCount = count; } else if(count == maxCount) { scoringPlayer = null; } } return Optional.ofNullable(scoringPlayer);
}
private Optional<Player> playerWithMostSevens()
{
Player scoringPlayer = null;
int maxCount = 0;for(Player p : players) { int count = 0; for(Card c : p.pile) { if(c.is(Card.Value.SEVEN)) { count++; } } if(count > maxCount) { scoringPlayer = p; maxCount = count; } else if(count == maxCount) { scoringPlayer = null; } } return Optional.ofNullable(scoringPlayer);
}
private Optional<Player> playerWithMostSpades()
{
Player scoringPlayer = null;
int maxCount = 0;for(Player p : players) { int count = 0; for(Card c : p.pile) { if(c.is(Card.Suit.SPADES)) { count++; } } if(count > maxCount) { scoringPlayer = p; maxCount = count; } else if(count == maxCount) { scoringPlayer = null; } } return Optional.ofNullable(scoringPlayer);
}
private Optional<Player> playerWithSevenOfSpades()
{
for(Player p : players)
{
for(Card c : p.pile)
{
if(c == new Card("7S"))
{
return Optional.of(p);
}
}
}return Optional.empty();
}
private void updateScores()
{
for(Player p : players)
{
p.score = p.scopas;
}playerWithMostCards().ifPresent(p -> p.score += 1); playerWithMostSevens().ifPresent(p -> p.score += 1); playerWithMostSpades().ifPresent(p -> p.score += 1); playerWithSevenOfSpades().ifPresent(p -> p.score += 1);
}
“`
Básicamente, estoy haciendo un juego de cartas (llamado Scopa), y cuando se llama a updateScores (), las puntuaciones de cada jugador deben actualizarse. Los jugadores pueden ganar un punto teniendo más cartas, teniendo más sietes o teniendo el siete de espadas. La lógica para determinar quién tiene más cartas, sietes y espadas es muy similar. ¿Cómo puedo evitar repetir la lógica en estos tres métodos? Gracias.
davy.ai
Se puede extraer la lógica común para determinar la cantidad de cartas/sietes/espadas en un método separado que tome un parámetro que represente la condición a comprobar (por ejemplo, si se debe contar la carta si es un siete o una espada). Aquí tienes un ejemplo de cómo podría quedar el código actualizado:
En este código actualizado,
jugadorConMásCartas()
acepta un parámetroFunction<card, boolean="">
que representa la condición a comprobar para cada carta.jugadorConMásCartas()
,jugadorConMásSietes()
yjugadorConMásEspadas()
ahora llaman a este método con diferentes condiciones. Debido a que la lógica común está ahora en un solo método, no tenemos que repetirla en múltiples métodos.</card,></card,>