Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
3 / 3 / 0
Регистрация: 28.05.2012
Сообщений: 23

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

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

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

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

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

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

C++
1
2
Math mth;
x = mth.sin(y);
Нет стойкой ассоциации с объектом. Шифратор.вычислиХешФункцию("in god we trust"), Сортировщик.отсортируйМассив(arr) - все это как-то глупо и неестественно. Вот и спрашивается - как можно сделать элегантно - чтоб и данные с функциями не мешать, и чтоб потом как простые функции вызывать можно было? Есть, конечно, функторы, но объект все равно нужно где-то создать. Еще можно данные вынести в глобальную область - но мне всегда твердили, что глобальные переменные - это зло. Где истина?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.12.2012, 00:08
Ответы с готовыми решениями:

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

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

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

21
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.12.2012, 00:33
C++
1
2
Math mth;
x = mth.sin(y);
Сделать соответствующие методы статическими в классе
C++
1
x = Math::sin(y);
Добавлено через 1 минуту
Цитата Сообщение от PitMagnum Посмотреть сообщение
конечно, функторы, но объект все равно нужно где-то создать.
Для функтуров зачем ?

Добавлено через 2 минуты
Цитата Сообщение от PitMagnum Посмотреть сообщение
Еще можно данные вынести в глобальную область - но мне всегда твердили, что глобальные переменные - это зло. Где истина?
Собственно зло... если данных много то тут без классов нормально не получится.

Главное в этом всю картину объять и понять что действительно нужно пользователю и как все сгруппировать.
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
19.12.2012, 01:50
Цитата Сообщение от PitMagnum Посмотреть сообщение
Где истина?
Истина в том, что объект имеет состояние. Вычислятор синусов состояния не имеет, он всегда выдаёт один и тот же синус, поэтому вполне может быть просто функцией (чтоб не мешалась, можно засунуть в неймспейс).

С хеш-функцией то же самое. Если это вычислиМнеMD5(), то у неё нет состояния. Если же это объект "вычислитель хеш-функций", то у него есть состояние: текущий алгоритм, по которому он вычисляет хеш-функцию. Но его можно превратить в функцию, которая не имеет состояния, если она будет принимать этот алгоритм как аргумент. Соответственно, можно и наоборот: сделать объект, который будет хранить это состояние у себя, а его метод будет подсовывать это состояние stateless-функции.
0
5 / 5 / 5
Регистрация: 26.11.2012
Сообщений: 19
19.12.2012, 02:11
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Истина в том, что объект имеет состояние. Вычислятор синусов состояния не имеет, он всегда выдаёт один и тот же синус, поэтому вполне может быть просто функцией (чтоб не мешалась, можно засунуть в неймспейс).

С хеш-функцией то же самое. Если это вычислиМнеMD5(), то у неё нет состояния. Если же это объект "вычислитель хеш-функций", то у него есть состояние: текущий алгоритм, по которому он вычисляет хеш-функцию. Но его можно превратить в функцию, которая не имеет состояния, если она будет принимать этот алгоритм как аргумент. Соответственно, можно и наоборот: сделать объект, который будет хранить это состояние у себя, а его метод будет подсовывать это состояние stateless-функции.
Статические методы И статическая переменная, хранящая состояние, не?
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
19.12.2012, 02:30
А если потребуется несколько состояний одновременно хранить?
0
19.12.2012, 03:38

Не по теме:

Императивная парадигма является противоположностью декларативной, но не объектной.

0
3 / 3 / 0
Регистрация: 28.05.2012
Сообщений: 23
19.12.2012, 07:27  [ТС]
Блин, а про статические методы я и не подумал совсем.. спасибо, такая концепция меня вполне устраивает.

Для функтуров зачем ?
ну дык..

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <string>
 
class SimpleFunctor {
    std::string name_;
public:
    SimpleFunctor(const char *name) : name_(name) {}
    void operator()() { std::cout << "Oh, hello, " << name_ << endl; }
};
 
int main() {
    SimpleFunctor sf("catonmat");
    sf();  // выводит "Oh, hello, catonmat"
}
сначала создаем объект, потом пользуемся как функцией.. или вы не об этом?

Императивная парадигма является противоположностью декларативной, но не объектной
я с этим абсолютно согласен, это я в данном контексте поставил vs в заголовке, и то это не совсем корректно, конечно.

~OhMyGodSoLong~, а разве несколько состояний нельзя хранить нельзя хранить в нескольких статических переменных? Ну, естественно, если это две разные категории состояния. Если нужно хранить несколько состояний одной категории, то если я все правильно понял, это возможно только при двух объектах с разными состояниями. Но здесь-то и противоречий в таком случае не возникает - объект сам собой напрашивается.

Меня еще один вопрос интересует - операторы cin и cout являются по сути классовыми объектами. А где они создаются?
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
19.12.2012, 09:11
Цитата Сообщение от PitMagnum Посмотреть сообщение
Меня еще один вопрос интересует - операторы cin и cout являются по сути классовыми объектами. А где они создаются?
Это глобальные константы. Как и все остальные глобальные объекты, они инициализируются в начале выполнения программы перед выполнением кода main().
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
19.12.2012, 15:37
Цитата Сообщение от PitMagnum Посмотреть сообщение
операторы cin и cout
Это не операторы, а объекты классов std::istream и std::ostream.

Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Это глобальные константы.
С чего это они константы?
C++
1
extern istream cin;
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
19.12.2012, 15:45
Попробуй измени их)
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
19.12.2012, 15:49
Цитата Сообщение от Toshkarik Посмотреть сообщение
С чего это они константы?
В смысле неизменяемости привязок имён std::cin и std::cout к объектам, а не неизменяемости состояний этих объектов. Состояния этих объектов стандартных потоков можно изменять, но так как для них не определёно присваивание, то cout нельзя заставить выводить информацию куда-то в другое место.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.12.2012, 15:53
ОО - часть императивной: императивное программирование - это написание текстов, указывающих, что, как и с чем надо сделать, но не что в результате получить, а ООП - это написание текстов, указывающих, что, как и с чем надо сделать + декомпозиция задачи на основе типов данных + объединение подпрограмм с типами данных, ими обрабатываемыми + объединение свойств целого в единую сущность. По самой ОО из этого следует, что ОО - прямой потомок императивной парадигмы.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
19.12.2012, 16:01
Герц, Пожалуйста:
C++
1
cout.fill( '0' );
Добавлено через 2 минуты
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
cout нельзя заставить выводить информацию куда-то в другое место
В любой книге сказано, что по умолчанию cout привязан с монитору, и что это можно изменить. Так же как и cin привязан к клавиатуре, и это тоже можно изменить.
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
19.12.2012, 16:12
Цитата Сообщение от Toshkarik Посмотреть сообщение
В любой книге сказано, что по умолчанию cout привязан с монитору, и что это можно изменить. Так же как и cin привязан к клавиатуре, и это тоже можно изменить.
Продемонстрируйте, пожалуйста, на примере:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <fstream>
 
int main()
{
    std::fstream file("foo", std::fstream::out);
    /* впишите сюда ваш код */
    std::cout << "Bar";
}
// после выполнения в файле foo находится строка "Bar"
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
19.12.2012, 16:21
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <fstream>
 
 
int main() {
   std::fstream file( "out.txt", std::ios::out );
   std::streambuf *bck = std::cout.rdbuf();
    
   std::cout << "Terminal" << std::endl;
 
   std::cout.rdbuf( file.rdbuf());
   
   std::cout << "File" << std::endl;
 
   std::cout.rdbuf( bck );
 
   std::cout << "Terminal 2" << std::endl;
   
   return 0;
}
1
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.12.2012, 16:24
А как зовут поток принтера?
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
19.12.2012, 16:37
Toshkarik, спасибо за исправление. Никогда особо не дружил с плюсовыми потоками :(

Цитата Сообщение от taras atavin Посмотреть сообщение
А как зовут поток принтера?
Эээ... Файл с именем LPT1, PRN или там /dev/pr0? Боюсь, это всё же ОС-специфичная вещь.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.12.2012, 16:45
Виндузячий дефолтный принтер.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
19.12.2012, 16:54
Цитата Сообщение от taras atavin Посмотреть сообщение
А как зовут поток принтера?
Что тут имеется ввиду под "принтером", и какого рода должно быть название?

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

Добавлено через 3 минуты
taras atavin, если имеется ввиду физическое устройство принтер, для распечатки текста на бумаге, это это, как и сказал ~OhMyGodSoLong~, платформозависимое API. В самом C++ ничего нет для работы с принтером.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.12.2012, 16:54
Цитата Сообщение от Toshkarik Посмотреть сообщение
и какого рода должно быть название?
Идентификатор конечно. Что же ещё?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.12.2012, 16:54
Помогаю со студенческими работами здесь

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

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

Какие существуют парадигмы программирования?
Какие существуют парадигмы программирования и в чем их особенности? функциональное, модульное, ООП...... Подскажите где можно на счет...

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

Профессиональный рост и смена парадигмы проф. ориентации
Всем привет Хочу в этой теме затронуть такой казалось бы избитый вопрос как &quot;образование для IT специалиста&quot;, карьерный рост и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru