PDA

Просмотр полной версии : Универсальный алгоритм обработки результатов


GBee
21.07.2011, 17:23
Привет.
Есть несколько тысяч операций, которые выдают результаты различного типа. Каждый результат надо обрабатывать по определенной формуле и определять хорошо или плохо. Все было просто, когда обработка была на сравнения с каким то параметром. Например результат число больше 200, или строка != "", ну и если результат массив, то обычно проверялась его длина или искался элемент в нем. Я до сих пор использовал формулы в обратной польской нотации (ОПН), куда подставлялся результат. Было более менее универсально.

Теперь проблема. Появилась необходимость искать подстроки в строках или в массиве строк, использовать регулярные выражения. ОПН в некоторых местах поломался, из-за спецсимволов. Вот хочу найти альтернативу, но чтобы было универсально. Хотел перейти полностью на регэкспы, но сомневаюсь, что они умеют сравнивать больше меньше.

У меня пока вариант, использовать регэкспы в довесок к ОПН, но только для строк.

alatar
21.07.2011, 19:08
Написать валидаторы с стандартизированным интерфейсом, которые будут принимать параметр и выдавать результат.

Flashrunner
21.07.2011, 22:14
Почитайте про шаблон Specification http://martinfowler.com/apsupp/spec.pdf

GBee
21.07.2011, 23:58
Написать валидаторы с стандартизированным интерфейсом, которые будут принимать параметр и выдавать результат.

Хм, меня сейчас больше "начинка" валидаторов интересует. Но спасибо за совет, пригодится при рефакторинге.

Почитайте про шаблон Specification http://martinfowler.com/apsupp/spec.pdf
Спасибо, почитаю, отпишусь.

alatar
22.07.2011, 00:38
Начинка может быть какая угодно, тут как раз нет необходимости приводить начинку к одному виду. Унификацию проверки реализует валидатор.

GBee
22.07.2011, 00:44
То есть для чисел один валидатор, для строк другой, для массивов третий? Если да, имеет ли смысл дробить их еще мельче по виду проверки - отдельный валидатор для больше, отдельный для меньше, третий для равно?

alatar
22.07.2011, 00:52
Именно. Имеет ли смысл дробить это тебе решать, можно и подробить.

Flashrunner
22.07.2011, 01:11
Валидаторы, описанные alatar, по сути и есть Спецификации по Фаулеру.
Если да, имеет ли смысл дробить их еще мельче по виду проверки - отдельный валидатор для больше, отдельный для меньше, третий для равно?
Вообще валидаторы должны отвечать только true или false, это и делает их унифицированными. В данном случае я бы наверное создал 'My'RangeValidator, если вас интересует конкретный диапазон значений.
В статье, на которую я дал ссылку, написано как удобно делать композитные валидаторы.

GBee
22.07.2011, 01:19
Именно. Имеет ли смысл дробить это тебе решать, можно и подробить.
Ага отлично, спасибо.

Валидаторы, описанные alatar, по сути и есть Спецификации по Фаулеру.
Я еще не читал, английский у меня не на высоте, читаю долго со словариком. Но общий смысл я понял, идея то простая. Больше огорчает, что сам не допер, наверно с опытом придет.

Вообще валидаторы должны отвечать только true или false
Это как раз то, что мне нужно. Сейчас я все прогоняю через один объект, подобие большого валидатора (у меня он анализатором называется :о)) , и он возвращает бульон, как раз.


Спасибо.

alatar
22.07.2011, 01:29
Вообще валидаторы должны отвечать только true или false
Не должны, это один из вариантов. Ничто не мешает возвращать более информативные объекты.

GBee
22.07.2011, 01:36
Не должны, это один из вариантов. Ничто не мешает возвращать более информативные объекты.

Ну это уже понятно, как реализую, так и будет. Просто мне пока нужен булевский ответ.

Flashrunner
22.07.2011, 01:38
Не должны, это один из вариантов. Ничто не мешает возвращать более информативные объекты.
Но тогда вызывающий валидацию должен будет знать обо всех этих объектах и как с ними работать. Это лишние зависимости на мой взгляд.
Я бы сделал несколько true/false валидаторов, любой из которых можно отключить/добавить без проблем.
И да, о каких тогда стандартизированных интерфейсах вы писали?

alatar
22.07.2011, 01:58
Стандартизованный в данном случае, реализующий некий интерфейс.
Событие кочующее вместе с интерфейсом валидатора не будет создавать лишних зависимостей.

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

Flashrunner
22.07.2011, 04:46
Посмотрел, понял, что мы говорим немного о разном :)
Вы говорите о дополнительной информации в ответе валидатора, типа "почему объект не прошел валидацию".
А я имел ввиду, что валидатор не должен возвращать "bigger", "less" или "equals", т.е он должен говорить либо "да", либо "нет".
Во флексе это реализовано в виде строк "valid" и "invalid". Других вариантов нет

wvxvw
22.07.2011, 12:20
Почитайте про шаблон Specification http://martinfowler.com/apsupp/spec.pdf

Прикольный велосипед :) Человек изобрел теорию категорий, еще раз.
(deftype odd-integers satisfies 'oddp)
(создаем тип целых нечетных чисел).
или:
integer(Value) when Value % 2 > 0 ->
io:format("An odd integer: ~a~%", [Value]);

integer(Value) ->
io:format("An even integer: ~a~%", [Value]).
ЗЫ. У этих "методов" о которых говорится в бумаге даже имя специальное есть - предикаты.

Flashrunner
22.07.2011, 15:59
wvxvw, не могли бы вы на AS перевести? Я с С совсем не знаком и не понял, где велосипед