<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'><id>tag:blogger.com,1999:blog-8864435396524375431.post4548993343058255201..comments</id><updated>2009-05-12T12:35:21.812+03:00</updated><title type='text'>Comments on Систематизация автоматизации: Defensive Design. Откуда берутся сбои</title><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://igor.quatrocode.com/feeds/4548993343058255201/comments/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8864435396524375431/4548993343058255201/comments/default'/><link rel='alternate' type='text/html' href='http://igor.quatrocode.com/2009/02/defensive-design.html'/><author><name>Igor</name><uri>http://www.blogger.com/profile/10232785741897411593</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8864435396524375431.post-9062331493767737302</id><published>2009-05-12T12:35:00.000+03:00</published><updated>2009-05-12T12:35:00.000+03:00</updated><title type='text'>приятно, что можно подробно почитать об интересующ...</title><content type='html'>приятно, что можно подробно почитать об интересующем вопросе, спасибо автору!</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8864435396524375431/4548993343058255201/comments/default/9062331493767737302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8864435396524375431/4548993343058255201/comments/default/9062331493767737302'/><link rel='alternate' type='text/html' href='http://igor.quatrocode.com/2009/02/defensive-design.html?showComment=1242120900000#c9062331493767737302' title=''/><author><name>Алеся</name><uri>http://www.lokoparovoz.ru</uri><email>noreply@blogger.com</email></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://igor.quatrocode.com/2009/02/defensive-design.html' ref='tag:blogger.com,1999:blog-8864435396524375431.post-4548993343058255201' source='http://www.blogger.com/feeds/8864435396524375431/posts/default/4548993343058255201' type='text/html'/></entry><entry><id>tag:blogger.com,1999:blog-8864435396524375431.post-6383711286752277260</id><published>2009-04-07T09:15:00.000+03:00</published><updated>2009-04-07T09:15:00.000+03:00</updated><title type='text'>Более легковесный вариант: http://www.codeproject....</title><content type='html'>Более легковесный вариант: http://www.codeproject.com/KB/cs/designbycontract.aspx, только нужна определенная сила воли, чтобы использовать в проектах :).&lt;BR/&gt;Большой плюс в таких библиотеках и оболочках - наглядность исходников.&lt;BR/&gt;Здесь можно посмотреть хороший пример использования DesignByContract - "NHibernate Best Practices with ASP.NET, 1.2nd Ed.", http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx?msg=1527549#xx1527549xx</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8864435396524375431/4548993343058255201/comments/default/6383711286752277260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8864435396524375431/4548993343058255201/comments/default/6383711286752277260'/><link rel='alternate' type='text/html' href='http://igor.quatrocode.com/2009/02/defensive-design.html?showComment=1239084900000#c6383711286752277260' title=''/><author><name>ssdi</name><uri>http://www.blogger.com/profile/14519245792253686773</uri><email>noreply@blogger.com</email></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://igor.quatrocode.com/2009/02/defensive-design.html' ref='tag:blogger.com,1999:blog-8864435396524375431.post-4548993343058255201' source='http://www.blogger.com/feeds/8864435396524375431/posts/default/4548993343058255201' type='text/html'/></entry><entry><id>tag:blogger.com,1999:blog-8864435396524375431.post-3766028143323829269</id><published>2009-04-06T15:07:00.000+03:00</published><updated>2009-04-06T15:07:00.000+03:00</updated><title type='text'>Еще одна занятная вещь: Code Contracts.</title><content type='html'>Еще одна занятная вещь: &lt;A HREF="http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx" REL="nofollow"&gt;Code Contracts&lt;/A&gt;.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8864435396524375431/4548993343058255201/comments/default/3766028143323829269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8864435396524375431/4548993343058255201/comments/default/3766028143323829269'/><link rel='alternate' type='text/html' href='http://igor.quatrocode.com/2009/02/defensive-design.html?showComment=1239019620000#c3766028143323829269' title=''/><author><name>Igor</name><uri>http://www.blogger.com/profile/10232785741897411593</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17428314672741021655'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://igor.quatrocode.com/2009/02/defensive-design.html' ref='tag:blogger.com,1999:blog-8864435396524375431.post-4548993343058255201' source='http://www.blogger.com/feeds/8864435396524375431/posts/default/4548993343058255201' type='text/html'/></entry><entry><id>tag:blogger.com,1999:blog-8864435396524375431.post-623855828700613027</id><published>2009-04-06T14:34:00.000+03:00</published><updated>2009-04-06T14:34:00.000+03:00</updated><title type='text'>Непосредственно для логирования удобнее использова...</title><content type='html'>Непосредственно для логирования удобнее использовать более развитые вещи вроде log4net. А вот наглядно увидеть модальный диалог на ранних стадиях отладки (малой кровью), причем из любого потока выскочит (с умолчательной конфигурацией) бывает полезно.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8864435396524375431/4548993343058255201/comments/default/623855828700613027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8864435396524375431/4548993343058255201/comments/default/623855828700613027'/><link rel='alternate' type='text/html' href='http://igor.quatrocode.com/2009/02/defensive-design.html?showComment=1239017640000#c623855828700613027' title=''/><author><name>ssdi</name><uri>http://www.blogger.com/profile/14519245792253686773</uri><email>noreply@blogger.com</email></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://igor.quatrocode.com/2009/02/defensive-design.html' ref='tag:blogger.com,1999:blog-8864435396524375431.post-4548993343058255201' source='http://www.blogger.com/feeds/8864435396524375431/posts/default/4548993343058255201' type='text/html'/></entry><entry><id>tag:blogger.com,1999:blog-8864435396524375431.post-3293392306654879955</id><published>2009-04-06T14:12:00.000+03:00</published><updated>2009-04-06T14:12:00.000+03:00</updated><title type='text'>Исключительно полезная вещь Debug.Assert, конечно ...</title><content type='html'>Исключительно полезная вещь Debug.Assert, конечно при умелом использовании.&lt;BR/&gt;Навскидку дает дополнительную информацию о сбоях внутри алгоритмов и их ЧАСТЕЙ при проходе тестов и ручной отладке. Исключительно важно для многопоточных(многопроцессных) приложений в процессе их отладки и юниттестирования. Т.к. в простых и комплексных тестах иногда бывает достаточно сложно судить об успешности его прохождения (критерии или сложны или не совсем очевидны). Поэтому прогон при дебаговой конфигурации даст как минимум отсутствие результата на выходе (сработает Debug.Assert) за отведенное время, а нюансы увидим в логе. Или другой пример - логика конечных автоматов, допустимые переходы состояний я всегда проверяю через Debug.Assert. В сложных системах без пользовательского интерфейса иногда бывает чуть ли не единственным признаком того что что то идет не так, т.к. зачастую "защитный" код таких систем позволяет сохранить работоспособность и даже выдать результат, который не всегда рационально разбирать.&lt;BR/&gt;Несколько соображений которые я держу в голове при использовании Assert.&lt;BR/&gt;Через него проверяться должна ТОЛЬКО ЛОГИКА РАБОТЫ АЛГОРИТМА или его частей, и не в коем случае пользовательский ввод или информация пришедшая извне (другой модуль, система, источник). А вот после обработки верфикатором и возможно исправления его алгоритмами обработки ввода самое милое дело проверить эти самые алгоритмы через Assert (часто они просты, тест писать излишне, а проверить нужно). Юниттесты на все нюансы работы алгоритма и его частей не напишешь, а рефакторить до бесконечности тоже не всегда разумно.&lt;BR/&gt;И еще не забывать, что кроме Debug.Assert, есть и Trace.Assert.&lt;BR/&gt;Debug.Assert иногда можно нагрузить тяжелыми проверками, которых не будет в релизной конфигурации.&lt;BR/&gt;Направление вывода Debug.Assert можно декларативно менять через конфиг, т.е., например, писать в лог файл.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8864435396524375431/4548993343058255201/comments/default/3293392306654879955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8864435396524375431/4548993343058255201/comments/default/3293392306654879955'/><link rel='alternate' type='text/html' href='http://igor.quatrocode.com/2009/02/defensive-design.html?showComment=1239016320000#c3293392306654879955' title=''/><author><name>ssdi</name><uri>http://www.blogger.com/profile/14519245792253686773</uri><email>noreply@blogger.com</email></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://igor.quatrocode.com/2009/02/defensive-design.html' ref='tag:blogger.com,1999:blog-8864435396524375431.post-4548993343058255201' source='http://www.blogger.com/feeds/8864435396524375431/posts/default/4548993343058255201' type='text/html'/></entry><entry><id>tag:blogger.com,1999:blog-8864435396524375431.post-7393095140257248487</id><published>2009-02-13T16:48:00.000+02:00</published><updated>2009-02-13T16:48:00.000+02:00</updated><title type='text'>Спасибо за столь ценную информацию.</title><content type='html'>Спасибо за столь ценную информацию.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8864435396524375431/4548993343058255201/comments/default/7393095140257248487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8864435396524375431/4548993343058255201/comments/default/7393095140257248487'/><link rel='alternate' type='text/html' href='http://igor.quatrocode.com/2009/02/defensive-design.html?showComment=1234536480000#c7393095140257248487' title=''/><author><name>miraz</name><uri>http://dekur.ru/</uri><email>noreply@blogger.com</email></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://igor.quatrocode.com/2009/02/defensive-design.html' ref='tag:blogger.com,1999:blog-8864435396524375431.post-4548993343058255201' source='http://www.blogger.com/feeds/8864435396524375431/posts/default/4548993343058255201' type='text/html'/></entry><entry><id>tag:blogger.com,1999:blog-8864435396524375431.post-6293894575809618693</id><published>2009-02-03T12:47:00.000+02:00</published><updated>2009-02-03T12:47:00.000+02:00</updated><title type='text'>Кроме того, не стоит забывать о различной природе ...</title><content type='html'>Кроме того, не стоит забывать о различной природе этих ассертов. TDD сродни синтетическим тестам, против тестов, которые работают в рантайме на живых данных.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8864435396524375431/4548993343058255201/comments/default/6293894575809618693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8864435396524375431/4548993343058255201/comments/default/6293894575809618693'/><link rel='alternate' type='text/html' href='http://igor.quatrocode.com/2009/02/defensive-design.html?showComment=1233658020000#c6293894575809618693' title=''/><author><name>Igor</name><uri>http://www.blogger.com/profile/10232785741897411593</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17428314672741021655'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://igor.quatrocode.com/2009/02/defensive-design.html' ref='tag:blogger.com,1999:blog-8864435396524375431.post-4548993343058255201' source='http://www.blogger.com/feeds/8864435396524375431/posts/default/4548993343058255201' type='text/html'/></entry><entry><id>tag:blogger.com,1999:blog-8864435396524375431.post-6972696472712561900</id><published>2009-02-03T12:45:00.000+02:00</published><updated>2009-02-03T12:45:00.000+02:00</updated><title type='text'>Одно другому не мешает, на самом деле. Особенно, к...</title><content type='html'>Одно другому не мешает, на самом деле. Особенно, когда речь идет о валидации данных из внешних источников.&lt;BR/&gt;&lt;BR/&gt;Но я бы пожалуй согласился, что Debug.Assert отойдет. Но не в пользу TDD, а в пользу Design by Contract, как более строгой и стройной форме этих самых ассертов.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8864435396524375431/4548993343058255201/comments/default/6972696472712561900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8864435396524375431/4548993343058255201/comments/default/6972696472712561900'/><link rel='alternate' type='text/html' href='http://igor.quatrocode.com/2009/02/defensive-design.html?showComment=1233657900000#c6972696472712561900' title=''/><author><name>Igor</name><uri>http://www.blogger.com/profile/10232785741897411593</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='17428314672741021655'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://igor.quatrocode.com/2009/02/defensive-design.html' ref='tag:blogger.com,1999:blog-8864435396524375431.post-4548993343058255201' source='http://www.blogger.com/feeds/8864435396524375431/posts/default/4548993343058255201' type='text/html'/></entry><entry><id>tag:blogger.com,1999:blog-8864435396524375431.post-8672278634115735239</id><published>2009-02-03T12:37:00.000+02:00</published><updated>2009-02-03T12:37:00.000+02:00</updated><title type='text'>Еще один момент про Debug.Assert. Имхо эта практик...</title><content type='html'>Еще один момент про Debug.Assert. Имхо эта практика будет все менее популярна в связи с внедрением в массы TDD (юнит тестов). ТДД покрывает бизнес-метод тестами, в т.ч. тестами на то, как метод будет реагировать на некорректные значения параметров. Т.е. ТДД стимулирует исправлять код метода, чтобы тесты проходили. А Дебаг.ассерт - это своего рода "юнит тест лайт", внедренный в код метода, т.е. это не стимулирует делать код лучше, а только засоряет код описаниями, когда методу будет фигово :-)&lt;BR/&gt;Пример: Функция, которая делит х на у:&lt;BR/&gt;private decmal Div(decimal x, decimal y) {&lt;BR/&gt;   return x/y;&lt;BR/&gt;}&lt;BR/&gt;&lt;BR/&gt;Вариант_1 с изменением кода для Дебаг.Ассерт:&lt;BR/&gt;надо добавить в метод код: Debug.Assert(y != 0);&lt;BR/&gt;&lt;BR/&gt;Вариант_2 с изменением кода для юнит тестов:&lt;BR/&gt;надо добавить в метод код: if (y == 0) {throw new MyBussinesException()};&lt;BR/&gt;+ добавить 2 юнит теста: нормальное деление на y!=0 и там, где кидается бизнес эксепшн.&lt;BR/&gt;&lt;BR/&gt;Имхо, 2-ой вариант намного лучше: а) повышается качество исходного кода б) исх. код не замусоривается лишним кодом в) в случае неправильного использования метода узнаем об этом мы (разработчики) на стадии прогона юнит-тестов, а не кастомеры в лайф версии.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8864435396524375431/4548993343058255201/comments/default/8672278634115735239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8864435396524375431/4548993343058255201/comments/default/8672278634115735239'/><link rel='alternate' type='text/html' href='http://igor.quatrocode.com/2009/02/defensive-design.html?showComment=1233657420000#c8672278634115735239' title=''/><author><name>PM</name><uri>http://www.blogger.com/profile/16086659212511843152</uri><email>noreply@blogger.com</email></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://igor.quatrocode.com/2009/02/defensive-design.html' ref='tag:blogger.com,1999:blog-8864435396524375431.post-4548993343058255201' source='http://www.blogger.com/feeds/8864435396524375431/posts/default/4548993343058255201' type='text/html'/></entry><entry><id>tag:blogger.com,1999:blog-8864435396524375431.post-4518525391932249327</id><published>2009-02-03T11:44:00.000+02:00</published><updated>2009-02-03T11:44:00.000+02:00</updated><title type='text'>Есть мнение в ИТ, что дебаг.ассерт юзают крутые гу...</title><content type='html'>Есть мнение в ИТ, что дебаг.ассерт юзают крутые гуру, но никто из опрошенных гуру эту информацию не подтвердил, но и не опроверг :D</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8864435396524375431/4548993343058255201/comments/default/4518525391932249327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8864435396524375431/4548993343058255201/comments/default/4518525391932249327'/><link rel='alternate' type='text/html' href='http://igor.quatrocode.com/2009/02/defensive-design.html?showComment=1233654240000#c4518525391932249327' title=''/><author><name>PM</name><uri>http://www.blogger.com/profile/16086659212511843152</uri><email>noreply@blogger.com</email></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://igor.quatrocode.com/2009/02/defensive-design.html' ref='tag:blogger.com,1999:blog-8864435396524375431.post-4548993343058255201' source='http://www.blogger.com/feeds/8864435396524375431/posts/default/4548993343058255201' type='text/html'/></entry></feed>