Недавно я обсуждал с другим программистом лучший способ рефакторинга огромного (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
Каковы преимущества цепочки ответственности перед списками классов? ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1737389567
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.
Подробнее здесь: [url]https://stackoverflow.com/questions/1055383/what-are-the-advantages-of-chain-of-responsibility-vs-lists-of-classes[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия