Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
PitMagnum
3 / 3 / 0
Регистрация: 28.05.2012
Сообщений: 21
#1

Парадигмы: императивная vs ООП - C++

19.12.2012, 00:08. Просмотров 1090. Ответов 21
Метки нет (Все метки)

Здравствуйте, форумчане. Меня мучает проблема, можно так сказать, эстетически-идеологического характера. Суть заключается в следующем:

Концепция разделения данных и управления данными ООП дает большие преимущества - по крайней мере если алгоритмы имеют сложную структуру, то классы не дают превратиться в кашу из данных и обработчиков этих данных, что может случиться, если использовать императивный стиль программирования. С другой стороны ООП заточен на представление всего и вся в виде объектов. И во многих случаях это естественно и правильно. Например при написании персонажей в игре. Поскольку персонаж - это без сомнения объект.

Но беда в том, что не всегда что-то стойко ассоциируется с объектом. Например у меня есть модуль, который грубо говоря содержит 3 основных функции: шифрование по ГОСТ 28147-89 в режиме простой замены, шифрование по ГОСТ 28147-89 в режиме гаммирования и хеш-функция по ГОСТ 34.11-94. Последние две функции используют первую для своих вычислений. Есть еще вспомогательные функции. А еще есть данные, которые кое как распиханы по функциям. И я явственно вижу, что применив ООП парадигму, я смогу улучшить этот модуль - сформируется четкий интерфейс, данные будут размещены в одном месте, а следовательно, не будет всего этого дрочерства с передачей кучи параметров от одной функции к другой.

С другой стороны я понимаю, что обрамив все в класс или несколько классов, я обречен на вызов этих функций сугубо через объекты, которые мне предварительно нужно создать перед использованием. Но это было бы так же глупо, как если бы я захотел вычислить синус и мне пришлось бы написать:

C++
1
2
Math mth;
x = mth.sin(y);
Нет стойкой ассоциации с объектом. Шифратор.вычислиХешФункцию("in god we trust"), Сортировщик.отсортируйМассив(arr) - все это как-то глупо и неестественно. Вот и спрашивается - как можно сделать элегантно - чтоб и данные с функциями не мешать, и чтоб потом как простые функции вызывать можно было? Есть, конечно, функторы, но объект все равно нужно где-то создать. Еще можно данные вынести в глобальную область - но мне всегда твердили, что глобальные переменные - это зло. Где истина?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2012, 00:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Парадигмы: императивная vs ООП (C++):

Парадигмы программирования - C++
процедурное программирования импиративное ООП все это Парадигмы программирование? если да все это облегчает писать код или дает...

Основы Java освоены, понятия, парадигмы, ООП. Читать код могу, понятия есть, но все бы ничего, что дальше? - Java SE
Доброго времени суток товарищи Столкнулся с такой ситуацией: куда двигаться дальше? Основы Java освоены, понятия, парадигмы, ООП....

Парадигмы программирования - Программирование
Что правильно? "Выделяют три основные парадигмы программирования: процедурное программирование объектно ориентированное...

Парадигмы программирования с# - C#
Добрый день, в поиске литературы и информации парадигмы программирования с#. Толков го ничего не нагуглил. Если кто, что подскажет буду рад.

Парадигмы текстового редактора - C++ Qt
У текстовых редакторов существует 2 парадигмы (может быть слово неправильное и неточное, но ничего другого в голову не пришло) Парадигма...

Лучший язык для распределенной парадигмы - Программирование
Хочу написать пару программ на таком. Какой посоветуете ? (Язык, содержащий специальные конструкции для поддержки распараллеливания...

21
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.12.2012, 16:24 #16
А как зовут поток принтера?
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
19.12.2012, 16:37 #17
Toshkarik, спасибо за исправление. Никогда особо не дружил с плюсовыми потоками :(

Цитата Сообщение от taras atavin Посмотреть сообщение
А как зовут поток принтера?
Эээ... Файл с именем LPT1, PRN или там /dev/pr0? Боюсь, это всё же ОС-специфичная вещь.
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.12.2012, 16:45 #18
Виндузячий дефолтный принтер.
0
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
19.12.2012, 16:54 #19
Цитата Сообщение от taras atavin Посмотреть сообщение
А как зовут поток принтера?
Что тут имеется ввиду под "принтером", и какого рода должно быть название?

Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Никогда особо не дружил с плюсовыми потоками
По большому счету, они мало чем отличаются, основное отличие это, как раз, в объектах класса streambuf и объектах классах производных от него ( filebuf в файловых потоках и stringbuf в строковых потоках ).

Добавлено через 3 минуты
taras atavin, если имеется ввиду физическое устройство принтер, для распечатки текста на бумаге, это это, как и сказал ~OhMyGodSoLong~, платформозависимое API. В самом C++ ничего нет для работы с принтером.
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.12.2012, 16:54 #20
Цитата Сообщение от Toshkarik Посмотреть сообщение
и какого рода должно быть название?
Идентификатор конечно. Что же ещё?
0
nshell32gmail
5 / 5 / 1
Регистрация: 26.11.2012
Сообщений: 19
19.12.2012, 17:07 #21
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
А если потребуется несколько состояний одновременно хранить?
статический массив,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class alg{
private:
const int state_count = 5;
int state[state_count];
public:
void setState(int state, int value)
{
///...
this->state[state] = value; 
///...
}
int getState(int state)
{
///...
return this->state[state];
///...
}
};

или флаги состояний, если состояния булевые.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class abc{
private:
int mask;
public:
abc():mask(0) {}
void setState(int state, bool value)
{
//...
if (value)
mask |= 1<<(state-1);
else
mask -= 1<<(state-1);
//...
}
bool getState(int state)
{
return (mask && (state-1));
}
};
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.12.2012, 17:18 #22
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Истина в том, что объект имеет состояние
имеет, а может и не иметь, вычисление того же синуса разными алгоритмами например, полиморфизм же
0
19.12.2012, 17:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2012, 17:18
Привет! Вот еще темы с ответами:

Не могу понять другие парадигмы программирования. Разобраться на примере - Программирование
Сразу скажу: мне не нужно сравнение, аргументы за или против той или другой парадигмы. Просто хочу понять. Вот такой пример: Работник...

ООП ради ООП - ООП и паттерны
Доброго времени суток! Есть к примеру класс Cat который реализует интерфейс Movable, инкапсулирует цвет, и прочее. Имеет ли смысл...

C++ ООП - C++
Просьба дать какую-нибудь интересную программу, дабы теста на курс ООП. Чтобы не из книжки, а реально придуманная про программистом, или...

ООП - C++
Привет всем, народ дайте какую-нибудь интересную задачку на ООП, (однообразные задачи из учебников достали уже), чтоб она затрагивала как...


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru