Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/48: Рейтинг темы: голосов - 48, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 26.11.2010
Сообщений: 29

На какой паттерн заменить switch?

26.07.2011, 10:52. Показов 10334. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ситуация следующая: есть перечисление (5 элементов Type1 = 6, Type2 = 12....). Их интовое значение в итоге повлияет на размерность матрицы.
Есть методы, которые создают матрицу, заполняют ее в зависимости от переданного перечисления в качестве аргумента.
В теле метода все выглядит так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
switch(enumType)
{
case Type1:
//Методы создающие и заполняющие матрицу
break;
case Type2:
//Методы создающие и заполняющие матрицу
break;
case Type3:
//Методы создающие и заполняющие матрицу
break;
default:
Console.WriteLine("There's no such enum");
break;
}
Подобная ситуация есть в другом месте кода, что в итоге мне не очень нравится как выглядит - очень коряво.
Чувствую, что нужен паттерн, но вот какой сюда применить даже не знаю. Мысль закралась в сторону стратегии, но не уверен, как ее сюда применить.
Гуру паттерной, посоветуйте как быть.
Заранее спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.07.2011, 10:52
Ответы с готовыми решениями:

Какой паттерн использовать?
Какой паттерн использовать (и использовать ли) в такой ситуации: Существует множество разноклассовых объектов на тачскрин-экране, могущих...

Какой паттерн лучше применить?
Добрый день например в WPF приложении есть 3 Views. Каждая View содержит Control разного типа, пусть это будут кнопки(круглая, квадратная и...

Какой поведенческий паттерн выбрать?
Пишу на c#(Но это впринципе не важно) Есть задача: реализовать арифметические и логические операции с комплексными числами. Надо...

13
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
26.07.2011, 10:56
а нафига сдесь паттерн?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
26.07.2011, 10:57
А ассоциативный массив (словарь по дотнетовски) нельзя тут приляпать?
ключ - интовое значение, а значение адрес выполняемой ф-ции, или если много ф-ций тогда массив в качестве значения.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
26.07.2011, 10:57
Цитата Сообщение от oxotnik Посмотреть сообщение
А ассоциативный массив (словарь по дотнетовски) нельзя тут приляпать?
ключ - интовое значение, а значение адрес выполняемой ф-ции, или если много ф-ций тогда массив в качестве значения.
думаю можно) только эффективность такого кода заплачет)
0
0 / 0 / 0
Регистрация: 26.11.2010
Сообщений: 29
26.07.2011, 11:07  [ТС]
Ну вот у меня если более подробно такая схема:
- есть матрица данных, но ее размер зависит от enum'а
- в зависимости от выбранного enum'а создается матрица определенного размера
- в зависимости от выбранного enum'а считывается файл с данными для заполнения матрицы
- также отдельно заполняется словарь из другого файла, который также зависит от выбранного enum'а.

В данный момент определение какой массив создать, какой файл прочитать и т.д. определяется в операторе switch. Но код выглядит громоздко из-за (на данный момент) 7 вариантов enum'ов.
В другом месте оператор switch не подошел (т.к. в цикле происходит определение), пришлось прибегнуть к "if...else if....else" ветвелению, но выглядит не менее громоздко.

Чувствуется, что можно эту громоздкость заменить на деликатное использование паттерна. Возможно я ошибаюсь, но как мне кажется такие огромные switch и if...else if ветвления не являются best practices.
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
26.07.2011, 11:18
Цитата Сообщение от Maxwe11 Посмотреть сообщение
думаю можно) только эффективность такого кода заплачет)
в каком месте эффективность упадет? почему?
0
0 / 0 / 0
Регистрация: 26.11.2010
Сообщений: 29
26.07.2011, 11:29  [ТС]
Цитата Сообщение от oxotnik Посмотреть сообщение
А ассоциативный массив (словарь по дотнетовски) нельзя тут приляпать?
ключ - интовое значение, а значение адрес выполняемой ф-ции, или если много ф-ций тогда массив в качестве значения.
Хм, а в этом есть смысл. Ключ:значение (номер enum'а : делегат) будет быстро работать, но тут тоже надо подумать, как деликатно подойти к реализации, чтобы не получилось замены шила на мыло (хотя поиск по словарю работает быстрее).
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
26.07.2011, 11:32
Цитата Сообщение от oxotnik Посмотреть сообщение
в каком месте эффективность упадет? почему?
создание ассоциативного массива требует памяти и дальнейшее ее освобожние GC, потому switch как набор инструкций отработает быстрее
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
26.07.2011, 11:38
Цитата Сообщение от Maxwe11 Посмотреть сообщение
создание ассоциативного массива требует памяти и дальнейшее ее освобожние GC, потому switch как набор инструкций отработает быстрее
насколько я понял из задачи, это не критично, т.к. словарь будет задан одноразово (либо при вводе пользователем) и в дальшейшем не будет никаких циклов по его созданию/изменению
0
0 / 0 / 0
Регистрация: 26.11.2010
Сообщений: 29
26.07.2011, 16:20  [ТС]
Пока начертил себе, как будет выглядеть такая реализация:
Dictionary<int, delegate> ctors = new Dictionary<int, delegate>();
Создается делега, в котором будут вызывать соответстсвующий набор функций.
Но есть 1 проблема:
- в каждом случае свой файл должен открываться, если передавать имя файла в качестве аргумента в делегат, то тогда на каждый случай возникнет опять if, switch... и соотвестственно это шаг в сторону использования стратегии т.к. более деликатно будет выглядеть.

Может я не так понял суть этого финта ушами?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
26.07.2011, 16:47
Code
1
2
3
4
Dictionary<int, delegate> ctors = new Dictionary<int, delegate>();
ctors[Type1] = delegate1;
ctors[Type2] = delegate2;
ctors[Type3] = delegate3;
как то так...
1
0 / 0 / 0
Регистрация: 26.11.2010
Сообщений: 29
26.07.2011, 16:58  [ТС]
Т.е. вместо кучи кейсов, будет такое же кол-во делегатов?
В принципе нормально, аналог стратегии получается
Спасибо
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
26.07.2011, 17:13
Цитата Сообщение от Uruluke Посмотреть сообщение
аналог стратегии получается
я как бэ не силен в терминологии, просто из логики как то вытекло.
когда то делал систему плагинов, которая из длл-кок получала имя действий для составления меню и адреса экспортируемых ф-ций. сделал именно таким образом - ассоциативный массив с именами как ключами и вызов ф-ции по адресу, соответствующей ключу.
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
31.07.2011, 10:32
Да, общий метод в том и состоит: заменяем переключатель на подходящий массив-контейнер. Если ключи целые - так вообще простой массив, а если не целые - так ассоциативный контейнер. А в элементе массива храним что- вроде объекта-делегата или объекта-функтора (если на С++, то даже указатели на функцию бывают).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.07.2011, 10:32
Помогаю со студенческими работами здесь

Какой структурный паттерн выбрать?
Задача поставлена следующим образом - &quot;С помощью шаблона проектирования обеспечить вывод на экран собственных инициалов, состоящих из...

Какой паттерн использовать в такой ситуации?
Клиент переводит деньги на счет в банк, ему выдают кредитную карточку, по которой он может получить доступ к счету.

Какой паттерн использовать в данном случае?
Есть у меня паттерн абстрактная фабрика. Но в этой абстрактной фабрике мне потребовалось сделать бизнес логику. Какой паттерн использовать...

Посоветуйте, какой паттерн можно применить?
Ситуация следующая. Есть класс с набором методов, от него наследуется 3 класса, у каждого класса добавляются дополнительные поля и...

Какой наиболее правильный паттерн при работе с SQLite
Что есть: Entity Framework - набор классов для работы с базой данных WPF - забинденные Listview ... DataGrid ... Combobox к свойствам...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 19.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru