|
|
|
Как заменить 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 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Arm79но рефлексия - это не очень быстро это было давным давно, счас она може и медленнее чем if, но при добром количестве этих if - явно будет быстрее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 15:34 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Arm79В описании сказано, что прилетает только Object. По любому какой то if должен быть Ну или если парсить этот объект и рефлексией генерировать обработчик, тогда можно без ветвлений, но рефлексия - это не очень быстро Какой милый набор заблуждений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 15:38 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
тогда все просто: получаем тип сообщения, делаем createinstance, используя в качестве параметра тип объекта, вызываем метод созданного объекта. Никаких сравнений, расширение обработчиков путем создания новых классов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 15:38 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Arm79тогда все просто: получаем тип сообщения, делаем createinstance, используя в качестве параметра тип объекта, вызываем метод созданного объекта. Никаких сравнений, расширение обработчиков путем создания новых классов А не проще, обработчики один раз создать и банально в HashMap затолкать Такие паттерны могут только изготовители и продавцы памяти придумывать и советовать. Да и те уже на грани банкротства ( Toshiba ))) ) IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 16:54 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
redwhite90, Поскольку упоминается спринг, напрашивается такое решение Код: java 1. 2. 3. 4. 5. и обработка: Код: java 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 17:27 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, Проще, не проще. ТС спросил, как обойтись без switch. Ему ответили. А применять HashMap для поиска по идентификатору обработчика - это как раз таки и есть реализация фабричного метода ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 17:39 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Бины, хеш-мапы со стратегиями полезны только в том случае, когда логика процессинга сообщений нам заранее неизвестна но есть некий протокол или договоренность что в системе, в рантайме на момент поступления сообщений будет доступна новая логика которая готова процессить новой тип сообщений. Технические нюансы реализации - произвольны. Через switch или if-else мы такое не сделаем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2017, 21:44 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
redwhite90, 1. В сообщении кодировать номер типа (формата) сообщения. 2. На приемной стороне завести массив обработчиков, по одному на каждый формат. 3. Приняв сообщение, извлечь из него номер типа, по этому номеру извлечь нужный обработчик, и передать ему сообщение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2017, 00:34 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
и зачем тему подняли? rfqпо этому номеру извлечь нужный обработчик вот как раз это действие и спрашивалось. По switch \ if ли это делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2017, 09:30 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Не заметил предлагали тут или нет перегрузку. Можно создать класс обработчик с перегруженными конструкторами или методами и потом вызывать одинаково для всех сообщений new Handle(message) или (new Handle()).doIt(message) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2017, 10:38 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Хотя нет, не получится, у вас же там по сокету обмен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2017, 10:46 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
redwhite90приложение_1 засылает в приложение_2 сообщения (по одной трубе) Допустим, имеется 20 типов сообщений. На каждый тип сообщения по отдельной трубе! И все! Принимаем и cast 'им объекты с закрытыми глазами (: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2017, 12:15 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
В варианте с очень быстрым процессингом сообщений (типа Disruptor) будет полезно сделать некий генерализованный Message с набором общих полей типа int field1, field2 .... ; String sField1, sField2 и как-то юзать их без проверки на тип сообщения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2017, 18:11 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
Надеюсь, что команда switch в лучшем случае будет выполняется за единицы машинных тактов Нафига это оптимизировать и усложнять, мне не очень понятно. Во всяких "обработчиках с очень быстрым процессингом сообщений (типа Disruptor)" все равно будут использоваться коллекции. А они IMHO в любом случае тормозить будут сильнее, чем банальный switch. А общие поля собрать в общий класс-предок и наследоваться от него. В лучших традициях ООП середины 90-х. IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2017, 22:50 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
У меня похожая задачка была. Нужно замапить было exceptions. Поскольку были экстендящие классы, я просто написал линейный if с isAssignableFrom() и последующим кастом. единственное нужно проверять порядок, т.к. дерево, в остально на на самом деле, просто. да, были замечания что много ифов, но красивее как, не придумал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2017, 16:05 |
|
||
|
Как заменить switch полиморфизмом?
|
|||
|---|---|---|---|
|
#18+
redwhite90Сообщения по формату разные. Их с десяток разных. Предлагаю также включить в класс реализацию обработчика этого конкретного типа сообщения. redwhite90приложение_2 должно обработать каждое сообщение по разному.сообщения наследуются от одного класса/интерфейса, где нужно определить метод process() - этот метод и будет обработчиком для текущего экземпляра сообщения. redwhite90по интерфейсу, который есть на стороне приложения_2 прилетает всегда Object.Всегда кастим к одному базовому классу/интерфейсу. Приложению 2 достаточно вызвать у текущего сообщения метод process() . + Добавив несколько необходимых Listener 'ов, можно реагировать на события происходящие в процессе обработки сообщения. Например, onProcessStart, onProcessFailure, onProcessEnd и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2017, 09:41 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2122930]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
70ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 218ms |
| total: | 381ms |

| 0 / 0 |
