Восстановление исходного значения поля после ошибки валидации
От: zelenprog  
Дата: 06.10.23 09:48
Оценка:
Добрый день!

Нужно выполнить следующие действия:

1) На форме отображаются некоторые данные (например реквизиты организации)
2) Пользователь вводит данные в поле формы и нажимает Enter
3) Введенные в поле данные (а также идентификатор поля) передаются в модуль Бизнес-логики
4) Бизнес-логика проверяет может ли это поле содержать введенные данные с учетом текущего "состояния" ("окружения").
Например, телефон организации должен содержать код страны, которая указана в адресе этой организации.
5) Если проверка удовлетворительная, то создается Бизнес-сущность и записывается в БД.
6) Если проверка ошибочная, то в поле должно быть восстановлено исходное значение.

// вариант 1
class MainForm {
  
  TTextField mTelefonTextField;
  
  private void OnButtonClicked() 
  {
      lBusinessLogic = new TBusinessLogic;
      lResult = lBusinessLogic.SaveTelefon(lOrganizationID, mTelefonTextField);

      if (lResult != OK)
         mTelefonTextField = ??? восстановить значение
  }
}

// вариант 2
class MainForm {
  
  TTextField mTelefonTextField;
  
  private void OnButtonClicked() 
  {
      try
      {
         // в конструкторе произойдет исключение, если валидация будет неуспешная
         lOrganizationTelefon = new TOrganizationTelefon (lOrganizationID, mTelefonTextField);
         
         lRepository = new TRepository();
         lRepository.Save(lOrganizationTelefon);
      }
      catch()
      {
         mTelefonTextField = ??? восстановить значение
      }
  }
}


Первый вопрос: какой вариант кода валидации правильный?

Второй вопрос: как восстановить исходное значение? откуда его получить?

По идее, мы дожны прочитать из БД то значение, которое должно появиться в поле после ошибочной валидации.
Так как именно в базе хранится "правильное" значение. Верно?
Но это ведь непроизводительно, каждый раз после такой "мелочи" дергать базу.
Re: Восстановление исходного значения поля после ошибки валидации
От: BlackEric http://black-eric.lj.ru
Дата: 06.10.23 14:35
Оценка:
Здравствуйте, zelenprog, Вы писали:

Z>Второй вопрос: как восстановить исходное значение? откуда его получить?


Z>По идее, мы дожны прочитать из БД то значение, которое должно появиться в поле после ошибочной валидации.

Z>Так как именно в базе хранится "правильное" значение. Верно?
Z>Но это ведь непроизводительно, каждый раз после такой "мелочи" дергать базу.

В смысле то значение, которое было до исправления пользователем? Если не хотите ходить в бд, то сделайте локальный кеш. Но я бы в случае ошибки валидации оставил в поле то, что ввел юзер и отдельно показал сообщение об ошибке. Т.к. юзер скорее всего захочет его поправить и сохранить еще раз.
https://github.com/BlackEric001
Re[2]: Восстановление исходного значения поля после ошибки валидации
От: zelenprog  
Дата: 07.10.23 14:48
Оценка:
BE> В смысле то значение, которое было до исправления пользователем?

Да, надо восстановить значение, которое было до исправления пользователем.

BE> Если не хотите ходить в бд, то сделайте локальный кеш.


Я не то чтобы не хочу ходить в базу.
Я хочу разобраться как сделать лучше. Как это обычно делается в "серьезных" программах?

BE> Но я бы в случае ошибки валидации оставил в поле то, что ввел юзер и отдельно показал сообщение об ошибке. Т.к. юзер скорее всего захочет его поправить и сохранить еще раз.


Вообще согласен. Но в данной конкртеной ситуации, нужно именно восстановить значение.
Re[3]: Восстановление исходного значения поля после ошибки валидации
От: samius Япония http://sams-tricks.blogspot.com
Дата: 07.10.23 17:17
Оценка:
Здравствуйте, zelenprog, Вы писали:

Z>Да, надо восстановить значение, которое было до исправления пользователем.


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

BE>> Если не хотите ходить в бд, то сделайте локальный кеш.


Z>Я не то чтобы не хочу ходить в базу.

Z>Я хочу разобраться как сделать лучше. Как это обычно делается в "серьезных" программах?
В базу имеет смысл ходить тогда, когда кто-то сохранил в базе то, что было до исправления пользователем. Если нет — то там вполне может быть уже другое значение, которое ввел либо другой пользователь, либо этот же пользователь, но в другом окне/компе и т.п.
А вообще не помню серьезных программ, которые бы занимались чем-то подобным.

BE>> Но я бы в случае ошибки валидации оставил в поле то, что ввел юзер и отдельно показал сообщение об ошибке. Т.к. юзер скорее всего захочет его поправить и сохранить еще раз.


Z>Вообще согласен. Но в данной конкртеной ситуации, нужно именно восстановить значение.

Так все-таки, то, что было до исправления, или то, что на текущий момент в базе имеет актуальное значение? Это могут быть разные величины.

Допустим, я взялся менять телефон. На одном компе накосячил и бросил, на другом компе поменял. Потом вернулся к первому. Какое значение я увижу и откуда оно должно взяться? Из базы (введенное с другого компа), или то, что было до первой попытки редактирования, то есть не актуальное на текущий момент?
Re: Восстановление исходного значения поля после ошибки валидации
От: Разраб  
Дата: 08.10.23 04:47
Оценка:
Здравствуйте, zelenprog, Вы писали:


Z>// вариант 2

Z>class MainForm {

Z> TTextField mTelefonTextField;


Z> private void OnButtonClicked()

Z> {
Z> try
Z> {
Z> // в конструкторе произойдет исключение, если валидация будет неуспешная
Z> lOrganizationTelefon = new TOrganizationTelefon (lOrganizationID, mTelefonTextField);

Z> lRepository = new TRepository();

Z> lRepository.Save(lOrganizationTelefon);
Z> }
Z> catch()
Z> {
Z> mTelefonTextField = ??? восстановить значение
Z> }
Z> }
Z>}
Z>[/code]

Z>Первый вопрос: какой вариант кода валидации правильный?

второй.

Z>Второй вопрос: как восстановить исходное значение? откуда его получить?


Z>Но это ведь непроизводительно, каждый раз после такой "мелочи" дергать базу.

не хочешь лазить в базу(хотя это источник истины), сохраняй старое значение перед редактированием.
☭ ✊ В мире нет ничего, кроме движущейся материи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.