Есть вопрос теоретического плана. Это касается методологий ООП и, в частности, средств, предоставляемых Java 1.5.
Как человек, занимающийся разработкой уже лет 12, и "влившийся" в ООП с самого начала, у меня сложилось свое представление о некоторых принципах грамотной разработки программных архитектур (не без влияния гуру типа Booch-Rumbaugh-Jacobson, GoF, и т.д.)
Насколько я понимаю, полиморфизм и наследование представляют базу ООП.
Возникшие уже позже технологии построения абстракций более высокого уровня,
а именно параметризованные классы (шаблоны, generics) являются усложнением
изначальной методологии и должны использоваться аккуратно, поскольку вполне
способны "загромоздить" архитектуру и в какой-то момент стать ощутимым препятствием к
развитию модели.
К сожалению, мне не всегда удается своими доводами убедить некоторых разработчиков.
Простой пример. Нужно реализовать базовую логику поддержки объектом набора состояний и реакций на их смену.
То есть имеем связку: State-StateFul-StateChangeEvent-StateChangeListener. И, конечно, большое количество наследников данных сущностей.
Какими доводами мне следует убеждать человека, что злоупотребление Generics в данном случае
действительно усложняет архитектуру системы... человек реализует это хозяйство примерно так:
interface Stateful<S, T> {
T getState();
void addStateChangeListener(StateChangeListener<? extends S, T> _listener);
void removeStateChangeListener(StateChangeListener<? extends S, T> _listener);
}
interface StateChangeListener<S, T>
extends EventListener {
void stateChange(StateChangeEvent<S, T> _event);
}
class StateChangeEvent<S, T>
extends EventObject {
public T getOldState();
public T getNewState();
public S getSource();
}
В итоге, на конечных уровнях иерархий классов мы видим нагромождение generics...
На мой взгляд, представленная логика должна быть реализована без использования generics вообще.
Возможные явные преобразования типов в конкретных подклассах (без которых можно даже и обойтись) не являются проблемой, которую надо обязательно решать вводя generics...
Или все-таки я не прав?
Свою точку зрения я основываю еще и на коде J2SE/J2EE, где таких конструкция я никогда не встречал.
МОжет ли кто-нибудь дать ссылки на методологию применения шаблонов/generics?
(Возможно, вопрос стоит перебросить в раздел "Архитектура...")