Просмотр полной версии : Универсальный алгоритм обработки результатов
Привет.
Есть несколько тысяч операций, которые выдают результаты различного типа. Каждый результат надо обрабатывать по определенной формуле и определять хорошо или плохо. Все было просто, когда обработка была на сравнения с каким то параметром. Например результат число больше 200, или строка != "", ну и если результат массив, то обычно проверялась его длина или искался элемент в нем. Я до сих пор использовал формулы в обратной польской нотации (ОПН), куда подставлялся результат. Было более менее универсально.
Теперь проблема. Появилась необходимость искать подстроки в строках или в массиве строк, использовать регулярные выражения. ОПН в некоторых местах поломался, из-за спецсимволов. Вот хочу найти альтернативу, но чтобы было универсально. Хотел перейти полностью на регэкспы, но сомневаюсь, что они умеют сравнивать больше меньше.
У меня пока вариант, использовать регэкспы в довесок к ОПН, но только для строк.
Написать валидаторы с стандартизированным интерфейсом, которые будут принимать параметр и выдавать результат.
Flashrunner
21.07.2011, 22:14
Почитайте про шаблон Specification http://martinfowler.com/apsupp/spec.pdf
Написать валидаторы с стандартизированным интерфейсом, которые будут принимать параметр и выдавать результат.
Хм, меня сейчас больше "начинка" валидаторов интересует. Но спасибо за совет, пригодится при рефакторинге.
Почитайте про шаблон Specification http://martinfowler.com/apsupp/spec.pdf
Спасибо, почитаю, отпишусь.
Начинка может быть какая угодно, тут как раз нет необходимости приводить начинку к одному виду. Унификацию проверки реализует валидатор.
То есть для чисел один валидатор, для строк другой, для массивов третий? Если да, имеет ли смысл дробить их еще мельче по виду проверки - отдельный валидатор для больше, отдельный для меньше, третий для равно?
Именно. Имеет ли смысл дробить это тебе решать, можно и подробить.
Flashrunner
22.07.2011, 01:11
Валидаторы, описанные alatar, по сути и есть Спецификации по Фаулеру.
Если да, имеет ли смысл дробить их еще мельче по виду проверки - отдельный валидатор для больше, отдельный для меньше, третий для равно?
Вообще валидаторы должны отвечать только true или false, это и делает их унифицированными. В данном случае я бы наверное создал 'My'RangeValidator, если вас интересует конкретный диапазон значений.
В статье, на которую я дал ссылку, написано как удобно делать композитные валидаторы.
Именно. Имеет ли смысл дробить это тебе решать, можно и подробить.
Ага отлично, спасибо.
Валидаторы, описанные alatar, по сути и есть Спецификации по Фаулеру.
Я еще не читал, английский у меня не на высоте, читаю долго со словариком. Но общий смысл я понял, идея то простая. Больше огорчает, что сам не допер, наверно с опытом придет.
Вообще валидаторы должны отвечать только true или false
Это как раз то, что мне нужно. Сейчас я все прогоняю через один объект, подобие большого валидатора (у меня он анализатором называется :о)) , и он возвращает бульон, как раз.
Спасибо.
Вообще валидаторы должны отвечать только true или false
Не должны, это один из вариантов. Ничто не мешает возвращать более информативные объекты.
Не должны, это один из вариантов. Ничто не мешает возвращать более информативные объекты.
Ну это уже понятно, как реализую, так и будет. Просто мне пока нужен булевский ответ.
Flashrunner
22.07.2011, 01:38
Не должны, это один из вариантов. Ничто не мешает возвращать более информативные объекты.
Но тогда вызывающий валидацию должен будет знать обо всех этих объектах и как с ними работать. Это лишние зависимости на мой взгляд.
Я бы сделал несколько true/false валидаторов, любой из которых можно отключить/добавить без проблем.
И да, о каких тогда стандартизированных интерфейсах вы писали?
Стандартизованный в данном случае, реализующий некий интерфейс.
Событие кочующее вместе с интерфейсом валидатора не будет создавать лишних зависимостей.
Добавлено через 1 минуту
Для примера можно посмотреть валидаторы из флекса.
Flashrunner
22.07.2011, 04:46
Посмотрел, понял, что мы говорим немного о разном :)
Вы говорите о дополнительной информации в ответе валидатора, типа "почему объект не прошел валидацию".
А я имел ввиду, что валидатор не должен возвращать "bigger", "less" или "equals", т.е он должен говорить либо "да", либо "нет".
Во флексе это реализовано в виде строк "valid" и "invalid". Других вариантов нет
Почитайте про шаблон 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 перевести? Я с С совсем не знаком и не понял, где велосипед
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.