Re[11]: Действительно ли ML языки хороши в компиляторописани
От: Mamut Швеция http://dmitriid.com
Дата: 25.04.08 07:05
Оценка:
M>>Приведенный вариант просто вернет true или false. Мой вариант вернет список не прошедших валидацию полей и всех ошибок, которые с ними связаны (правила валидации могут передаваться списком).
SR>А, ну надо было тогда в условие задачи, добавить, что правила проверки должны задаваться более-менее декларативно.


Ну, во многом в этом и состоит смысл ПМа — описывать ребуемое декларативно



M>>При этом функция остается общей и может использоваться для любых полей любой веб-формы. Без ПМа здесь только один выход — создание некоего движка правил. Но это — совсем неудобно

SR>А у вас стало быть не движок правил?

Да, действительно, я неправильно выразился. Он у меня тоже есть Но описывается он гораздо понятнее


SR>
SR>    public void main() {
SR>        Form form = new Form();
SR>        form.put("login", "name");
SR>        form.put("password", "123");
SR>        form.put("password_repeated", "123");
SR>        form.put("email", "name@domain.com");
SR>        form.put("born_year", "1980");
        
SR>        Object[] rules = new Object[] {
SR>            "login", "length", parameters(4, 16),
SR>            "password", "length", parameters(4, 16),
SR>            "password", "=", parameters("password_repeated"),
SR>            "email", "email", parameters(),
SR>            "born_year", "<", parameters("1990")
SR>        };
        
SR>        check(form, rules);
SR>    }

SR>    // О боже мой, кажется, я реализовал сопоставление с образцом для списка в Java!
SR>    // Этого не может быть, наверное я сплю.
SR>    private void check(Form form, Object[] rules) {
SR>        for (int index = 0; index < rules.length; index += 3) {
SR>            String field = rules[index].toString();
SR>            String rule = rules[index+1].toString();
SR>            Object[] parameters = (Object[])rules[index+2];
        
SR>            check(form, field, rule, parameters);
SR>        }
SR>    }

SR>    private void check(Form form, String field, String rule, Object[] parameters) {
SR>        if (rule.equals("length")) { 
SR>            int min = (Integer)parameters[0]; 
SR>            int max = (Integer)parameters[1];
SR>            checkLength(form.get(field), min, max);
SR>        }
SR>        ...
SR>        // остальной код в той же мере тривиален
SR>    }
SR>



Правильно. И такой код придется писать каждый раз заново для любой более-менее тривиальной смены структуры передаваемых данных.

То есть. Для исхдного примера
Автор: z00n
Дата: 14.12.07
придется реализовывать метод equals для term, для моего примера — целую отдельную функцию, эмулирующую сопоставление с образом, для менее тривиального примера
Автор: z00n
Дата: 24.04.08
придется еще как-нибудь изворачиваться. А ПМ позвлит все задачи решить декларативно. Это не магическая пуля, конечно, писать все равно придется Но каждый раз это будет легко и — главное! — одинаково.

Просто if поможет только сравнить значения. ПМ позволит наглядно сравнить и структуру и значения.
... << RSDN@Home 1.2.0 alpha 4 rev. 1084>>


dmitriid.comGitHubLinkedIn
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.