Каковы преимущества цепочки ответственности перед списками классов?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Каковы преимущества цепочки ответственности перед списками классов?

Сообщение Anonymous »

Недавно я обсуждал с другим программистом лучший способ рефакторинга огромного (1000 строк) метода, полного операторов if.

Код написан на Java, но я думаю, что эта проблема может возникнуть и в других языках, таких как C#.

Чтобы решить эту проблему, он предложил использовать шаблон цепочки ответственности.Он предложил иметь базу "Хэндлер" сорт. Затем «Handler1», «Handler2» и т. д. будут расширять «Handler».

Тогда у обработчиков будет метод «getSuccessor», который либо будет возвращать ноль (если это был последний из цепочка) или следующий обработчик цепочки.

Затем функция handleRequest(Request) будет либо обрабатывать запрос, либо передавать его следующему в цепочке и, если ни один из предыдущих решения сработало, оно вернуло бы только ноль или выдало бы исключение.

Чтобы добавить новый обработчик в цепочку, программист должен был перейти к последнему элементу цепочки и сообщить ему, что есть новый элемент. Чтобы что-то сделать, он просто вызывал handleRequest для первого элемента цепочки.

Чтобы решить эту проблему, я предложил использовать другой подход.
У меня также был бы базовый класс «Handler» с «Handler1», «Handler2», как и в предыдущем методе.

Однако не было бы метода «getSuccessor» . Вместо этого у меня был бы класс Collection со списком обработчиков (Vector, ArrayList или что-то еще, что лучше в данном случае).

Функция handleRequest все равно будет существовать, но ее не будет. передать вызов следующим обработчикам. Он просто обработает запрос или вернет значение null.

Для обработки запроса можно использовать

for(Handler handle : handlers){
result = handle.handleRequest(request);
if(result!=null) return result;
}
throw new CouldNotParseRequestException(); //just like in the other approach


Или, чтобы предотвратить дублирование кода, в класс коллекции можно добавить метод «parseRequest(request)».
Чтобы добавить новый обработчик, нужно перейдите к конструктору коллекции (или статическому блоку {}, или чему-то эквивалентному) и просто добавьте код "addHandler(new Handler3());".

Какие именно преимущества цепочки ответственности я Я пропал при таком подходе? Какой метод лучше всего (при условии, что есть лучший метод)? Почему? Какие потенциальные ошибки и проблемы может вызвать каждый метод проектирования?

Для тех, кому нужен контекст, вот как выглядел исходный код:
if(x instanceof Type1)
{
//doSomething1
} else if(x instanceof Type2)
{
//doSomething2
}
//etc.


Подробнее здесь: https://stackoverflow.com/questions/105 ... of-classes
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»