В одном из моих проектов у меня есть два "объекта передачи данных" 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 С++ следующее:
"Каждый раз, когда вы обнаруживаете, что пишете код формы, если объект имеет тип T1, тогда что-то делайте, но если он имеет тип T2, тогда сделайте что-нибудь еще," похлопайте себя ".
Если он исправит, я должен похлопать себя. Я действительно не вижу, как это плохой дизайн (если, конечно, кто-то не подклассирует RecordType и не добавляет в RecordType3, не добавляя еще одну строку к общему методу "Process", который обрабатывает его, создавая таким образом NPE), и альтернативы, которые я могу думать вовлекать в себя основную нагрузку конкретной логики обработки в самих классах RecordType, что на самом деле не имеет для меня большого смысла, поскольку теоретически может быть много разных типов обработки, которые я бы хотел выполнить на этих записях.
Может кто-нибудь объяснить, почему это может считаться плохим дизайном и предоставить какую-то альтернативу, которая все еще несет ответственность за обработку этих записей в классе "Обработка"?
UPDATE:
- Изменен
return null
наthrow new IllegalArgumentException(record);
- Чтобы уточнить, есть три причины, по которым простой метод RecordType.process() не будет достаточным: во-первых, обработка действительно слишком далека от RecordType, чтобы заслужить свой собственный метод в подклассах RecordType. Кроме того, существует целый ряд различных типов обработки, которые теоретически могут выполняться разными процессорами. Наконец, RecordType разработан как простой класс DTO с минимальными методами изменения состояния, определенными внутри.