powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как заменить switch полиморфизмом?
40 сообщений из 40, показаны все 2 страниц
Как заменить switch полиморфизмом?
    #39439893
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть 2 приложения общающихся по сокетам.

приложение_1 засылает в приложение_2 сообщения(по одной трубе). Сообщения по формату разные. Их с десяток разных.

приложение_2 должно обработать каждое сообщение по разному.

по интерфейсу, который есть на стороне приложения_2 прилетает всегда Object.

Вот я думаю как на стороне приложения_2 принимать сообщения.

Можно конечно сделать общий класс(абстрактный/интерфейс) для всех сообщений и сделать метод, который будет возвращать тип сообщения и залепить огромный switch, который будет определять как парсить сообщение, но как-то мне не нравится этот подход. Чувствуется, что можно как-то поаккуратнее сделать, но не придумать.
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39439894
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
смотрите в сторону Akka, может ничего и писать не придется:) Ну а если не подойдет,то идеи почерпнете
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39439895
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл никсмотрите в сторону Akka, может ничего и писать не придется:) Ну а если не подойдет,то идеи почерпнете

Инструментарий не изменить, да и не надо и не важно это. Паттерном каким-то пахнет, но по запаху не понять)

К сожалению тратить времени на изучение фреимфорка ради более красивого решения маленькой задачи мне никто не позволит.
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39439901
pand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90
Можно конечно сделать общий класс(абстрактный/интерфейс) для всех сообщений и сделать метод, который будет возвращать тип сообщения и залепить огромный switch, который будет определять как парсить сообщение, но как-то мне не нравится этот подход. Чувствуется, что можно как-то поаккуратнее сделать, но не придумать.

вместо switch можно использовать рефлексию , для создания нужного экземпляра класса . Если типы сообщений осмысленные даже названия классов красивыми получатся , если нет то будет что-то типа Receiver23 ( 23 тип сообщения )
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39439902
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pandredwhite90Можно конечно сделать общий класс(абстрактный/интерфейс) для всех сообщений и сделать метод, который будет возвращать тип сообщения и залепить огромный switch, который будет определять как парсить сообщение, но как-то мне не нравится этот подход. Чувствуется, что можно как-то поаккуратнее сделать, но не придумать.

вместо switch можно использовать рефлексию , для создания нужного экземпляра класса . Если типы сообщений осмысленные даже названия классов красивыми получатся , если нет то будет что-то типа Receiver23 ( 23 тип сообщения )

Звучит как-то ещё хуже.

А кто сказал, что нужно создавать экземпляры классов?
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39439907
pand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90
Звучит как-то ещё хуже.

Это дело вкуса

redwhite90А кто сказал, что нужно создавать экземпляры классов?
Я в прошлом сообщении :)

Если у Вас два десятка сообщений , которые Вы хотите обрабатывать в одном классе то без switch не обойтись.
Вы можете создать базовый класс
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class  MessageBase {
 void doExec(){}
}

class Message1 extent MessageBase{
@override
void doExec(){
   // parse message 1 
}
}



так у Вас обработчики сообщений будут разнесены по классам , ИМХО легче сопровождать такой код.
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39439909
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pandredwhite90Звучит как-то ещё хуже.

Это дело вкуса

redwhite90А кто сказал, что нужно создавать экземпляры классов?
Я в прошлом сообщении :)

Если у Вас два десятка сообщений , которые Вы хотите обрабатывать в одном классе то без switch не обойтись.
Вы можете создать базовый класс
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class  MessageBase {
 void doExec(){}
}

class Message1 extent MessageBase{
@override
void doExec(){
   // parse message 1 
}
}



так у Вас обработчики сообщений будут разнесены по классам , ИМХО легче сопровождать такой код.

Ну это нормально, что сообщение знает как его обрабатывать?
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39439910
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
HashMap<Message,Strategy> ....
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39439914
dimonz80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Код: java
1.
HashMap<Message,Strategy> ....



Ключ мапы в виде объекта - так себе идейка. Хотя можно, если про hashCode/equals не забыть.

авторПаттерном каким-то пахнет, но по запаху не понять)
Pattern matching называется. Java по простому в него не умеет. Остается "стратегия".
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39439916
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Чувствуется, что можно как-то поаккуратнее сделать, но не придумать.- switch лучше каскада из if / instanceof / else...
- Отпадает необходимость в поддержке актуальности классов сообщений как на клиенте, так и на сервере
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39439941
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman- switch лучше каскада из if / instanceof / else...

Да ну нафиг, а если у меня бизнес логика состоит из 20-30 шагов причем не просто в одну строчку, а поболее, да еще с разными переменными, которые, да, можно засунуть в свитч, но потом как с ними разбираться через полгода? Это ж ад будет для самого себя.
(хотя за такое мне руки надо будет оторвать :)) )
Уж лучше в таком случае пачка из if/else чем свичи, тут хоть не надо ползать по всей этой портянке и смотреть где я забыл брейк поставить, а где его и не надо было и что там внизу по дефолту у меня стояло.
Но если в каждом кейсе у нас однотипный код, то есть имеющий схожие строки кода, да еще и всего лишь парочку максимум, то да, кейс гораздо лучше, нагляднее.
Но по ООПешному, надо бы абстрактных классов наклепать :)
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39439952
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NixicДа ну нафиг switch работает быстрее + структурировано и читабельно (!)NixicНо по ООПешному, надо бы абстрактных классов наклепать :)Сокеты-то не спроста. Предшественник ТС-а скорее всего думал о производительности.
Если по "ООПешному", тада пусть перепилит на RMI/WebServices (но лучше веб-сервисы)
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39439962
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimonz80mayton
Код: java
1.
HashMap<Message,Strategy> ....



Ключ мапы в виде объекта - так себе идейка. Хотя можно, если про hashCode/equals не забыть.
Это просто мозговой штурм. Я даже ничего не предлагаю а просто озвучиваю мысль.
Дальше - можно рассуждать и улучшать это предложение как альтернативу switch.
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39439966
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если всё взвесить и холодно рассудить во благовремение, то на кой черт вообще менять свитч на абстракции, что сейчас не устраивает в работе этого кейса?
Если это просто гонка за использованием чего-то для себя нового, то зачем в рабочем проекте это делать, если это, конечно рабочий проект. Возьмите и попробуйте отдельно разные варианты, затем решите для себя, что вам проще поддерживать, структуру классов или один свитч или перейти if/else'ы.
В любом случае почитайте вот тут комментарии , там есть здравые мысли на этот счет, мне и самому было интересно почитать и по ссылкам походить.
Вывод - не заморачиваться, а писать код :)
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39439967
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usmanredwhite90Чувствуется, что можно как-то поаккуратнее сделать, но не придумать.- switch лучше каскада из if / instanceof / else...
- Отпадает необходимость в поддержке актуальности классов сообщений как на клиенте, так и на сервере

Я в Spring'е делал немного по другому.
1) Создавался один общий интерфейс для всех обработчиков с герериком. В котором описывались методы общие для них всех. Плюс метод который возвращал класс генерика
2) Для каждого обработчика создавалась имплементация (@Component), котрой ч/з @Qulify давалось имя по определенному правилу
3) Ч\з
Код: java
1.
@Autowire List<Мой интерфейс> list;


можно получить все имплементации интерфейса.
4) В цикле можно выбрать нужную имплементацию, в соответствии с типом (для этого нужен метод возвращающий тип генерика)
...
5) PROFIT
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39439971
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с учетом современных компиляторов свитч совсем не страшен, меня в нем одно лишь пугает - если этот свитч писал не я и что делать, если там брейки не везде стоят. Это оно так было задумано или случайно пропустили. То есть, плохо, только с точки зрения переиспользования или в случае изменения кода и логики работы этого свитча.
А в принципе нормальная конструкция, которой можно было бы избежать при желании в начале разработки, а вот просто так ее переписывать ради "попереписывать" нафиг оно нужно.
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39439976
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nixicменя в нем одно лишь пугаетИ не только вас! Значит плохой был code-review: без комментов, описания и т.д.
NixicТо есть, плохо, только с точки зрения переиспользования или в случае изменения кода и логики работы этого свитча.Все зависит от БЛ. Если идет проверка числовых диапазонов или вообще
условия типа больше/меньше... тот тут однозначно IF .
Для констант рекомендую использовать switch .
В данном случае, полагается, что речь идет о константах (типы сообщений).
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39439978
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mad_nazgulPROFITКонечно, круто... но все это очень закручено (:
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39440049
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да обычный фабричный метод, только на выходе не продукт, а обработчик сообщения, наследующий общий интерфейс типа IProcessor.run(object message)

А внутри фабричного метода по любому switch
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39440080
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вообще говоря у меня спринг и я руками бины не создаю
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39440089
Andrew1411
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,

Зачем так?
Тип месседжа - значение енама
Конструктор енама принимает функцию в качестве экшена (каждый элемент енама при его конструировании передает экшен)
у енама реализовать метод process(message) который и будет вызывать экшен конкретного значения енама
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39440165
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usmanmad_nazgulPROFITКонечно, круто... но все это очень закручено (:

Да не. Звучит страшнее, чем использование.
Зато не думаешь, при добавлении обработчика, что где-то надо case надо добавить.
Но работает медленнее.
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39440182
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня рефлексия неплохо рулит.
когда много таких "сообщкний" if и свич становятся монструозными.
да идобавление нового требует исправления в нескольких местах.
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39440251
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrew1411,

В описании сказано, что прилетает только Object. По любому какой то if должен быть
Ну или если парсить этот объект и рефлексией генерировать обработчик, тогда можно без ветвлений, но рефлексия - это не очень быстро
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39440257
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79но рефлексия - это не очень быстро
это было давным давно, счас она може и медленнее чем if, но при добром количестве этих if - явно будет быстрее
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39440262
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79В описании сказано, что прилетает только Object. По любому какой то if должен быть
Ну или если парсить этот объект и рефлексией генерировать обработчик, тогда можно без ветвлений, но рефлексия - это не очень быстро
Какой милый набор заблуждений.
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39440263
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда все просто: получаем тип сообщения, делаем createinstance, используя в качестве параметра тип объекта, вызываем метод созданного объекта.

Никаких сравнений, расширение обработчиков путем создания новых классов
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39440343
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79тогда все просто: получаем тип сообщения, делаем createinstance, используя в качестве параметра тип объекта, вызываем метод созданного объекта.

Никаких сравнений, расширение обработчиков путем создания новых классов
А не проще, обработчики один раз создать и банально в HashMap затолкать

Такие паттерны могут только изготовители и продавцы памяти придумывать и советовать. Да и те уже на грани банкротства ( Toshiba ))) )

IMHO & AFAIK
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39440381
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
redwhite90,
Поскольку упоминается спринг, напрашивается такое решение
Код: java
1.
2.
3.
4.
5.
interface Handler {
  Object processMessage(Object message);
}

... куча именованных бинов, реализующих interface Handler, столько, сколько типов сообщений


и обработка:
Код: java
1.
2.
3.
4.
ApplicationContext ctx = ApplicationContextProvider.getApplicationContext(); // или какой там метод будет работать в контексте
String beanName = getBeanNameFromMessage(Object message);
Handler handler = ctx.getBean(beanName, Handler.class);
handler.processMessage(message);
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39440398
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

Проще, не проще. ТС спросил, как обойтись без switch. Ему ответили.
А применять HashMap для поиска по идентификатору обработчика - это как раз таки и есть реализация фабричного метода
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39440499
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бины, хеш-мапы со стратегиями полезны только в том случае, когда логика
процессинга сообщений нам заранее неизвестна но есть некий протокол
или договоренность что в системе, в рантайме на момент поступления сообщений
будет доступна новая логика которая готова процессить новой тип сообщений.
Технические нюансы реализации - произвольны.

Через switch или if-else мы такое не сделаем.
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39449067
rfq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90,

1. В сообщении кодировать номер типа (формата) сообщения.
2. На приемной стороне завести массив обработчиков, по одному на каждый формат.
3. Приняв сообщение, извлечь из него номер типа, по этому номеру извлечь нужный обработчик, и передать ему сообщение.
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39449142
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и зачем тему подняли?
rfqпо этому номеру извлечь нужный обработчик
вот как раз это действие и спрашивалось.
По switch \ if ли это делать.
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39449216
it_andrei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не заметил предлагали тут или нет перегрузку.

Можно создать класс обработчик с перегруженными конструкторами или методами и потом вызывать одинаково для всех сообщений
new Handle(message) или (new Handle()).doIt(message)
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39449221
it_andrei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя нет, не получится, у вас же там по сокету обмен.
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39449305
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90приложение_1 засылает в приложение_2 сообщения (по одной трубе) Допустим, имеется 20 типов сообщений.
На каждый тип сообщения по отдельной трубе!
И все! Принимаем и cast 'им объекты с закрытыми глазами (:
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39449608
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В варианте с очень быстрым процессингом сообщений (типа Disruptor) будет
полезно сделать некий генерализованный Message с набором общих полей
типа int field1, field2 .... ; String sField1, sField2 и как-то юзать их без
проверки на тип сообщения.
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39449663
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надеюсь, что команда switch в лучшем случае будет выполняется за единицы машинных тактов Нафига это оптимизировать и усложнять, мне не очень понятно.

Во всяких "обработчиках с очень быстрым процессингом сообщений (типа Disruptor)" все равно будут использоваться коллекции. А они IMHO в любом случае тормозить будут сильнее, чем банальный switch.

А общие поля собрать в общий класс-предок и наследоваться от него. В лучших традициях ООП середины 90-х.

IMHO
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39449919
andmed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня похожая задачка была. Нужно замапить было exceptions. Поскольку были экстендящие классы, я просто написал линейный if с isAssignableFrom() и последующим кастом. единственное нужно проверять порядок, т.к. дерево, в остально на на самом деле, просто. да, были замечания что много ифов, но красивее как, не придумал
...
Рейтинг: 0 / 0
Как заменить switch полиморфизмом?
    #39450026
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Сообщения по формату разные. Их с десяток разных. Предлагаю также включить в класс реализацию обработчика этого конкретного типа сообщения.
redwhite90приложение_2 должно обработать каждое сообщение по разному.сообщения наследуются от одного класса/интерфейса,
где нужно определить метод process() - этот метод и будет
обработчиком для текущего экземпляра сообщения.
redwhite90по интерфейсу, который есть на стороне приложения_2 прилетает всегда Object.Всегда кастим к одному базовому классу/интерфейсу.
Приложению 2 достаточно вызвать у текущего сообщения метод process() .
+
Добавив несколько необходимых Listener 'ов, можно реагировать на события
происходящие в процессе обработки сообщения. Например, onProcessStart,
onProcessFailure, onProcessEnd и т.д.
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Как заменить switch полиморфизмом?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]