Настоящие ООПеры не используют if
! Предпочитаю полиморфизм условным.
Конечно, могут быть ситуации, когда enum
- это путь (скажем, если у вас очень, очень большое количество состояний или вы знаете, что для домена, очень вероятно, что все наблюдатели будут заинтересованы во всех переходах), но в общем случае первый вариант менее сложен. Используя второй подход, каждый слушатель должен повторить один и тот же кусок кода:
if (theStateImInterestedIn == event.stateType){
/* actual code */
}
И каждый слушатель нуждается в этом, за исключением слушателей, которые одинаково реагируют на все переходы! Дублирование кода! Aaaaargh! Как мы все знаем, повторяющийся код вызывает ошибки (отсюда и принцип DRY ), и поэтому мы можем заключить, что ваше внутреннее чувство правильное - первый вариант (с использованием двух разных классов) лучше, так как каждый человек реализация слушателя будет иметь меньше котла.
Также; добавьте туда else
, и у вас появятся интересные времена, когда вы добавите новое состояние: некоторые слушатели интересовались обоими типами событий и поэтому предположили, что ветвь else
означает «состояние, которое я не сделал» t проверить в if
". Теперь они ломаются, потому что предложение else
охватывает> 1 состояние.