Как реализовать полиморфизм у одной сущности с разными типами?
Всем привет! Есть БД, в которой хранятся входящие задачи на исполнение. Каждая задача выгладят одинакового и содержит свой тип(строка) и payload для выполнения этой задачи. Количество типов задач - неограниченно.
В зависимости от типа задачи мне нужно запускать свой обработчик и пока, кроме как switch'ом перебирать типы, при выгрузке из БД, и запускать нужный обработчик, решения не приходит.
Подскажите, какие есть идеи, чтобы избавить пот этого перебора каждый раз при работе с задачами?
GolangNoob, я вот давно go не трогал, разве можно в нем сделать структуру с любым типом внутри?
Вообщем мне кажется с go такое вообще не провернуть, нужны дженерики, вроде их собирались завезти в go, но вот не знаю как с этим дело в итоге обстоит.
Я бы такую задачу решал на расте в виде статической библиотеки, которая потом будет линковаться с остальным проектом на go через cgo. Ну или на плюсах еще можно с их темплейтами.
Ну еще как вариант, если payload - это просто некий набор байт, то тащить его до обработчика как сырые байты, а обработчик уже сам решает как из сырых байтов восстановить нормальный тип. По крайней мере в C, где тоже весь полиморфизм ручками, именно так делают, функции принимают на вход void* data и разбирают из него байты в нормальную структуру.
Не до конца ясна задача. От свитча всё равно полностью не избавиться, потому что когда достаешь из базы данные, придется написать правило по созданию внутренних моделей этих данных и там будет свитч, это в любом языке.
А вот сами модели нужно просто строить так, чтобы они все удовлетворяли одному интерфейсу, который описывает все те операции, которые у этих всех задач едины. Тогда будет нужный вам полиморфизм.
GolangNoob, мне тоже вариант с map на ум пришел. По идее взять хэш от строки будет быстрее, чем сравнивать по значениям в switch. И в коде более чисто и компактно
Честно говоря тут вопрос сформулирован неправильно, зачем вам полиморфизм, когда у вас всегда один тип, а действия зависят от значения, которое лежит внутри переменной уже известного типа. Вам в любом случае придется использовать switch/map/цикл, чтобы вызвать нужную функцию.