MVP не обязательно сценарий, где Представление является главным (см. MVP Taligent, например).
я нахожу его неудачным, что люди все еще проповедуют, это как шаблон (Просмотрите ответственный) в противоположность антишаблону, поскольку это противоречит, "Это - просто представление" (Прагматически настроенный Программист). "Это - просто представление", указывает, что заключительное представление, показанное пользователю, является вопросом второстепенной важности приложения. Шаблон MVP Microsoft представляет повторное использование намного более трудных Представлений и удобно разработчик Microsoft оправданий от ободрительной плохой практики.
, Чтобы быть совершенно откровенным, я думаю, что базовые проблемы MVC сохраняются для любой реализации MVP, и различия являются почти совершенно семантическими. Пока Вы следуете за разделением проблем между представлением (который отображает данные), контроллер (который инициализирует и управляет взаимодействием с пользователем) и модель (базовые данные и/или сервисы)), тогда, Вы достигаете преимуществ MVC. Если Вы достигаете преимуществ тогда, кто действительно заботится, является ли Ваш шаблон MVC, MVP или Контроллером Наблюдения? [Только 114] реальные шаблон остается как MVC, остальные просто отличаются ароматы его.
Рассматривают этот очень захватывающая статья, которая всесторонне перечисляет много этих отличающихся реализаций. Можно отметить, что они все в основном делают то же самое, но немного по-другому.
я лично думаю, что MVP был только недавно повторно представлен как броский термин для или сокращения споров между семантическими фанатиками, которые спорят, является ли что-то действительно MVC или не или выровнять по ширине инструменты Microsofts Rapid Application Development. Ни одна из этих причин в моих книгах не выравнивает по ширине свое существование как отдельный шаблон разработки.
Вы можете использовать каждые?
:
user=> (every? string? '("hi" 1))
false
Вот документация по каждые?
.
Я написал andmap
как макрос, который принимает предикаты в качестве аргументов и создает функцию, которая «обертывает и
вокруг предикатов», т. Е.
(andmap integer? odd?)
==>
(fn [x] (and (integer? x)
(odd? x)))
(он не расширяется до точно this, но расширяется до чего-то эквивалентного этому)
Это имеет то преимущество, что сокращает предикаты, поэтому вы можете писать
(every? (andmap integer? odd?) [1 3 "a string"])
, не получая исключение времени выполнения, как в случае с ответом Артура .
Вот определение andmap
:
(defmacro andmap ([] `(fn [& x#] true)) ([p & ps] `(fn [& x#] (and (apply ~p x#) (apply (andmap ~@ps) x#)))))
Также можно определить andmap
как функцию, которая также сокращает свои предикаты из-за лени:
(defn andmap [& ps] (fn [& x] (every? true? (map (fn [p] (apply p x)) ps))))
Предикаты для andmap могут принимать произвольное количество аргументов,
каждые?
спросит: «Возвращает ли эта функция значение true для каждого члена последовательности», что близко к тому, что, я думаю, вы просите. Для улучшения every?
нужно взять список функций и спросить: «Все ли эти предикаты верны для каждого члена этой последовательности?»
Вот первая попытка:
(defn andmap? [data tests]
(every? true? (for [d data, f tests]
(f d))))
user> (andmap? '(2 4 8) [even? pos?])
true
user> (andmap? '(2 4 8) [even? odd?])
false