Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хорошо ли использовать switch\case в ООП ? Замена switch\case, на объекты. 
:(
    Опции темы
Arat
Дата 18.7.2007, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 11.7.2007

Репутация: 1
Всего: 1



 Значит объясню в чем же вопрос. Я пишу учебный проект, некую программу, которая управляет Карточками Обращения Клиента ( Далее - КОК). Клиент обращается в компанию с некой проблемой, на него открывают карточку, в ней описывается проблема, далее передают её в другой отдел где устанавливается приоритет, КОК переходит в тех. отдел там пытаются решить проблему. Вобщем с момента создания, КОК постоянно меняет статус: - новый, установлен приоритет, в процессе обработки и т.д. У каждого отдела, есть возможность менять статус КОК, например  Админ может создать КОК, Менеджер устанавливает ему приоритет, техник устанавливает его в состояние  обработки и т.д. Естественно, то что позволено одному, не позволено другому и наоборот. Первое, что приходит в голову, это объявить в объекте КОК  флаги, которые будут обозначать статус КОК. Отсюда следует, что нужно делать switch\case статусу, дабы узнать последовательность действий, в одном случае одно происходит, в другом другое. Например: если объекту КОК присвоен приоритет, то он доступен технику, а если нет, то только менеджеру, который установит приоритет, однако менеджеру доступны так же те, которые уже обработаны техником, менеджер может их удалить и т.д.  

В ВУЗе же мне сказал препод, что switch\case это не ООП. Т.е. пользоваться им можно, но в крайне редких случаях. Решение же он предложил следующие: создать объект БейсКОК, из которого наследуются объекты - НьюКОК, ПроцессКОК и т.д. При изменение статуса, удалять существующий и создавать вместо него новый объект нужного типа. Тип == Статус. 

Вот я думаю, а не дороговато ли выходит, каждый раз создавать новый объект при изменение статуса КОК?

И вообще, верно ли, что switch\case указывает на процедуральное программирование, и в ООП практически не используется?

Если, у кого есть третье решение моего примера, буду очень рад и благодарен.   smile 
  

Это сообщение отредактировал(а) Arat - 18.7.2007, 18:00
PM MAIL   Вверх
zkv
Дата 18.7.2007, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Arat @  18.7.2007,  17:57 Найти цитируемый пост)
И вообще, верно ли, что switch\case указывает на процедуральное программирование, и в ООП практически не используется?

я использую, где удобно использовать smile 
Цитата(Arat @  18.7.2007,  17:57 Найти цитируемый пост)
Если, у кого есть третье решение моего примера, буду очень рад и благодарен. 

что то я не очень понял задачу (особо не вчитывался), но во многих случаях вместо switch/case (особенно если вариантов много) удобнее юзать std::map
PM MAIL   Вверх
Daevaorn
Дата 18.7.2007, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Arat @  18.7.2007,  18:57 Найти цитируемый пост)
Вот я думаю, а не дороговато ли выходит, каждый раз создавать новый объект при изменение статуса КОК?

дорого. но для учебной программы можно и не замечать.
Цитата(Arat @  18.7.2007,  18:57 Найти цитируемый пост)
И вообще, верно ли, что switch\case указывает на процедуральное программирование, и в ООП практически не используется?

нет. вооще-то swith и ООП вещи параллельные. и оно другому не мешает.
Цитата(Arat @  18.7.2007,  18:57 Найти цитируемый пост)
Если, у кого есть третье решение моего примера, буду очень рад и благодарен.  

Конечный автомат.
PM MAIL WWW   Вверх
Arat
Дата 18.7.2007, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 11.7.2007

Репутация: 1
Всего: 1



zkv, спасибо  smile 

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

Добавлено @ 18:16
Цитата(Daevaorn @ 18.7.2007,  18:12)
Цитата(Arat @  18.7.2007,  18:57 Найти цитируемый пост)
Если, у кого есть третье решение моего примера, буду очень рад и благодарен.  

Конечный автомат.

Вот это не очень понял, если можно подробнее. 

Это сообщение отредактировал(а) Arat - 18.7.2007, 18:17
PM MAIL   Вверх
DDyDog
Дата 18.7.2007, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 16.7.2007

Репутация: нет
Всего: нет



Я предлогаю сначало создать единственный класс
Сard, а уже потом создать иерархию приоритетов StatusN с
базовым классом BaseKOK 

Код

class BaseKOK {};

class Status1 : public BaseKOK {}

class Status2 : public BaseKOK {}

class Card
{
      public:
           BaseKOK* priority;
};


а в коде домустим

Код

Сard a = new Card;

a->priority = new Status1;


а потом все будет определятся от начинки StatusN
Например, допустимые в данном приоритете действия(права), которые я не смог 
запрограммировать без более детального условия задачи  smile 

Я бы посоветовал сначала все спроектировать (порисовать например - мне помогает).
иначе препод...  smile

Добавлено через 5 минут и 14 секунд
Ошибки: нехватает ';'

Код

class Status1 : public BaseKOK {}[color=red];[/color]

class Status2 : public BaseKOK {}[color=red];[/color]

И Card* a = new Card;


Извини в блокноте печатал  smile 
PM MAIL   Вверх
bsa
Дата 18.7.2007, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Имхо, надо делать в обратном направлении. Т.е. создается иерархия классов kok1...kokN. Причем, у kokN есть публичный конструктор, а у остальных только защищенные. Админы могут создавать эти kok'и. При создании экземпляра этого kokN у него выставлен конструктором статус new_kok. Менеджеры работают только с экземплярами класса kok(N-1), поэтому им доступны деструктор и один метод - установить приоритет и так далее. В итоге, тебе не надо каждый раз пересоздавать этот kok, ООП остается, и switch не используется.
PM   Вверх
DDyDog
Дата 19.7.2007, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 16.7.2007

Репутация: нет
Всего: нет



Цитата

...выставлен конструктором статус new_kok


Извини, а его потом в switch проверять

Не в обиду, но заменять switch-конструкцию должен механизм виртуальных функций.

bsa, если я чего-то не понял, тогда опиши поподробнее насчет статуса new_kok 
PM MAIL   Вверх
Daevaorn
Дата 19.7.2007, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Arat @  18.7.2007,  19:15 Найти цитируемый пост)
Вот это не очень понял, если можно подробнее. 

http://en.wikipedia.org/wiki/Finite_state_machine
PM MAIL WWW   Вверх
DogStyle
Дата 19.7.2007, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



Пусть препод убьётся об стену...
С сегодняшнего дня не использовать char[] потому что это не ООП!!!!

Друг мой.. ООП не спасёт мир.
Это одна из теорий программирования и не совсем однозначная.
 Разные проекты, разные задачи, разные методы...

Добавлено через 7 минут и 58 секунд
Блин я до сих пор в шоке.... smile 
PM MAIL   Вверх
Daevaorn
Дата 19.7.2007, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(DogStyle @  19.7.2007,  22:11 Найти цитируемый пост)
Блин я до сих пор в шоке.... smile

а ты не думаешь что эта задача имено на изучение ООП ?
PM MAIL WWW   Вверх
DogStyle
Дата 19.7.2007, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



ООП не учится путём убивания в человеке зачатков рацонализма, ты об этом не задумывался...
ООП не способ хитро*бнуться, ООП способ думать глобально,  масштабно и абстрактно... А switch это одна из основных конструкций зачастую неотъемлемая....

Вместо Switch iиспользуй If ... else ЭТО ЧИСТОЕ ООП...

Добавлено через 1 минуту и 58 секунд
switch не имеет ни какого отношения к процедурноориентируемому программированию, это БАЗОВАЯ КОСТРУКЦИЯ ЯЗЫКА

Добавлено через 2 минуты и 51 секунду
Такая же как if, while ,for
PM MAIL   Вверх
bsa
Дата 19.7.2007, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(DogStyle @ 19.7.2007,  21:36)
ООП не учится путём убивания в человеке зачатков рацонализма, ты об этом не задумывался...
ООП не способ хитро*бнуться, ООП способ думать глобально,  масштабно и абстрактно... А switch это одна из основных конструкций зачастую неотъемлемая....

Вместо Switch iиспользуй If ... else ЭТО ЧИСТОЕ ООП...

Дорогой мой, а ты в институте учился? А на кого учился? У тебя было программирование? И как тебя там этому учили помнишь?

Помню, пришла сюда девушка и попросила помочь с программой. Надо было решить какую-то задачу с помощью рекурсии. Долго народ бился, но так и не придумали такого способа - ну не решалась она таким образом и все тут.
PM   Вверх
Daevaorn
Дата 19.7.2007, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



DogStyle, можешь так не нервничать и не переживать, т.к. уже все в этой ветке похожие мысли выразили. просто ограничение со стороны препода вполне понятно, оно "затыкает" сразу одно из возможных решений без ООП. И как видишь, именно оно заставило человека обратиться на форум и задуматься над другим решением данной задачи.
PM MAIL WWW   Вверх
DogStyle
Дата 19.7.2007, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



bsa
ООП меня учил товарищь Шаляпин Юрий Павлович, человек зачастую неодекватный и мнимый, но...
И меня смутила не поставленная задача и предложенное решение, А заявления касающееся switch...
Меня программированю учили на алгоритмах, даже с рекурсией, но не как не на изнасиловании ума...
Практика показывает, главное в мире простота.

Господа это ИМХО, не будте так серьёзны в вопросах этики

Добавлено через 2 минуты
Daevaorn
человек был сбит с толку больше не тем что ООП, а тем что во второй части вопроса ИМХО

Добавлено через 2 минуты и 47 секунд
а именно 
Цитата

И вообще, верно ли, что switch\case указывает на процедуральное программирование, и в ООП практически не используется?



Это сообщение отредактировал(а) DogStyle - 19.7.2007, 21:50
PM MAIL   Вверх
chipset
Дата 19.7.2007, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Чистый ООП это миф smile Надо писать так что-бы можно было разобраться. Если читабельнее написать на пару строчек switch.. case пиши switch вместо насилования архитектуры классов ради трёх вариантов smile


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1053 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.