В одном из моих проектов у меня есть два "объекта передачи данных" RecordType1 и RecordType2, которые наследуются от абстрактного класса RecordType.
Я хочу, чтобы оба объекта RecordType обрабатывались одним и тем же классом RecordProcessor внутри«процессный» метод.Моей первой мыслью было создание универсального метода процесса, который делегирует два конкретных метода процесса следующим образом:
public RecordType process(RecordType record){
if (record instanceof RecordType1)
return process((RecordType1) record);
else if (record instanceof RecordType2)
return process((RecordType2) record);
throw new IllegalArgumentException(record);
}
public RecordType1 process(RecordType1 record){
// Specific processing for Record Type 1
}
public RecordType2 process(RecordType2 record){
// Specific processing for Record Type 2
}
Я читал, что Скотт Мейерс пишет в Effective C ++ следующее:
«Каждый раз, когда вы обнаруживаете, что пишете код формы», если объект относится к типу T1, тогда делайте что-то, но если он относится к типу T2, тогда делайте что-то еще, «пощечина».
Если он прав, ясно, что я должен ударить себя.Я действительно не вижу, как это плохо дизайн (если, конечно, кто-то подклассы RecordType и добавляет в RecordType3, не добавляя еще одну строку в общий метод "Процесс", который обрабатывает его, таким образом создавая NPE), и альтернативы, которые я могу думатьиз-за того, что я взял на себя основную логику обработки внутри самих классов RecordType, что на самом деле не имеет особого смысла для меня, поскольку теоретически может быть много разных типов обработки, которые я хотел бы выполнить с этими записями.
Может ли кто-нибудь объяснить, почему это может считаться плохим проектом, и предоставить какую-то альтернативу, которая по-прежнему возлагает ответственность за обработку этих записей на класс «Обработка»?
ОБНОВЛЕНИЕ:
- Изменено
return null
на throw new IllegalArgumentException(record);
- Просто для пояснения, есть три причины, по которым простого метода RecordType.process () будет недостаточно: во-первых, обработка действительно слишком далекоудален из RecordType, чтобы заслужить свой собственный метод в подклассах RecordType,Кроме того, существует целый ряд различных типов обработки, которые теоретически могут выполняться разными процессорами.Наконец, RecordType разработан как простой DTO-класс с минимальными методами изменения состояния, определенными внутри.