Лучший способ проверить строку по многим шаблонам
Это вопрос больше о лучших практиках/шаблонах проектирования, чем о регулярных выражениях.
Короче говоря, у меня есть 3 значения: от, до и значение, которое я хочу изменить. От должен соответствовать одному из шаблонов:XX.X
>XX.X
>=XX.X
<XX.X
<=XX.X
XX.X-XX.X
Тогда как To должно быть десятичным числом. В зависимости от того, какое значение дано в From, я должен проверить, удовлетворяет ли значение, которое я хочу изменить, условию From. Например, вводимые пользователем значения "от: >100.00 до: 150.00" означают, что каждое значение больше 100.00 должно быть измененный.
Само регулярное выражение не является проблемой. Дело в том, что если я сопоставляю целое с одним регулярным выражением и оно проходит, мне все равно нужно проверить, какой вариант был введен - это создаст по крайней мере 5 IFs в моем коде, и каждый раз, когда я хочу добавить другой вариант, мне нужно будет добавить еще один, если - не круто. То же самое, если бы я создал 5 паттернов.
Теперь у меня есть хэш-карта, которая содержит шаблон в качестве ключа и ValueMatcher в качестве значения. Когда пользователь вводит значение From, я сопоставляю его в цикле против каждого ключа в этой карте, и если он соответствует, то я использую соответствующий ValueMatcher, чтобы фактически проверить, удовлетворяет ли значение, которое я хочу изменить, значению "From".
Этот подход, с другой стороны, требует, чтобы у меня была хэш-карта со всеми возможностями, интерфейс ValueMatcher и 5 реализаций, каждая из которых имеет только 1 короткий "matches" methode. Я думаю, что это, конечно, лучше, чем если бы, но все равно выглядит как преувеличенное решение.
Есть ли другой способ сделать это? это? Или это то, как я на самом деле должен это сделать? Я очень сожалею, что мы не можем хранить методы в хэш-карте/передавать их в качестве аргументов, потому что тогда у меня будет только 1 класс со всеми соответствующими методами и хранить их в хэш-карте.
2 ответа:
Как насчет цепи ответственности?
Каждый объект ValueMatcher содержит ровно одно правило From/To и ссылку на следующий объект ValueMatcher в цепочке. Каждый ValueMatcher имеет метод, который проверяет кандидата и либо преобразует его, либо передает следующему в цепочке.
Таким образом, добавление нового правила является тривиальным расширением, и управляющий код просто передает кандидата первому члену цепочки.
Интерфейс ValueMatcher и 5 реализаций, каждая из которых имеет только 1 короткий "соответствующий" methode. Я думаю, что это, конечно, лучше, чем если бы, но все равно выглядит как преувеличенное решение.
Ну, для чего-то столь простого, как вычисление числа по оператору и предельному значению, не могли бы вы просто написать один немного более общий ValueMatcher, который имеет предельное значение и оператор в качестве своих параметров? Тогда было бы довольно легко добавить 5 экземпляров этого ValueMatcher с a несколько комбинаций>, > = и т. д.
EDIT: удалены не Java вещи... сожалеть об этом.