Hello, All!
Допустим у меня есть класс DataStorage. Он хранит в себе какие-нибудь данные. Пользователь может изменять данные, которые хранятся в этом классе. На мой взгляд, наиболее удобный вариант — это сделать открытую функцию класса, которая бы показывала диалог с данными а затем сохраняла все измнения, сделанные пользователем и проверяла их на корректность. Этот вариант удобен тем, что мы не предоставляем возможности измнения данных через открытые функции.
Но всё-равно гложут сомнения. В этом случае перемешиваются логика и интерфейс. Каким образом разрешается такая ситуация?
---
СНП Артёмов Денис. E-mail: artden(на)ufacom(точка)ru
Posted via RSDN NNTP Server 1.9 beta
Здравствуйте, ArtDenis, Вы писали:
AD>Hello, All!
AD>Допустим у меня есть класс DataStorage. Он хранит в себе какие-нибудь данные. Пользователь может изменять данные, которые хранятся в этом классе. На мой взгляд, наиболее удобный вариант — это сделать открытую функцию класса, которая бы показывала диалог с данными а затем сохраняла все измнения, сделанные пользователем и проверяла их на корректность. Этот вариант удобен тем, что мы не предоставляем возможности измнения данных через открытые функции.
AD>Но всё-равно гложут сомнения. В этом случае перемешиваются логика и интерфейс. Каким образом разрешается такая ситуация?
Как вариант — две функции —
CheckState CheckData (values)
InputData(values)
где CheckState — это состояние, в котором может быть проверка результатов. В самом банальном случае — перечисление.
enum CheckState
{
BadAdress,
BadName
}
... << RSDN@Home 1.1.4 @@subversion >>
Здравствуйте, Andy, Вы писали:
AP> Как вариант — две функции —
...
Что-то я не совсем понял ответ. Вопрос был такой: должен ли класс сам показывать диалог, для того, чтобы пользователь мог изменить данные, хранящиеся в этом классе. Или же нужно предусмотреть открытый интерфейс (набор функций) для измнения данных класса. Во втором случае класс отвечает только за хранение данных и внутренние операции с ними. Значения класса изменяются извне (из другого класса, который показывает диалог, а затем заносит данные в класс).
PS: класс о котором идёт речь — не библиотечный. Это законченный класс, не предназначенный для наследования.
Posted via RSDN NNTP Server 1.9 beta
Здравствуйте, ArtDenis, Вы писали:
AD>Здравствуйте, Andy, Вы писали:
AD>Что-то я не совсем понял ответ.
Я хотел удалить свой прошлый ответ, но из оффлайн клиента это не удалось. А пароль не помню.
AD>Вопрос был такой: должен ли класс сам показывать диалог, для того, чтобы пользователь мог изменить данные, хранящиеся в этом классе. Или же нужно предусмотреть открытый интерфейс (набор функций) для измнения данных класса. Во втором случае класс отвечает только за хранение данных и внутренние операции с ними. Значения класса изменяются извне (из другого класса, который показывает диалог, а затем заносит данные в класс).
Класс не должен показывать диалог для того, чтобы изменять свои данные. Этим нарушается принцип высокого зацепления
Класс предоставляет наружу интерфейс для изменения своих данных и проверки _вводимых_ данных на корректность (или же вводится отдельный класс, который проверяет достоверность устанавливаемых данных).
Из оригинального сообщения
На мой взгляд, наиболее удобный вариант — это сделать открытую функцию класса, которая бы показывала диалог с данными а затем сохраняла все измнения, сделанные пользователем и проверяла их на корректность
Вот в этом месте надо разбить эту открытую функцию класса на две —
1) проверка корректности
2) ввод данных (и сохранение изменений)
Следовательно вид, от которого приходят вводимые данные, может просто узнать корректны ли они без всяких сохранений.
А вставка будет производиться только тогда, когда все проверки прошли успешно
AD>PS: класс о котором идёт речь — не библиотечный. Это законченный класс, не предназначенный для наследования.... << RSDN@Home 1.1.4 @@subversion >>
Здравствуйте, ArtDenis, Вы писали:
AD>Hello, All!
AD>Допустим у меня есть класс DataStorage. Он хранит в себе какие-нибудь данные. Пользователь может изменять данные, которые хранятся в этом классе. На мой взгляд, наиболее удобный вариант — это сделать открытую функцию класса, которая бы показывала диалог с данными а затем сохраняла все измнения, сделанные пользователем и проверяла их на корректность. Этот вариант удобен тем, что мы не предоставляем возможности измнения данных через открытые функции.
AD>Но всё-равно гложут сомнения. В этом случае перемешиваются логика и интерфейс. Каким образом разрешается такая ситуация?
Как-нибудь так можно, наверное.
class DataStorage{
friend class DataStorage_View;
..
VALIDATING_RESULT Validate();
};
class DataStorage_View
{
private:
DateStorage *pData;
public:
DataStorage_Edit(DataStorage *p_Data){pData = p_Data;};
EDITING_RESULT Edit(); // работаем, НАПРИМЕР, с копией данных
// По окончании редактирования вызываем pEditingData->Validate() и если не все ОК - откатываем
// , иначе - подтверждаем изменения в pData: *pData = *pEditingData;
};
... << RSDN@Home 1.1.3 stable >>
Пардон, вкралась очепятка..
class DataStorage_View
{
..
DataStorage_View(DataStorage *p_Data){pData = p_Data;};
..
... << RSDN@Home 1.1.3 stable >>