powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как заменить switch полиморфизмом?
25 сообщений из 40, страница 1 из 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
25 сообщений из 40, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Как заменить switch полиморфизмом?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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