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: Восстановление исходного значения поля после ошибки валидации
Здравствуйте, zelenprog, Вы писали:
Z>Второй вопрос: как восстановить исходное значение? откуда его получить?
Z>По идее, мы дожны прочитать из БД то значение, которое должно появиться в поле после ошибочной валидации. Z>Так как именно в базе хранится "правильное" значение. Верно? Z>Но это ведь непроизводительно, каждый раз после такой "мелочи" дергать базу.
В смысле то значение, которое было до исправления пользователем? Если не хотите ходить в бд, то сделайте локальный кеш. Но я бы в случае ошибки валидации оставил в поле то, что ввел юзер и отдельно показал сообщение об ошибке. Т.к. юзер скорее всего захочет его поправить и сохранить еще раз.
BE> В смысле то значение, которое было до исправления пользователем?
Да, надо восстановить значение, которое было до исправления пользователем.
BE> Если не хотите ходить в бд, то сделайте локальный кеш.
Я не то чтобы не хочу ходить в базу.
Я хочу разобраться как сделать лучше. Как это обычно делается в "серьезных" программах?
BE> Но я бы в случае ошибки валидации оставил в поле то, что ввел юзер и отдельно показал сообщение об ошибке. Т.к. юзер скорее всего захочет его поправить и сохранить еще раз.
Вообще согласен. Но в данной конкртеной ситуации, нужно именно восстановить значение.
Re[3]: Восстановление исходного значения поля после ошибки валидации
Здравствуйте, zelenprog, Вы писали:
Z>Да, надо восстановить значение, которое было до исправления пользователем.
Что бы восстановить значение, которое было до исправления, нужно его запомнить до исправления.
BE>> Если не хотите ходить в бд, то сделайте локальный кеш.
Z>Я не то чтобы не хочу ходить в базу. Z>Я хочу разобраться как сделать лучше. Как это обычно делается в "серьезных" программах?
В базу имеет смысл ходить тогда, когда кто-то сохранил в базе то, что было до исправления пользователем. Если нет — то там вполне может быть уже другое значение, которое ввел либо другой пользователь, либо этот же пользователь, но в другом окне/компе и т.п.
А вообще не помню серьезных программ, которые бы занимались чем-то подобным.
BE>> Но я бы в случае ошибки валидации оставил в поле то, что ввел юзер и отдельно показал сообщение об ошибке. Т.к. юзер скорее всего захочет его поправить и сохранить еще раз.
Z>Вообще согласен. Но в данной конкртеной ситуации, нужно именно восстановить значение.
Так все-таки, то, что было до исправления, или то, что на текущий момент в базе имеет актуальное значение? Это могут быть разные величины.
Допустим, я взялся менять телефон. На одном компе накосячил и бросил, на другом компе поменял. Потом вернулся к первому. Какое значение я увижу и откуда оно должно взяться? Из базы (введенное с другого компа), или то, что было до первой попытки редактирования, то есть не актуальное на текущий момент?
Re: Восстановление исходного значения поля после ошибки валидации
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>Но это ведь непроизводительно, каждый раз после такой "мелочи" дергать базу.
не хочешь лазить в базу(хотя это источник истины), сохраняй старое значение перед редактированием.