Mam pewne interfejsy, które zamierzam wdrożyć w przyszłości przez strony trzecie, i sam zapewniam podstawowe wdrożenie. Będę używał tylko kilku, aby pokazać przykład.
Obecnie są one zdefiniowane jako
Pozycja:
public interface Item {
String getId();
String getName();
}
ItemStack:
public interface ItemStackFactory {
ItemStack createItemStack(Item item, int quantity);
}
ItemStackContainer:
public interface ItemStackContainer {
default void add(ItemStack stack) {
add(stack, 1);
}
void add(ItemStack stack, int quantity);
}
Teraz Item
i ItemStackFactory
ja mogę absolutnie przewidzieć trochę innej firmy, która chciałaby przedłużyć go w przyszłości. ItemStackContainer
Mogę również zostać rozszerzony w przyszłości, ale nie w sposób, który mogę przewidzieć, poza moją domyślną implementacją.
Teraz staram się, aby ta biblioteka była jak najbardziej niezawodna; jest to wciąż na wczesnym etapie (pre-pre-alfa), więc może to być akt nadmiernej inżynierii (YAGNI). Czy to odpowiednie miejsce do używania leków generycznych?
public interface ItemStack<T extends Item> {
T getItem();
int getQuantity();
}
I
public interface ItemStackFactory<T extends ItemStack<I extends Item>> {
T createItemStack(I item, int quantity);
}
Obawiam się, że może to spowodować, że implementacje i użytkowanie będą trudniejsze do odczytania i zrozumienia; Myślę, że to zalecenie, aby unikać zagnieżdżania generyków tam, gdzie to możliwe.