|
|
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Есть 2 приложения общающихся по сокетам. приложение_1 засылает в приложение_2 сообщения(по одной трубе). Сообщения по формату разные. Их с десяток разных. приложение_2 должно обработать каждое сообщение по разному. по интерфейсу, который есть на стороне приложения_2 прилетает всегда Object. Вот я думаю как на стороне приложения_2 принимать сообщения. Можно конечно сделать общий класс(абстрактный/интерфейс) для всех сообщений и сделать метод, который будет возвращать тип сообщения и залепить огромный switch, который будет определять как парсить сообщение, но как-то мне не нравится этот подход. Чувствуется, что можно как-то поаккуратнее сделать, но не придумать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2017, 23:47 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
смотрите в сторону Akka, может ничего и писать не придется:) Ну а если не подойдет,то идеи почерпнете ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2017, 23:50 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
забыл никсмотрите в сторону Akka, может ничего и писать не придется:) Ну а если не подойдет,то идеи почерпнете Инструментарий не изменить, да и не надо и не важно это. Паттерном каким-то пахнет, но по запаху не понять) К сожалению тратить времени на изучение фреимфорка ради более красивого решения маленькой задачи мне никто не позволит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2017, 23:56 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
redwhite90 Можно конечно сделать общий класс(абстрактный/интерфейс) для всех сообщений и сделать метод, который будет возвращать тип сообщения и залепить огромный switch, который будет определять как парсить сообщение, но как-то мне не нравится этот подход. Чувствуется, что можно как-то поаккуратнее сделать, но не придумать. вместо switch можно использовать рефлексию , для создания нужного экземпляра класса . Если типы сообщений осмысленные даже названия классов красивыми получатся , если нет то будет что-то типа Receiver23 ( 23 тип сообщения ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 00:18 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
pandredwhite90Можно конечно сделать общий класс(абстрактный/интерфейс) для всех сообщений и сделать метод, который будет возвращать тип сообщения и залепить огромный switch, который будет определять как парсить сообщение, но как-то мне не нравится этот подход. Чувствуется, что можно как-то поаккуратнее сделать, но не придумать. вместо switch можно использовать рефлексию , для создания нужного экземпляра класса . Если типы сообщений осмысленные даже названия классов красивыми получатся , если нет то будет что-то типа Receiver23 ( 23 тип сообщения ) Звучит как-то ещё хуже. А кто сказал, что нужно создавать экземпляры классов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 00:26 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
redwhite90 Звучит как-то ещё хуже. Это дело вкуса redwhite90А кто сказал, что нужно создавать экземпляры классов? Я в прошлом сообщении :) Если у Вас два десятка сообщений , которые Вы хотите обрабатывать в одном классе то без switch не обойтись. Вы можете создать базовый класс Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. так у Вас обработчики сообщений будут разнесены по классам , ИМХО легче сопровождать такой код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 00:54 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
pandredwhite90Звучит как-то ещё хуже. Это дело вкуса redwhite90А кто сказал, что нужно создавать экземпляры классов? Я в прошлом сообщении :) Если у Вас два десятка сообщений , которые Вы хотите обрабатывать в одном классе то без switch не обойтись. Вы можете создать базовый класс Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. так у Вас обработчики сообщений будут разнесены по классам , ИМХО легче сопровождать такой код. Ну это нормально, что сообщение знает как его обрабатывать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 01:01 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 01:02 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
mayton Код: java 1. Ключ мапы в виде объекта - так себе идейка. Хотя можно, если про hashCode/equals не забыть. авторПаттерном каким-то пахнет, но по запаху не понять) Pattern matching называется. Java по простому в него не умеет. Остается "стратегия". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 02:30 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
redwhite90Чувствуется, что можно как-то поаккуратнее сделать, но не придумать.- switch лучше каскада из if / instanceof / else... - Отпадает необходимость в поддержке актуальности классов сообщений как на клиенте, так и на сервере ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 03:20 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Usman- switch лучше каскада из if / instanceof / else... Да ну нафиг, а если у меня бизнес логика состоит из 20-30 шагов причем не просто в одну строчку, а поболее, да еще с разными переменными, которые, да, можно засунуть в свитч, но потом как с ними разбираться через полгода? Это ж ад будет для самого себя. (хотя за такое мне руки надо будет оторвать :)) ) Уж лучше в таком случае пачка из if/else чем свичи, тут хоть не надо ползать по всей этой портянке и смотреть где я забыл брейк поставить, а где его и не надо было и что там внизу по дефолту у меня стояло. Но если в каждом кейсе у нас однотипный код, то есть имеющий схожие строки кода, да еще и всего лишь парочку максимум, то да, кейс гораздо лучше, нагляднее. Но по ООПешному, надо бы абстрактных классов наклепать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 08:01 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
NixicДа ну нафиг switch работает быстрее + структурировано и читабельно (!)NixicНо по ООПешному, надо бы абстрактных классов наклепать :)Сокеты-то не спроста. Предшественник ТС-а скорее всего думал о производительности. Если по "ООПешному", тада пусть перепилит на RMI/WebServices (но лучше веб-сервисы) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 08:30 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
dimonz80mayton Код: java 1. Ключ мапы в виде объекта - так себе идейка. Хотя можно, если про hashCode/equals не забыть. Это просто мозговой штурм. Я даже ничего не предлагаю а просто озвучиваю мысль. Дальше - можно рассуждать и улучшать это предложение как альтернативу switch. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 08:45 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Если всё взвесить и холодно рассудить во благовремение, то на кой черт вообще менять свитч на абстракции, что сейчас не устраивает в работе этого кейса? Если это просто гонка за использованием чего-то для себя нового, то зачем в рабочем проекте это делать, если это, конечно рабочий проект. Возьмите и попробуйте отдельно разные варианты, затем решите для себя, что вам проще поддерживать, структуру классов или один свитч или перейти if/else'ы. В любом случае почитайте вот тут комментарии , там есть здравые мысли на этот счет, мне и самому было интересно почитать и по ссылкам походить. Вывод - не заморачиваться, а писать код :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 08:51 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Usmanredwhite90Чувствуется, что можно как-то поаккуратнее сделать, но не придумать.- switch лучше каскада из if / instanceof / else... - Отпадает необходимость в поддержке актуальности классов сообщений как на клиенте, так и на сервере Я в Spring'е делал немного по другому. 1) Создавался один общий интерфейс для всех обработчиков с герериком. В котором описывались методы общие для них всех. Плюс метод который возвращал класс генерика 2) Для каждого обработчика создавалась имплементация (@Component), котрой ч/з @Qulify давалось имя по определенному правилу 3) Ч\з Код: java 1. можно получить все имплементации интерфейса. 4) В цикле можно выбрать нужную имплементацию, в соответствии с типом (для этого нужен метод возвращающий тип генерика) ... 5) PROFIT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 08:52 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
с учетом современных компиляторов свитч совсем не страшен, меня в нем одно лишь пугает - если этот свитч писал не я и что делать, если там брейки не везде стоят. Это оно так было задумано или случайно пропустили. То есть, плохо, только с точки зрения переиспользования или в случае изменения кода и логики работы этого свитча. А в принципе нормальная конструкция, которой можно было бы избежать при желании в начале разработки, а вот просто так ее переписывать ради "попереписывать" нафиг оно нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 08:57 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Nixicменя в нем одно лишь пугаетИ не только вас! Значит плохой был code-review: без комментов, описания и т.д. NixicТо есть, плохо, только с точки зрения переиспользования или в случае изменения кода и логики работы этого свитча.Все зависит от БЛ. Если идет проверка числовых диапазонов или вообще условия типа больше/меньше... тот тут однозначно IF . Для констант рекомендую использовать switch . В данном случае, полагается, что речь идет о константах (типы сообщений). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 09:07 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
mad_nazgulPROFITКонечно, круто... но все это очень закручено (: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 09:09 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Да обычный фабричный метод, только на выходе не продукт, а обработчик сообщения, наследующий общий интерфейс типа IProcessor.run(object message) А внутри фабричного метода по любому switch ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 10:37 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
вообще говоря у меня спринг и я руками бины не создаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 11:15 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Arm79, Зачем так? Тип месседжа - значение енама Конструктор енама принимает функцию в качестве экшена (каждый элемент енама при его конструировании передает экшен) у енама реализовать метод process(message) который и будет вызывать экшен конкретного значения енама ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 11:32 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Usmanmad_nazgulPROFITКонечно, круто... но все это очень закручено (: Да не. Звучит страшнее, чем использование. Зато не думаешь, при добавлении обработчика, что где-то надо case надо добавить. Но работает медленнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 12:50 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
у меня рефлексия неплохо рулит. когда много таких "сообщкний" if и свич становятся монструозными. да идобавление нового требует исправления в нескольких местах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 13:10 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Andrew1411, В описании сказано, что прилетает только Object. По любому какой то if должен быть Ну или если парсить этот объект и рефлексией генерировать обработчик, тогда можно без ветвлений, но рефлексия - это не очень быстро ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 15:30 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39440049&tid=2122930]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
81ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
86ms |
get tp. blocked users: |
2ms |
| others: | 234ms |
| total: | 458ms |

| 0 / 0 |
