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

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

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

Порядок вызова конструкторов при множественном наследовании C++
C++ Порядок вызова конструкторов
C++ Порядок вызова конструкторов/деструкторов
C++ Проверить является ли скобочное выражение правильным
C++ Определить является ли лабиринт правильным
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Martein
Оператор ЭВМ 6 разряда
 Аватар для Martein
656 / 67 / 12
Регистрация: 22.06.2014
Сообщений: 145
24.07.2014, 19:33     Является ли правильным проектирование классов с методами у которых есть определённый порядок вызова #2
Мне кажется, что вы описали характеристики конструктора класса, соответственно всё это дело должно быть инкапсулировано в конструктор или в метод init(), который вызывается один раз в начале использования класса.

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

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

Но это не гарантирует, что соединение с потоком не будет прервано, поэтому метод Read все еще может сообщать об ошибках. Поэтому гордить иерархию смысла не вижу.
SaweR
 Аватар для 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
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
24.07.2014, 20:02     Является ли правильным проектирование классов с методами у которых есть определённый порядок вызова #5
Цитата Сообщение от SaweR Посмотреть сообщение
Но на такой архитектуре работают классы MySql
Попадает под случай, о котором я написал ниже по тексту.
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,284
24.07.2014, 20:29     Является ли правильным проектирование классов с методами у которых есть определённый порядок вызова #6
Цитата Сообщение от SaweR Посмотреть сообщение
Является ли в С++ практике правильным проектирование классов с методами у которых есть определённый порядок вызова и однократность в использовании
В общем случае нет, но стоит опасаться нарушения SRP ( Single responsibility principle )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2014, 12:15     Является ли правильным проектирование классов с методами у которых есть определённый порядок вызова
Еще ссылки по теме:

C++ Реализация отношения классов типа двунаправленная ассоциация, UML, порядок объявления классов, неполный класс
Определить является ли лабиринт правильным. C++
C++ Как проверить, является ли строка правильным идентификатором?

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

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 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.
Yandex
Объявления
25.07.2014, 12:15     Является ли правильным проектирование классов с методами у которых есть определённый порядок вызова
Ответ Создать тему
Опции темы

Текущее время: 16:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru