Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
SaweR
29 / 29 / 1
Регистрация: 29.09.2009
Сообщений: 177
#1

Является ли правильным проектирование классов с методами у которых есть определённый порядок вызова - C++

24.07.2014, 19:25. Просмотров 358. Ответов 6
Метки нет (Все метки)

Всем привет. Вопрос к опытным программистам: Является ли в С++ практике правильным проектирование классов с методами у которых есть определённый порядок вызова и однократность в использовании?
Примеры:
1) класс соединения с методом Open() который можно вызвать один раз
2) класс с методом SendQuery() который можно выполнить только один раз так как в нём происходит выделение памяти
3) класс с методом ReadLine() который можно вызвать после другого метода иначе произойдёт исключение
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2014, 19:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Является ли правильным проектирование классов с методами у которых есть определённый порядок вызова (C++):

Реализация отношения классов типа двунаправленная ассоциация, UML, порядок объявления классов, неполный класс - C++
Доброго времени суток! Осваивая UML, решил реализовать отношение двунаправленной ассоциации по диаграмме: У одного владельца...

Определить является ли лабиринт правильным - C++
карта представляет собой лабиринт 1=стена, 0=проход карта представляет собой лабиринт надо определить является ли лабиринт правильным ...

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

Как скопировать с диска все файлы, в которых есть определённый текст, в одну папку? - CMD/BAT
А как скопировать все файлы на диске в которых есть определенный текст в одну папку ?

Вычислить определённый интеграл, разными методами - Численные методы
используя квадратные формулы прямоугольников, трапеций и парабол (Симпсона)(n=6) \int_{1}^{4}({x}^{3}-\sqrt{x})dx

является ли рассуждение правильным - Логика и множества
Парни, подскажите пожалуйста: Выяснить, является ли рассуждение правильным: Если Антон ляжет сегодня поздно, то утром он будет в...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Martein
Оператор ЭВМ 6 разряда
673 / 84 / 13
Регистрация: 22.06.2014
Сообщений: 174
24.07.2014, 19:33 #2
Мне кажется, что вы описали характеристики конструктора класса, соответственно всё это дело должно быть инкапсулировано в конструктор или в метод init(), который вызывается один раз в начале использования класса.

Добавлено через 3 минуты
Цитата Сообщение от SaweR Посмотреть сообщение
в нём происходит выделение памяти
Типичный конструктор, не?
0x10
2460 / 1632 / 238
Регистрация: 24.11.2012
Сообщений: 4,015
24.07.2014, 19:37 #3
В общем случае если класс предполагает определенный порядок вызова методов - это архитектурная ошибка.
С другой стороны, если класс представляет собой абстракцию вроде конечной точки для потока данных (файл, сокет, ...) то мне вполне очевидно, что нельзя получить данные если не удалось открыть поток.

Если хочется - можно, конечно, нагродить абстракций. Например, класс File умеет только открывать файл, закрывать его и получать какие-нибудь метаданные. Другой класс - Reader в конструкторе принимает объект типа File и, елси фай доступен для чтения, читатель создается. Иначе - в конструкторе бросается исключение. Нет читателя - невозмжоно вызвать методы типа Read.

Но это не гарантирует, что соединение с потоком не будет прервано, поэтому метод Read все еще может сообщать об ошибках. Поэтому гордить иерархию смысла не вижу.
SaweR
29 / 29 / 1
Регистрация: 29.09.2009
Сообщений: 177
24.07.2014, 20:01  [ТС] #4
Цитата Сообщение от Martein Посмотреть сообщение
Типичный конструктор, не?
Да, но SendQuery() ещё возвращает bool которое показывает выделена память или нет.

Добавлено через 3 минуты
Цитата Сообщение от 0x10 Посмотреть сообщение
В общем случае если класс предполагает определенный порядок вызова методов - это архитектурная ошибка.
Но на такой архитектуре работают классы MySql: там нельзя вызвать ExecuteReader()/Read() если не вызвал Open() и ещё Open() нельзя вызвать 2 раза подряд (хотя может быть нужно чередовать вызов Open()/Close()

Добавлено через 13 минут
Martein, тогда выйдет вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
MySqlReader::MySqlReader(String^ Settings, String^ Query)
{
    Connection = gcnew MySqlConnection(Settings);
    try
    {
        Connection->Open();
        auto SqlCommand = gcnew MySqlCommand(Query, Connection);
        DataReader = SqlCommand->ExecuteReader(); // выделена память или нет ещё нужно узнать
        delete SqlCommand;
    }
    catch(MySqlException^ e)
    {
        Console::WriteLine(e->Message);
    }
}
0x10
2460 / 1632 / 238
Регистрация: 24.11.2012
Сообщений: 4,015
24.07.2014, 20:02 #5
Цитата Сообщение от SaweR Посмотреть сообщение
Но на такой архитектуре работают классы MySql
Попадает под случай, о котором я написал ниже по тексту.
Voivoid
674 / 277 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
24.07.2014, 20:29 #6
Цитата Сообщение от SaweR Посмотреть сообщение
Является ли в С++ практике правильным проектирование классов с методами у которых есть определённый порядок вызова и однократность в использовании
В общем случае нет, но стоит опасаться нарушения SRP ( Single responsibility principle )
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.07.2014, 12:15 #7
Цитата Сообщение от SaweR Посмотреть сообщение
Но на такой архитектуре работают классы MySql
на такой архитектуре работают классы ADO.NET, а то что вы показали лишь MySql реализация

Цитата Сообщение от SaweR Посмотреть сообщение
Но на такой архитектуре работают классы MySql: там нельзя вызвать ExecuteReader()/Read() если не вызвал Open() и ещё Open() нельзя вызвать 2 раза подряд (хотя может быть нужно чередовать вызов Open()/Close()
ничего что методы вызываются для разных сущностей?

Добавлено через 4 минуты
да и этот ваш пример "низкоуровневый".
не хотите открывать конекшн, закрывать ридер - DataAdapter вам в руки или ORM.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2014, 12:15
Привет! Вот еще темы с ответами:

Является ли правильным следующее определение? - Логика и множества
Является ли правильным следующее определение? Если определение неправильное, то какая ошибка допущена? «Человек - это...

Является ли строка правильным e-mail - адресом - Ruby
Добрый день. Есть кодstring = "123-451-38 56/16/23 my@mail.ru(34) 16.апреля.2015" regex = /(?:)+@(?:)*(?:\.{2,4})+/ ...

Проверить является ли скобочное выражение правильным - C++
Является ли выражения вида ()()()()()())))()( правильным, на вход подается символы '(' и ')' в любой последовательности.

Является ли заданная строка правильным IP-адресом - C++
В сети интернет каждому компьютеру присваивается четырехбайтовый код, который принято записывать в виде четырех чисел, каждое из которых...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.07.2014, 12:15
Ответ Создать тему
Опции темы

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