25 / 25 / 11
Регистрация: 15.10.2013
Сообщений: 878
1

ООП-программирование (размышление)

10.08.2016, 01:09. Показов 564. Ответов 5
Метки oop, qt (Все метки)

Помогите разобраться с несколькими вопросами по принципам ООП-программирования:

1. Есть 2 класса, унаследованных от QAbstractItemModel. В них определены методы для загрузки и сохранения данных в файл (с помощью класса QDataStream). Например:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void tgTableModel::Load(QString &path)
{
    QFile file(path);
    if(file.open(QIODevice::ReadOnly))
    {
        beginResetModel();
        m_ptargetList->clear();
 
        QDataStream in(&file);
        in.setVersion(QDataStream::Qt_5_7);
        in >> *m_ptargetList;
        file.close();
        endResetModel();
    }
}
 
void tgTableModel::Save(QString &path)
{
    QFile file(path);
    if(file.open(QIODevice::WriteOnly))
    {
        QDataStream out(&file);
        out.setVersion(QDataStream::Qt_5_7);
        out << *m_ptargetList;
        file.close();
    }
}


Вроде бы все логично (мне так кажется). Но тут мне начал объяснять знакомый (который также только учится программированию), что класс должен предназначаться только для одной задачи. То есть, для задачи загрузки и сохранения данных, нужно определить отдельный класс. Нужен совет понимающих людей, как делать правильно.
Так же было бы не плохо, почитать книгу об принципах ООП, посоветуйте какую.

2. Вот я пишу программу органайзер (ну или подобие на него), где можно записывать: глобальные цели и ежедневные задачи. Ничего подобного (настолько объемного для себя) раньше не писал, и c Qt познакомился месяц+ назад. Всего вышло 9 классов (переопределение моделей, делегатов и классы диалоговых окон) и несколько файлов с нужными структурами. Но при этом, я НЕ использовал ни одного паттерна проектирования. Потому, что я плохо с ними ознакомлен (следовательно не знаю где какой применять) или действительно бывают ситуации где они не нужны? Я слышал, что любое приложение начинается с написания Абстрактной фабрики.
Посоветуйте, что нибудь по этой теме. На какие паттерны стоить обратить внимание прежде всего?


3. Для хранения данных под две табличные модели, я использую бинарные файлы (сохранение через QDataStream). Это допустимо? Или так никто не делает и все используют SQL?


п.с. Заранее спасибо за уделенное время и ответы. Надеюсь на вашу помощь=)
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.08.2016, 01:09
Ответы с готовыми решениями:

ООП программирование на C#
Всем привет! хочу спросить мнение опытных людей по ООП! Я решил написать симулятор...

объектно ориентированное программирование(ооп)
Написать программу, использующую данные и методы объекта &quot;товар&quot;: поля, наименование , количество,...

Объектно-ориентированное программирование (ООП)
Разработать программу на основе классов для определения одномерных массивов строк фиксированной...

Чем отличается логическое программирование от ООП?
Прошу прощения за дилетантский вопрос, я не знаком с логическим программированием, только лишь...

5
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,020
10.08.2016, 10:45 2
1. andreyananas,
Цитата Сообщение от andreyananas Посмотреть сообщение
То есть, для задачи загрузки и сохранения данных, нужно определить отдельный класс.
Бред. Мало того, что такого ограничения в ООП нет, так еще логически разбивать эти функции на разные классы выглядит коряво.
2. Использование паттернов проектирования не обязательно. Но если хочешь их использовать, то лучше сначала изучить их хорошенько, иначе можешь добавить себе лишний гемморой неправильно их используя или используя там, где не нужно.
3. Хранение данных это твой личный выбор. Вопрос в удобстве и в объеме данных. Если данных не много и тебе их удобно хранить в бинарном файле, то ради бога. Но если объем данных очень большой, они структурированы и тебе нужно выбирать их частями, то тебе придется либо писать какой то сильно умный обработчик либо скорость работы с данными у тебя очень сильно упадет. И вот для таких вещей давно придумали SQL и СУБД, а если есть готовое решение, зачем изобретать колесо...

Добавлено через 4 часа 56 минут
andreyananas, Для примера кстати можно посмотреть класс QSqlTableModel, в который передаешь объект базы данных и модель сама делает выборки из базы.
Конечно бывают случаи когда непосредственная работа с данными трудоемка или имеет какую то особую логику. Вот тогда может быть удобно выделить ее в отдельный класс.
1
15104 / 8106 / 1956
Регистрация: 30.01.2014
Сообщений: 13,771
10.08.2016, 14:19 3
Цитата Сообщение от andreyananas Посмотреть сообщение
для задачи загрузки и сохранения данных, нужно определить отдельный класс.
Он в твоем случае уже определен - называется QDataStream. Вот и используй его:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void tgTableModel::Load(QDataStream &in)
{
        beginResetModel();
        m_ptargetList->clear();
        in.setVersion(QDataStream::Qt_5_7);
        in >> *m_ptargetList;
        endResetModel();
}
 
void tgTableModel::Save(QDataStream & out) const
{
        out.setVersion(QDataStream::Qt_5_7);
        out << *m_ptargetList;
}
Далее можно сделать функцию:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
bool saveToFile(tgTableModel const & model, QString const & path)
{
    QFile file(path);
    bool status = file.open(QIODevice::WriteOnly);
    if(status)
    {
        QDataStream out(&file);
        model.Save(out);
    }
    return status;
}
И получишь ту самую декомпозицию, про которую ты пишешь. Если нужно будет изменить контейнер для сохранения\загрузки данных, например впилить в программу поддержку drag-n-drop, то тебе не нужно будет переписывать кишки tgTableModel, а просто сменить контейнер в DataStream.

По ООП читай Бертрана Мейера и Гради Буча.

 Комментарий модератора 
С++\Qt код оформляется с помощью тега CPPQT.
1
25 / 25 / 11
Регистрация: 15.10.2013
Сообщений: 878
10.08.2016, 22:52  [ТС] 4
Было бы неплохо почитать еще какие то мысли =)
0
15104 / 8106 / 1956
Регистрация: 30.01.2014
Сообщений: 13,771
11.08.2016, 00:13 5
Цитата Сообщение от andreyananas Посмотреть сообщение
Потому, что я плохо с ними ознакомлен (следовательно не знаю где какой применять) или действительно бывают ситуации где они не нужны?
Паттерны - это всего лишь оформленные стратегии реализаций типовых задач. Это не какие-то обязательные атрибуты, но скорее всего в любом приложении многие типовые задачи присутствуют: сделаны ли они в соответствии с этой описанной стратегией или навелосипедированы через пятую точку.
Поэтому к паттернам следует относиться как к инструменту-шпаргалке, которая используется при появлении типовой задачи на горизонте, чтобы взять готовое решение и сделать непротиворечивую реализацию. Паттерны, они же шаблоны проектирования, поэтому так и называются.
Многие паттерны навязываются самой Qt, например, повсеместно применяется MV(C). Делегаты - это тоже паттерн. Фабрики - также присутствуют в Qt. Поэтому на начальном этапе наверное стоит лучше изучить что дает само окружение Qt; как это реализовано и как работает. Это даст неплохой толчок в понимании архитектуры ООП приложений.
1
92 / 92 / 33
Регистрация: 17.03.2012
Сообщений: 536
11.08.2016, 09:58 6
Есть еще книжечка Влиссидеса небольшая, по паттернам проектирования.
Но думаю, сначала надо ознакомиться с ООП, желательно, с огромным количеством примеров.
В том же Влиссидесе есть такая фраза, что самое сложное в ООП - это разделить задачу на объекты. Для меня это так, пожалуй.
Цитата Сообщение от DrOffset Посмотреть сообщение
Поэтому на начальном этапе наверное стоит лучше изучить что дает само окружение Qt; как это реализовано и как работает. Это даст неплохой толчок в понимании архитектуры ООП приложений.
Толчок определенно даст, если реализовывать задачи средствами Qt, соглашусь, но будет ли интересно смотреть исходники (если вы об этом)?
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.08.2016, 09:58

Программирование ООП=)Друзья .просмотрите код! IDE-C++bUIDER
И так друзья пытаюсь све старое консольное приложение переделпть в оконное, но увы ничего не...

ООП. объектно ориентированное программирование в составление модулей программного кода
Здравствуйте! Тема для опытных программистов, которые писали и пишут большие программные проекты! ...

Что лучше читать Программирование: принципы и практика - Страуструпа или ООП в С++ - Лафоре
Вот хочу научиться программировать, пошел я в библиотеку и взял две книги по программированию на...

Еще одно размышление о string из STL
Если строки в STL по стандарту могут совместно использовать дин и тот же участок памяти (а это...


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

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

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