<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>
<channel>
	<title>Комментарии к записи: Почему валидация в Zend_Form это плохо, или о том, как делать правильную валидацию</title>
	<atom:link href="http://torqueo.net/why-zend-form-validation-is-bad-or-how-to-do-proper-validation/feed/" rel="self" type="application/rss+xml" />
	<link>http://torqueo.net/why-zend-form-validation-is-bad-or-how-to-do-proper-validation/</link>
	<description>Всё в кучу!</description>
	<pubDate>Sat, 19 May 2012 02:03:51 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>Автор: Bas</title>
		<link>http://torqueo.net/why-zend-form-validation-is-bad-or-how-to-do-proper-validation/comment-page-1/#comment-3565</link>
		<dc:creator>Bas</dc:creator>
		<pubDate>Thu, 09 Dec 2010 12:42:53 +0000</pubDate>
		<guid isPermaLink="false">http://torqueo.net/?p=221#comment-3565</guid>
		<description>Ну собственно речь о fat models. Всё верно.
http://www.survivethedeepend.com/zendframeworkbook/en/1.0/the.model</description>
		<content:encoded><![CDATA[<p>Ну собственно речь о fat models. Всё верно.<br />
<a href="http://www.survivethedeepend.com/zendframeworkbook/en/1.0/the.model" rel="nofollow">http://www.survivethedeepend.com/zendframeworkbook/en/1.0/the.model</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>Автор: Evgeny Sergeev</title>
		<link>http://torqueo.net/why-zend-form-validation-is-bad-or-how-to-do-proper-validation/comment-page-1/#comment-2123</link>
		<dc:creator>Evgeny Sergeev</dc:creator>
		<pubDate>Fri, 01 Oct 2010 01:55:10 +0000</pubDate>
		<guid isPermaLink="false">http://torqueo.net/?p=221#comment-2123</guid>
		<description>giovanni, 
"валидация данных ВНЕ места их хранения - это нарушение принципа decoupling"

Тогда их нужно валидировать в базе :-) Кстати, валидация данных вне места их использования - это тоже decoupling! Так что получается, что все задачи проекта должны решаться в одной модели.

Я против того, чтобы валидировать данные в модели. Точнее я за применение "инверсии зависимостей" - т.е. вынести валидацию во внешний класс и при инстантировании модели передавать соответствующий валидатор в модель.

Теперь по существу. Перед данными модели, работающей с БД, всегда ставиться несколько вопросов:
1. Может ли она сохранить эти данные (технические ограничения);
2. Должна ли она сохранить эти данные (логические ограничения зависящие от контекста использования)
3. Может ли она использовать сохраненные данные при выполнении данной задачи.

Простой пример, задача "Подсчитать среднюю сумму одного заказа в интернет магазине"  рассчет такой Sср = Sобщ / Nпок, где Sср - средняя сумма, Sобщ - общая сумма покупок, Nпок - количество покупок.
Допустим в каком-то месяце продаж не было. Это значит Sобщ и Nпок имеют нулевые значения, а это значит что ответы на вышестоящие вопросы будут следующими:
1. Может ли модель сохранить данные? - Да
2. Должна ли модель сохранить данные? - Да
3. Может ли модель использовать сохранненные данные? Нет. Делить на ноль нельзя!

Ответы на вопросы 1,2 никогда не будут контролироваться моделью, по крайней мере до тех пор пока будет использоваться БД. Я бы сказал, что модель успешно может отвечать только на вопрос 3, причем в разных случаях ответ на этот вопрос может быть разным. 

Опять же не нужно забывать, что любая декомпозиция - это установка логических связей, и эти связи могут быть разными по своей силе (композиция, ассоциация). Сильная связь вполне допустима между классом модели и классом валидатора!</description>
		<content:encoded><![CDATA[<p>giovanni,<br />
&#8220;валидация данных ВНЕ места их хранения - это нарушение принципа decoupling&#8221;</p>
<p>Тогда их нужно валидировать в базе :-) Кстати, валидация данных вне места их использования - это тоже decoupling! Так что получается, что все задачи проекта должны решаться в одной модели.</p>
<p>Я против того, чтобы валидировать данные в модели. Точнее я за применение &#8220;инверсии зависимостей&#8221; - т.е. вынести валидацию во внешний класс и при инстантировании модели передавать соответствующий валидатор в модель.</p>
<p>Теперь по существу. Перед данными модели, работающей с БД, всегда ставиться несколько вопросов:<br />
1. Может ли она сохранить эти данные (технические ограничения);<br />
2. Должна ли она сохранить эти данные (логические ограничения зависящие от контекста использования)<br />
3. Может ли она использовать сохраненные данные при выполнении данной задачи.</p>
<p>Простой пример, задача &#8220;Подсчитать среднюю сумму одного заказа в интернет магазине&#8221;  рассчет такой Sср = Sобщ / Nпок, где Sср - средняя сумма, Sобщ - общая сумма покупок, Nпок - количество покупок.<br />
Допустим в каком-то месяце продаж не было. Это значит Sобщ и Nпок имеют нулевые значения, а это значит что ответы на вышестоящие вопросы будут следующими:<br />
1. Может ли модель сохранить данные? - Да<br />
2. Должна ли модель сохранить данные? - Да<br />
3. Может ли модель использовать сохранненные данные? Нет. Делить на ноль нельзя!</p>
<p>Ответы на вопросы 1,2 никогда не будут контролироваться моделью, по крайней мере до тех пор пока будет использоваться БД. Я бы сказал, что модель успешно может отвечать только на вопрос 3, причем в разных случаях ответ на этот вопрос может быть разным. </p>
<p>Опять же не нужно забывать, что любая декомпозиция - это установка логических связей, и эти связи могут быть разными по своей силе (композиция, ассоциация). Сильная связь вполне допустима между классом модели и классом валидатора!</p>
]]></content:encoded>
	</item>
	<item>
		<title>Автор: Ouch!</title>
		<link>http://torqueo.net/why-zend-form-validation-is-bad-or-how-to-do-proper-validation/comment-page-1/#comment-2047</link>
		<dc:creator>Ouch!</dc:creator>
		<pubDate>Thu, 23 Sep 2010 15:02:49 +0000</pubDate>
		<guid isPermaLink="false">http://torqueo.net/?p=221#comment-2047</guid>
		<description>Совершенно правильно. Я бы тоже использовал 2 модели. Вот только задача уж слишком высосанная из пальца, как говорится - вы не должны этого хотеть)</description>
		<content:encoded><![CDATA[<p>Совершенно правильно. Я бы тоже использовал 2 модели. Вот только задача уж слишком высосанная из пальца, как говорится - вы не должны этого хотеть)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Автор: Oleg Lobach</title>
		<link>http://torqueo.net/why-zend-form-validation-is-bad-or-how-to-do-proper-validation/comment-page-1/#comment-2046</link>
		<dc:creator>Oleg Lobach</dc:creator>
		<pubDate>Thu, 23 Sep 2010 14:54:45 +0000</pubDate>
		<guid isPermaLink="false">http://torqueo.net/?p=221#comment-2046</guid>
		<description>&lt;cite&gt;Простой пример:
Во фронтенде новый юзер при добавлении комментария, указывает ник. Валидация для ника только буквы + длина ограничена.
В баккенде при использовании этой же модели я хочу разрешить админу использовать еще и цифры пробелы и т.д. При подходе валидации данных в модели, мне придется писать костыль который скажет что надо применять другую валидацию для этого поля. А если таких различных мест много в проекте, то у нас получится очень странная модель которая пытается реализовать всю валидацию необходимую для проекта в целом.&lt;/cite&gt;

Хм... на мой взгляд, тут 2 модели: "Комментатор" и "Пользователь". Каждая модель валидируется по-своему, но хранилище могут использовать общее. Как-то так...</description>
		<content:encoded><![CDATA[<p><cite>Простой пример:<br />
Во фронтенде новый юзер при добавлении комментария, указывает ник. Валидация для ника только буквы + длина ограничена.<br />
В баккенде при использовании этой же модели я хочу разрешить админу использовать еще и цифры пробелы и т.д. При подходе валидации данных в модели, мне придется писать костыль который скажет что надо применять другую валидацию для этого поля. А если таких различных мест много в проекте, то у нас получится очень странная модель которая пытается реализовать всю валидацию необходимую для проекта в целом.</cite></p>
<p>Хм&#8230; на мой взгляд, тут 2 модели: &#8220;Комментатор&#8221; и &#8220;Пользователь&#8221;. Каждая модель валидируется по-своему, но хранилище могут использовать общее. Как-то так&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>Автор: Dr0n</title>
		<link>http://torqueo.net/why-zend-form-validation-is-bad-or-how-to-do-proper-validation/comment-page-1/#comment-613</link>
		<dc:creator>Dr0n</dc:creator>
		<pubDate>Fri, 30 Oct 2009 12:38:54 +0000</pubDate>
		<guid isPermaLink="false">http://torqueo.net/?p=221#comment-613</guid>
		<description>Нверное не совсем корректно описал идею, напишу немного подробнее.
Согласен с тем, что не правильно разделять хранение данных и валидацию, но хранить валидаторы в модели которая отвечает за эти данные тоже считаю неверным подходом. Считаю что валидироваться в модели должны только некорректные данные которые могут привести к ексепшену при сохранении/обновлении.

Простой пример: 
Во фронтенде новый юзер при добавлении комментария, указывает ник. Валидация для ника только буквы  + длина ограничена.
В баккенде при использовании этой же модели я хочу разрешить админу использовать еще и цифры пробелы и т.д. При подходе валидации данных в модели, мне придется писать костыль который скажет что надо применять другую валидацию для этого поля. А если таких различных мест много в проекте, то у нас получится очень странная модель которая  пытается реализовать всю валидацию необходимую для проекта в целом.

Набором валидаторов применяемых в конкретной ситуации может выступать отдельная модель-валидатор. Которая сможет проверить данные в соответствии со своими заданными правилами валидации. Эту модель можно применять для валидации других моделей-данных. Вот как то так я себе все это представляю.

Хочу услышать пример, который приведет к нестыковке данных при таком подходе.
Спасибо за конструктивную критику.</description>
		<content:encoded><![CDATA[<p>Нверное не совсем корректно описал идею, напишу немного подробнее.<br />
Согласен с тем, что не правильно разделять хранение данных и валидацию, но хранить валидаторы в модели которая отвечает за эти данные тоже считаю неверным подходом. Считаю что валидироваться в модели должны только некорректные данные которые могут привести к ексепшену при сохранении/обновлении.</p>
<p>Простой пример:<br />
Во фронтенде новый юзер при добавлении комментария, указывает ник. Валидация для ника только буквы  + длина ограничена.<br />
В баккенде при использовании этой же модели я хочу разрешить админу использовать еще и цифры пробелы и т.д. При подходе валидации данных в модели, мне придется писать костыль который скажет что надо применять другую валидацию для этого поля. А если таких различных мест много в проекте, то у нас получится очень странная модель которая  пытается реализовать всю валидацию необходимую для проекта в целом.</p>
<p>Набором валидаторов применяемых в конкретной ситуации может выступать отдельная модель-валидатор. Которая сможет проверить данные в соответствии со своими заданными правилами валидации. Эту модель можно применять для валидации других моделей-данных. Вот как то так я себе все это представляю.</p>
<p>Хочу услышать пример, который приведет к нестыковке данных при таком подходе.<br />
Спасибо за конструктивную критику.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Автор: Ouch!</title>
		<link>http://torqueo.net/why-zend-form-validation-is-bad-or-how-to-do-proper-validation/comment-page-1/#comment-612</link>
		<dc:creator>Ouch!</dc:creator>
		<pubDate>Fri, 30 Oct 2009 11:55:59 +0000</pubDate>
		<guid isPermaLink="false">http://torqueo.net/?p=221#comment-612</guid>
		<description>print_r() - это для примера. На самом деле, я передаю объект модели в вид, и там происходит "магия" - в общем, это лучше увидеть.)</description>
		<content:encoded><![CDATA[<p>print_r() - это для примера. На самом деле, я передаю объект модели в вид, и там происходит &#8220;магия&#8221; - в общем, это лучше увидеть.)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Автор: giovanni</title>
		<link>http://torqueo.net/why-zend-form-validation-is-bad-or-how-to-do-proper-validation/comment-page-1/#comment-611</link>
		<dc:creator>giovanni</dc:creator>
		<pubDate>Fri, 30 Oct 2009 11:24:31 +0000</pubDate>
		<guid isPermaLink="false">http://torqueo.net/?p=221#comment-611</guid>
		<description>все вроде верно, только я не понял про print_r().. куда печатать то будем?

напиши мне на емейл, пообщаемся в скайпе.</description>
		<content:encoded><![CDATA[<p>все вроде верно, только я не понял про print_r().. куда печатать то будем?</p>
<p>напиши мне на емейл, пообщаемся в скайпе.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Автор: Ouch!</title>
		<link>http://torqueo.net/why-zend-form-validation-is-bad-or-how-to-do-proper-validation/comment-page-1/#comment-610</link>
		<dc:creator>Ouch!</dc:creator>
		<pubDate>Fri, 30 Oct 2009 11:11:47 +0000</pubDate>
		<guid isPermaLink="false">http://torqueo.net/?p=221#comment-610</guid>
		<description>У меня эксепшенами не бросается, а просто собирает список ошибок валидаторов в массив:

$user = new User;
$user-&gt;name = '';

if (!$user-&gt;save()) { // save запускает валидацию
  print_r($user-&gt;getErrorMessages());
}

Как-то так. В общем, если интересно, могу показать свою ORM :) Вообще, ищу единомышленников для создания ORM ;)</description>
		<content:encoded><![CDATA[<p>У меня эксепшенами не бросается, а просто собирает список ошибок валидаторов в массив:</p>
<p>$user = new User;<br />
$user->name = &#8221;;</p>
<p>if (!$user->save()) { // save запускает валидацию<br />
  print_r($user->getErrorMessages());<br />
}</p>
<p>Как-то так. В общем, если интересно, могу показать свою ORM :) Вообще, ищу единомышленников для создания ORM ;)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Автор: giovanni</title>
		<link>http://torqueo.net/why-zend-form-validation-is-bad-or-how-to-do-proper-validation/comment-page-1/#comment-609</link>
		<dc:creator>giovanni</dc:creator>
		<pubDate>Fri, 30 Oct 2009 10:41:25 +0000</pubDate>
		<guid isPermaLink="false">http://torqueo.net/?p=221#comment-609</guid>
		<description>То что в модели - тут двух мнений быть не может. А вот как потом результат этой валидации "доносить" доходчиво до всех клиентов - тут разногласия. Я считаю, что через Exceptions. Когда модель получает невалидные данные - она бросает exception. А форма должна понимать это и текст этого исключения писать под кнопкой SUBMIT. Я так вижу и так оно у меня работает. Вроде бы все логично.</description>
		<content:encoded><![CDATA[<p>То что в модели - тут двух мнений быть не может. А вот как потом результат этой валидации &#8220;доносить&#8221; доходчиво до всех клиентов - тут разногласия. Я считаю, что через Exceptions. Когда модель получает невалидные данные - она бросает exception. А форма должна понимать это и текст этого исключения писать под кнопкой SUBMIT. Я так вижу и так оно у меня работает. Вроде бы все логично.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Автор: Ouch!</title>
		<link>http://torqueo.net/why-zend-form-validation-is-bad-or-how-to-do-proper-validation/comment-page-1/#comment-605</link>
		<dc:creator>Ouch!</dc:creator>
		<pubDate>Fri, 30 Oct 2009 09:13:47 +0000</pubDate>
		<guid isPermaLink="false">http://torqueo.net/?p=221#comment-605</guid>
		<description>Согласен с вами и так же не согласен с Dron'ом. Вы привели правильные доводы, именно поэтому, я и предложил производить валидацию непосредственно в модели.</description>
		<content:encoded><![CDATA[<p>Согласен с вами и так же не согласен с Dron&#8217;ом. Вы привели правильные доводы, именно поэтому, я и предложил производить валидацию непосредственно в модели.</p>
]]></content:encoded>
	</item>
</channel>
</rss>

