Измнение данные пользователем
От: ArtDenis Россия  
Дата: 24.08.04 08:09
Оценка:
Hello, All!

Допустим у меня есть класс DataStorage. Он хранит в себе какие-нибудь данные. Пользователь может изменять данные, которые хранятся в этом классе. На мой взгляд, наиболее удобный вариант — это сделать открытую функцию класса, которая бы показывала диалог с данными а затем сохраняла все измнения, сделанные пользователем и проверяла их на корректность. Этот вариант удобен тем, что мы не предоставляем возможности измнения данных через открытые функции.

Но всё-равно гложут сомнения. В этом случае перемешиваются логика и интерфейс. Каким образом разрешается такая ситуация?

---
СНП Артёмов Денис. E-mail: artden(на)ufacom(точка)ru
Posted via RSDN NNTP Server 1.9 beta
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: Измнение данные пользователем
От: Andy Panda США  
Дата: 24.08.04 09:34
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Hello, All!


AD>Допустим у меня есть класс DataStorage. Он хранит в себе какие-нибудь данные. Пользователь может изменять данные, которые хранятся в этом классе. На мой взгляд, наиболее удобный вариант — это сделать открытую функцию класса, которая бы показывала диалог с данными а затем сохраняла все измнения, сделанные пользователем и проверяла их на корректность. Этот вариант удобен тем, что мы не предоставляем возможности измнения данных через открытые функции.


AD>Но всё-равно гложут сомнения. В этом случае перемешиваются логика и интерфейс. Каким образом разрешается такая ситуация?


Как вариант — две функции —
     CheckState CheckData (values)
     InputData(values)


где CheckState — это состояние, в котором может быть проверка результатов. В самом банальном случае — перечисление.

    enum     CheckState 
    {
        BadAdress,
        BadName
    }
... << RSDN@Home 1.1.4 @@subversion >>
Re[2]: Измнение данные пользователем
От: ArtDenis Россия  
Дата: 24.08.04 09:59
Оценка:
Здравствуйте, Andy, Вы писали:

AP> Как вариант — две функции —

...

Что-то я не совсем понял ответ. Вопрос был такой: должен ли класс сам показывать диалог, для того, чтобы пользователь мог изменить данные, хранящиеся в этом классе. Или же нужно предусмотреть открытый интерфейс (набор функций) для измнения данных класса. Во втором случае класс отвечает только за хранение данных и внутренние операции с ними. Значения класса изменяются извне (из другого класса, который показывает диалог, а затем заносит данные в класс).

PS: класс о котором идёт речь — не библиотечный. Это законченный класс, не предназначенный для наследования.
Posted via RSDN NNTP Server 1.9 beta
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[3]: Измнение данные пользователем
От: Andy Panda США  
Дата: 24.08.04 10:50
Оценка: 9 (1)
Здравствуйте, ArtDenis, Вы писали:

AD>Здравствуйте, Andy, Вы писали:


AD>Что-то я не совсем понял ответ.

Я хотел удалить свой прошлый ответ, но из оффлайн клиента это не удалось. А пароль не помню.

AD>Вопрос был такой: должен ли класс сам показывать диалог, для того, чтобы пользователь мог изменить данные, хранящиеся в этом классе. Или же нужно предусмотреть открытый интерфейс (набор функций) для измнения данных класса. Во втором случае класс отвечает только за хранение данных и внутренние операции с ними. Значения класса изменяются извне (из другого класса, который показывает диалог, а затем заносит данные в класс).

Класс не должен показывать диалог для того, чтобы изменять свои данные. Этим нарушается принцип высокого зацепления

Класс предоставляет наружу интерфейс для изменения своих данных и проверки _вводимых_ данных на корректность (или же вводится отдельный класс, который проверяет достоверность устанавливаемых данных).

Из оригинального сообщения

На мой взгляд, наиболее удобный вариант — это сделать открытую функцию класса, которая бы показывала диалог с данными а затем сохраняла все измнения, сделанные пользователем и проверяла их на корректность

Вот в этом месте надо разбить эту открытую функцию класса на две —
1) проверка корректности
2) ввод данных (и сохранение изменений)

Следовательно вид, от которого приходят вводимые данные, может просто узнать корректны ли они без всяких сохранений.
А вставка будет производиться только тогда, когда все проверки прошли успешно
AD>PS: класс о котором идёт речь — не библиотечный. Это законченный класс, не предназначенный для наследования.
... << RSDN@Home 1.1.4 @@subversion >>
Re: Измнение данные пользователем
От: g_i  
Дата: 24.08.04 11:36
Оценка:
Здравствуйте, 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 >>
Re[2]: Измнение данные пользователем
От: g_i  
Дата: 24.08.04 11:40
Оценка:
Пардон, вкралась очепятка..
class DataStorage_View
{
..
                 DataStorage_View(DataStorage *p_Data){pData = p_Data;};
..
... << RSDN@Home 1.1.3 stable >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.