Interface segregation all’opera
public static List<Card> drawCards(Deck deck, int number) {
List<Card> result = new ArrayList<>();
for (int i = 0; i < number && !deck.isEmpty(); i++) {
result.add(deck.draw());
}
return result;
}
Consideriamo il metodo drawCards
che prende come parametri un Deck
e un intero.
Le uniche competenze riconosciute a Deck
sono l’indicazione se è vuoto (isEmpty()
) e il pescare una carta dal mazzo (draw()
).
Deck
può quindi implementare un’interfaccia che mette a disposizione queste capacità.
È possibile modificare il metodo in modo da accettare un qualunque oggetto in grado di eseguire le operazioni sopra elencate, ovvero che implementi l’interfaccia CardSource
.
public interface CardSource {
/**
* @return The next available card.
* @pre !isEmpty()
*/
Card draw();
/**
* @return True if there is no card in the source
*/
boolean isEmpty();
}
public class Deck implements CardSource { ... }
public static List<Card> drawCards(CardSource deck, int number) {
List<Card> result = new ArrayList<>();
for (int i = 0; i < number && !deck.isEmpty(); i++) {
result.add(deck.draw());
}
return result;
}