|
Шаблонный параметр с индивидуальной логикой
|
|||
---|---|---|---|
#18+
Всем привет! Есть некий класс описывающий объект Item Код: plaintext 1. 2. 3. 4.
Каждый такой Item-объект может быть представлен обычной wchar_t-строкой, при помощи которой он может быть найден или построен динамически в run-time в базовом классе Executor. Поэтому у Executor две функции Execute для разных типов параметров Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
Класс Executor является предком множества производных классов, каждый из которых решает свою специфическую задачу Например, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
Думаю проблема ясна: приходится каждый раз писать две функции для разных типов параметров и казалось бы ответ на данную проблему - шаблоны! Только вот логика класса Executor не позволяет сделать так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Первое что пришло в голову использовать type traits и сделать так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
Мне не особо нравится это решение и кажется неэффективным, возможно кто-то предложит другой вариант ? -------------------------------------------------------------- o(O_O)o ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2018, 11:47 |
|
Шаблонный параметр с индивидуальной логикой
|
|||
---|---|---|---|
#18+
Cerebrum, Нельзя было написать отдельную специализацию для Executor::Execute<Item>? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2018, 12:25 |
|
Шаблонный параметр с индивидуальной логикой
|
|||
---|---|---|---|
#18+
Да, можно, но пока придумал вот так... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56.
и тогда не придется писать специализации Execute, если мне понадобится изменить что-то в производном от Executor классе, только добавить Validator с нужным функционалом ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2018, 18:08 |
|
Шаблонный параметр с индивидуальной логикой
|
|||
---|---|---|---|
#18+
Немного не понятно. Если две функции работают с разными параметрами, зачем их собирать в одну, если потом внутри всё равно код разбивается на две части внутренней логикой? Как раз удобнее оставить 2 (перегруженные) функции, которые принимают Item и wchar, а компилятор сам решит, какую туда подставить. Item может быть представлен строкой, т.о. Execute(wchar) может формировать Item и звать внутри соответствующую функцию? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2018, 05:20 |
|
Шаблонный параметр с индивидуальной логикой
|
|||
---|---|---|---|
#18+
CEMb, дело в том, что wchar-type это случай, когда клиент Executor'a не имеет возможности выполнить функцию с Item параметром, а Executor (или нижележащие классы) знают как преобразовать имя объекта в объект и затем использовать его. В принципе можно было бы написать сначало получение Item по его имени, а потом использование единственной функции с Item параметром. Функция с wchar это просто для удобства вызова, чтобы каждый раз не приходилось искать Item, тем более что это не всегда возможно на уровне Executor'a. Для примера, представь что wchar - это имя сервера, а Item - это объект сервера, который исполняет логику. Имя не может исполнять никакой логики, а объект - может. Executor знает как получить объект сервера по его имени и затем выполнить какой-нибудь запрос на его уровне. Логика примера нааамнооого проще чем то, как обстоит дело в действительности, поэтому неизбежно возникает непонимание: а нафига тебе это вообще надо? Это нормально ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2018, 08:25 |
|
Шаблонный параметр с индивидуальной логикой
|
|||
---|---|---|---|
#18+
CerebrumCEMb, дело в том, что wchar-type это случай, когда клиент Executor'a не имеет возможности выполнить функцию с Item параметром, а Executor (или нижележащие классы) знают как преобразовать имя объекта в объект и затем использовать его. В принципе можно было бы написать сначало получение Item по его имени, а потом использование единственной функции с Item параметром. Функция с wchar это просто для удобства вызова, чтобы каждый раз не приходилось искать Item, тем более что это не всегда возможно на уровне Executor'a. Для примера, представь что wchar - это имя сервера, а Item - это объект сервера, который исполняет логику. Имя не может исполнять никакой логики, а объект - может. Executor знает как получить объект сервера по его имени и затем выполнить какой-нибудь запрос на его уровне. Логика примера нааамнооого проще чем то, как обстоит дело в действительности, поэтому неизбежно возникает непонимание: а нафига тебе это вообще надо? Это нормально Это значит, что у тебя просто проблема с проектированием. Похоже, что задача типовая - фабрика с десериализацией. Проще сначала создать Item(параметры) или Item(wchar* tag) стандартным образом - конструктором. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2018, 09:27 |
|
Шаблонный параметр с индивидуальной логикой
|
|||
---|---|---|---|
#18+
Паттерн фабрик http://cpp-reference.ru/patterns/creational-patterns/factory-method/ http://cpp-reference.ru/patterns/creational-patterns/abstract-factory/ ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2018, 09:30 |
|
Шаблонный параметр с индивидуальной логикой
|
|||
---|---|---|---|
#18+
SiemarglЭто значит, что у тебя просто проблема с проектированием. Похоже, что задача типовая - фабрика с десериализацией. Проще сначала создать Item(параметры) или Item(wchar* tag) стандартным образом - конструктором. не исключено - код старый и требует основательного рефакторинга и перепроектирования Пока вернулся к тому что было ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2018, 09:47 |
|
Шаблонный параметр с индивидуальной логикой
|
|||
---|---|---|---|
#18+
CerebrumЛогика примера нааамнооого проще чем то, как обстоит дело в действительности, поэтому неизбежно возникает непонимание: а нафига тебе это вообще надо? Это нормально Ну вот я так и заподозрил в начале, что это упрощение. Но всё равно не пойму, зачем всё в одну функцию. Функция-с-именем, получает объект и скармливает его другой функции, которая знает, что с ним делать. Я у себя всегда так делаю, когда код обращается к функциональным контейнерам двумя способами: по имени или с объектом. Например, когда надо удалить объект из контейнера, по имени/ключу или по ссылке на сам объект. Одна ищет, вторая ещё раз ищет, но иначе, и удаляет ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2018, 12:02 |
|
Шаблонный параметр с индивидуальной логикой
|
|||
---|---|---|---|
#18+
CEMbНо всё равно не пойму, зачем всё в одну функцию. Функция-с-именем, получает объект и скармливает его другой функции, которая знает, что с ним делать потому что задолбался писать по две функции с практически полностью идентичным кодом каждый раз иногда этого идентичного кода практически нет, а иногда - прилично то есть по хорошему весь одинаковый код надо выносить в общую функцию, а потом подставлять ее в эти две. Но тут приходит понимание, что что-то в этом бедламе не так и ему нужна переделка. Вот я и попытался как-то упростить себе жизнь, но то, что получилось меня совсем не обрадовало, поэтому я вернул как было, с небольшой оптимизацией. Пока оставлю так, а дальше надо продумать хорошенько архитектуру и сделать все по-нормальному, чтобы не приходилось извращаться так, как сейчас приходится. Вся проблема только - найти на это время, среди потока нескончаемых новых задач... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2018, 12:09 |
|
Шаблонный параметр с индивидуальной логикой
|
|||
---|---|---|---|
#18+
как раз на продумывание архитектуры нужно тратить время, а не код городить ;) основная работа программиста не в кол-ве строк, а в разработке алгоритмов ... |
|||
:
Нравится:
Не нравится:
|
|||
26.10.2018, 15:24 |
|
Шаблонный параметр с индивидуальной логикой
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2018, 19:09 |
|
|
start [/forum/topic.php?fid=57&msg=39723243&tid=2017735]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 259ms |
total: | 397ms |
0 / 0 |