Я работаю с журналом событий, где существует около 60 различных «типов» событий. Каждое событие имеет около 10 свойств, а затем есть подкатегории событий, которые имеют различные дополнительные свойства.
То, как я работаю с этими событиями, зависит от их типа или от того, какие категориальные интерфейсы они реализуют.
Но, похоже, это приводит к раздуванию кода. У меня много избыточности в методах подкласса, потому что они реализуют одни и те же интерфейсы.
Уместнее ли использовать один класс событий со свойством «type» и логику записи, которая проверяет тип и поддерживает некоторую организацию категорий типов (например, список типов событий, которые относятся к категории a, второй список, который категория б и т. д.)? Или дизайн подкласса более уместен в этом случае?
Первый подход:
public interface Category1 {}
public interface Category2 {}
public abstract class Event {
private base properties...;
}
public class EventType1 extends Event implements Category1, Category2 {
private extra properties ...;
}
public class EventType2 extends Event implements Category3, Category4 {
private extra properties ...;
}
Второй подход:
public enum EventType {TYPE1, TYPE2, TYPE3, ...}
public class Event {
private union of all possible properties;
private EventType type;
}
Мое личное мнение таково, что кажется, что подходит один объект события, потому что, если я правильно об этом думаю, нет необходимости использовать наследование для представления модели, потому что на самом деле это только поведение и мой условия, которые меняются в зависимости от типа.
Мне нужен код, который выполняет такие вещи, как:
if(event instanceof Category1) {
...
}
Это хорошо работает при первом подходе, поскольку вместо instanceof я могу просто вызывать метод для события и реализовывать «один и тот же код» в каждом из соответствующих подклассов.
Но второй подход гораздо более лаконичен. Тогда я пишу такие вещи, как:
if(CATEGORY1_TYPES.contains(event.getEventType()) {
...
}
И вся моя «логика обработки» может быть организована в один класс, и ни один из них не будет избыточно распределен среди подклассов. Так это тот случай, когда ОО выглядит более подходящим, но не лучше?