ООП, Java, полиморфизм, generics...
От: Cybernelly  
Дата: 31.01.08 13:58
Оценка:
Есть вопрос теоретического плана. Это касается методологий ООП и, в частности, средств, предоставляемых 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?
(Возможно, вопрос стоит перебросить в раздел "Архитектура...")
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.