.Validate(x => x.Length > 0, GetText(«Empty Field»)) //Собственно достать конкретное сообщение для текущей культуры
С выносом текстов проблемм нет, все эти проверки появляются в конечном продукте.
можно вместо текста ошибки возвращать некоторый строковой код, главное чтобы в программе были определены методы, которые ошибку будут обрабатывать
Эти методы будут вызываться в делегатах (ActiononSuccess, ActiononFailure)
Цепочка проверок никаким образом не зависит от того что проверяется и какие ошибки при этом возникают
Согласен, но я преследовал две цели:
1) Сократить наисание рутиного кода (Первую я всегда преследую)
2) Иметь возможность передавать методы валидации как параметры в другие методы. (Это мне сейчас особо нужно) А другим способом собрать единый метод валидации из нескольких составных частей я не вижу.
Вообще, я так предполагаю, эти проверки должны осуществляться только когда пользователь нажал на кнопку «Выполнить», «Отправить», «Зарегистрироваться» и в случае успеха выполнить какое-то действие.
Любые другие проверки, например на сложность пароля должны производиться пока юзер не нажал на кнопку.
Поэтому сдесь чётко: Есть ошибка — выполнить то-то, нету ошибки — то-то
Можно и даже наверное нужно, но (ещё раз говорю) как правило нужно производить несколько проверок и выдавать сообщение об ошибке в зависимости от этапа проверки.
например проверка емейла в вашем варианте будет иметь вид:
Смысл в том, что если пользователь, например, не введёт логин вообще, то ему нужно выдавать не сообщение о том что «введён неправильный логин» а о том, что «Вам необходимо ввести логин» или «Вы забыли ввести логин»
В ValidationExtensions можно добавить и метод проверки регулярных выражений:
public static ValidationStepRegexValidate(this ValidationStepstep,
string regexString, string message)
{
var regex = new Regex(regexString);
if(regex.Match(step.Value)) return step;
else throw new ValidationException(message);
}
Тогда функция авторизации пользователя будет выглядеть так:
bool Auth(string login, string password)
{
bool success = true;
Validation.Validate(
login, value => value.Validate()
.Validate(x => x.Length > 0, «Вы не ввели логин»)
.RegexValidate(«Тут регулярка для логина», «Введён некорректный логин»),
null,
e => { ShowError(e.Message); success = false });
if(!success) return false;
//Дальше проверяем пароль
}
Просто иногда число проверок может быть не две, как тут, а пять и более (при каждой должно выдаваться своё сообщение), тогда такая запись оазывается и понятнее и короче.
Основной идеей является сократить код, который в любом случае придётся писать, до минимума, чтобы с одного взгляда было понятно, что значение проверяется сначала на пустоту, потом на то, что оно является целым, а затем, что оно принадлежит некоторому интервалу.
Главное, что так можно организовать проверку любого значения на любые условия.
По-моему это не совсем то. Я не говорю о проверке параметров метода. Я говорю именно о проверке значений, введёных пользователем в некую форму и сопоставление каждой проверке некоторого сообщения, которое должно выдаваться пользователю если он ввёл неверное значение.
К тому же (при регистрации пользователя например) может проверяться то, что ещё не известно до проверки.
Думаю пользователь не поймёт юмора, если ему написать «Введите корректный логин, который ещё не используется»
Мне кажется, для Microsoft это, вобщем то, плюс. Если разработчики могут писать совместимый софт, то для его использования будет использоваться именно Windows.
Сколько телефонов нужно было скурить, чтобы до такого добуматься…
Может лучше делать сигареты из пресованиых телефонов? Может число курящих снизится: о)
что там хранить? Есть конкретная форма, в ней конкретное поле конкретно проверяется конкретной цепочкой проверок: о)
Это же просто аналог конструкции if-else-if-else-…
С выносом текстов проблемм нет, все эти проверки появляются в конечном продукте.
можно вместо текста ошибки возвращать некоторый строковой код, главное чтобы в программе были определены методы, которые ошибку будут обрабатывать
Эти методы будут вызываться в делегатах (ActiononSuccess, ActiononFailure)
Цепочка проверок никаким образом не зависит от того что проверяется и какие ошибки при этом возникают
1) Сократить наисание рутиного кода (Первую я всегда преследую)
2) Иметь возможность передавать методы валидации как параметры в другие методы. (Это мне сейчас особо нужно) А другим способом собрать единый метод валидации из нескольких составных частей я не вижу.
Любые другие проверки, например на сложность пароля должны производиться пока юзер не нажал на кнопку.
Поэтому сдесь чётко: Есть ошибка — выполнить то-то, нету ошибки — то-то
var success = true;
string password;
Validation.Validate(
PasswordTB.Text, value => value.Validate()
.Validate(x => x.Length > 0, «Вы не ввели пароль»)
.Validate(x => IsValidPassword(email), «Неверный пароль»)//Тут вообще могут идти проверки на длину, сложность итд.
v => { password = v.Value; },//При успешной проверке сохраняем пароль
e => { ShowError(e.Message); success = false });//При неуспешной показываем ошибку
if(!success) return;
string passwordConfirm;
Validation.Validate(
PasswordTBConfirm.Text, value => value.Validate()
.Validate(x => x.Length > 0, «Вы не ввели подтверждение пароль»)
.Validate(x => x == password, «Подтвержение не верное»),
v => { passwordConfirm= v.Value; },//При успешной проверке сохраняем подтверждение
e => { ShowError(e.Message); success = false });//При неуспешной показываем ошибку
проверка регуляркой может быть записана и так:
var regex = new Regex(«Тут регулярка для логина»);
Validation.Validate(
login, value => value.Validate()
.Validate(x => x.Length > 0, «Вы не ввели логин»)
.Validate(x => regex.Match(step.Value).Success, «Введён некорректный логин»)
login, value => value.Validate()
.Validate(x => x.Length > 0, «Вы не ввели логин»)
.RegexValidate(«Тут регулярка для логина», «Введён некорректный логин»)
.Validate(x => !IsUsedLogin(login), «Такой логин уже есть»),
null,
e => { ShowError(e.Message); success = false });
bool success = true;
Validation.Validate(
email, value => value.Validate()
.Validate(x => x.Length > 0, «Вы не ввели емейл»)
.Validate(x => IsValidEMail(email), «Это не емейл»)
.Validate(x => !IsUsedEmail(email), «Нет пользователя с таким адресом»)
null, e => { ShowError(e.Message); success = false });
if(!success) return false;
if(email.Length = 0)
{
Error.Text = «Вы не ввели емейл»;
return;
}
else if(IsValidEMail(email))
{
Error.Text = «Это не емейл»;
return;
}
else if(!IsUsedEmail(email)) //Если нужно проверить, что юзер с таким адресом есть
{
Error.Text = «Нет пользователя с таким адресом»;
return;
}
например проверка емейла в вашем варианте будет иметь вид:
В ValidationExtensions можно добавить и метод проверки регулярных выражений:
public static ValidationStepRegexValidate(this ValidationStepstep,
string regexString, string message)
{
var regex = new Regex(regexString);
if(regex.Match(step.Value)) return step;
else throw new ValidationException(message);
}
Тогда функция авторизации пользователя будет выглядеть так:
bool Auth(string login, string password)
{
bool success = true;
Validation.Validate(
login, value => value.Validate()
.Validate(x => x.Length > 0, «Вы не ввели логин»)
.RegexValidate(«Тут регулярка для логина», «Введён некорректный логин»),
null,
e => { ShowError(e.Message); success = false });
if(!success) return false;
//Дальше проверяем пароль
}
Просто иногда число проверок может быть не две, как тут, а пять и более (при каждой должно выдаваться своё сообщение), тогда такая запись оазывается и понятнее и короче.
Главное, что так можно организовать проверку любого значения на любые условия.
Думаю пользователь не поймёт юмора, если ему написать «Введите корректный логин, который ещё не используется»
Введите число от 0 до 10: [ А тут текст бокс ]
Но это уже дело разработчика.
Мой вариант только проверяет то, что пользователь введёт.
Может лучше делать сигареты из пресованиых телефонов? Может число курящих снизится: о)