Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Хорошо ли использовать switch\case в ООП ?


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

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

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

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

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

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

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

что то я не очень понял задачу (особо не вчитывался), но во многих случаях вместо switch/case (особенно если вариантов много) удобнее юзать std::map

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

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

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

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

Автор: Arat 18.7.2007, 18:15
zkv, спасибо  smile 

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

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

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

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

Автор: DDyDog 18.7.2007, 22:42
Я предлогаю сначало создать единственный класс
С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 

Автор: bsa 18.7.2007, 23:04
Имхо, надо делать в обратном направлении. Т.е. создается иерархия классов kok1...kokN. Причем, у kokN есть публичный конструктор, а у остальных только защищенные. Админы могут создавать эти kok'и. При создании экземпляра этого kokN у него выставлен конструктором статус new_kok. Менеджеры работают только с экземплярами класса kok(N-1), поэтому им доступны деструктор и один метод - установить приоритет и так далее. В итоге, тебе не надо каждый раз пересоздавать этот kok, ООП остается, и switch не используется.

Автор: DDyDog 19.7.2007, 12:01
Цитата

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


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

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

bsa, если я чего-то не понял, тогда опиши поподробнее насчет статуса new_kok 

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

http://en.wikipedia.org/wiki/Finite_state_machine

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

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

Добавлено через 7 минут и 58 секунд
Блин я до сих пор в шоке.... smile 

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

а ты не думаешь что эта задача имено на изучение ООП ?

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

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

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

Добавлено через 2 минуты и 51 секунду
Такая же как if, while ,for

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

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

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

Помню, пришла сюда девушка и попросила помочь с программой. Надо было решить какую-то задачу с помощью рекурсии. Долго народ бился, но так и не придумали такого способа - ну не решалась она таким образом и все тут.

Автор: Daevaorn 19.7.2007, 21:44
DogStyle, можешь так не нервничать и не переживать, т.к. уже все в этой ветке похожие мысли выразили. просто ограничение со стороны препода вполне понятно, оно "затыкает" сразу одно из возможных решений без ООП. И как видишь, именно оно заставило человека обратиться на форум и задуматься над другим решением данной задачи.

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

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

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

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

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


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)