tag:blogger.com,1999:blog-8864435396524375431.post4548993343058255201..comments2022-12-12T00:21:25.652+02:00Comments on Систематизация автоматизации: Defensive Design. Откуда берутся сбоиIgorhttp://www.blogger.com/profile/10232785741897411593noreply@blogger.comBlogger11125tag:blogger.com,1999:blog-8864435396524375431.post-90623314937677373022009-05-12T12:35:00.000+03:002009-05-12T12:35:00.000+03:00приятно, что можно подробно почитать об интересующ...приятно, что можно подробно почитать об интересующем вопросе, спасибо автору!Алесяhttp://www.lokoparovoz.runoreply@blogger.comtag:blogger.com,1999:blog-8864435396524375431.post-63837112867522772602009-04-07T09:15:00.000+03:002009-04-07T09:15:00.000+03:00Более легковесный вариант: http://www.codeproject....Более легковесный вариант: http://www.codeproject.com/KB/cs/designbycontract.aspx, только нужна определенная сила воли, чтобы использовать в проектах :).<BR/>Большой плюс в таких библиотеках и оболочках - наглядность исходников.<BR/>Здесь можно посмотреть хороший пример использования DesignByContract - "NHibernate Best Practices with ASP.NET, 1.2nd Ed.", http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx?msg=1527549#xx1527549xxssdihttps://www.blogger.com/profile/14519245792253686773noreply@blogger.comtag:blogger.com,1999:blog-8864435396524375431.post-37660281433238292692009-04-06T15:07:00.000+03:002009-04-06T15:07:00.000+03:00Еще одна занятная вещь: Code Contracts.Еще одна занятная вещь: <A HREF="http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx" REL="nofollow">Code Contracts</A>.Igorhttps://www.blogger.com/profile/10232785741897411593noreply@blogger.comtag:blogger.com,1999:blog-8864435396524375431.post-6238558287006130272009-04-06T14:34:00.000+03:002009-04-06T14:34:00.000+03:00Непосредственно для логирования удобнее использова...Непосредственно для логирования удобнее использовать более развитые вещи вроде log4net. А вот наглядно увидеть модальный диалог на ранних стадиях отладки (малой кровью), причем из любого потока выскочит (с умолчательной конфигурацией) бывает полезно.ssdihttps://www.blogger.com/profile/14519245792253686773noreply@blogger.comtag:blogger.com,1999:blog-8864435396524375431.post-32933923066548799552009-04-06T14:12:00.000+03:002009-04-06T14:12:00.000+03:00Исключительно полезная вещь Debug.Assert, конечно ...Исключительно полезная вещь Debug.Assert, конечно при умелом использовании.<BR/>Навскидку дает дополнительную информацию о сбоях внутри алгоритмов и их ЧАСТЕЙ при проходе тестов и ручной отладке. Исключительно важно для многопоточных(многопроцессных) приложений в процессе их отладки и юниттестирования. Т.к. в простых и комплексных тестах иногда бывает достаточно сложно судить об успешности его прохождения (критерии или сложны или не совсем очевидны). Поэтому прогон при дебаговой конфигурации даст как минимум отсутствие результата на выходе (сработает Debug.Assert) за отведенное время, а нюансы увидим в логе. Или другой пример - логика конечных автоматов, допустимые переходы состояний я всегда проверяю через Debug.Assert. В сложных системах без пользовательского интерфейса иногда бывает чуть ли не единственным признаком того что что то идет не так, т.к. зачастую "защитный" код таких систем позволяет сохранить работоспособность и даже выдать результат, который не всегда рационально разбирать.<BR/>Несколько соображений которые я держу в голове при использовании Assert.<BR/>Через него проверяться должна ТОЛЬКО ЛОГИКА РАБОТЫ АЛГОРИТМА или его частей, и не в коем случае пользовательский ввод или информация пришедшая извне (другой модуль, система, источник). А вот после обработки верфикатором и возможно исправления его алгоритмами обработки ввода самое милое дело проверить эти самые алгоритмы через Assert (часто они просты, тест писать излишне, а проверить нужно). Юниттесты на все нюансы работы алгоритма и его частей не напишешь, а рефакторить до бесконечности тоже не всегда разумно.<BR/>И еще не забывать, что кроме Debug.Assert, есть и Trace.Assert.<BR/>Debug.Assert иногда можно нагрузить тяжелыми проверками, которых не будет в релизной конфигурации.<BR/>Направление вывода Debug.Assert можно декларативно менять через конфиг, т.е., например, писать в лог файл.ssdihttps://www.blogger.com/profile/14519245792253686773noreply@blogger.comtag:blogger.com,1999:blog-8864435396524375431.post-16928694668084817182009-04-06T13:09:00.000+03:002009-04-06T13:09:00.000+03:00Этот комментарий был удален автором.ssdihttps://www.blogger.com/profile/14519245792253686773noreply@blogger.comtag:blogger.com,1999:blog-8864435396524375431.post-73930951402572484872009-02-13T16:48:00.000+02:002009-02-13T16:48:00.000+02:00Спасибо за столь ценную информацию.Спасибо за столь ценную информацию.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-8864435396524375431.post-62938945758096186932009-02-03T12:47:00.000+02:002009-02-03T12:47:00.000+02:00Кроме того, не стоит забывать о различной природе ...Кроме того, не стоит забывать о различной природе этих ассертов. TDD сродни синтетическим тестам, против тестов, которые работают в рантайме на живых данных.Igorhttps://www.blogger.com/profile/10232785741897411593noreply@blogger.comtag:blogger.com,1999:blog-8864435396524375431.post-69726964727125619002009-02-03T12:45:00.000+02:002009-02-03T12:45:00.000+02:00Одно другому не мешает, на самом деле. Особенно, к...Одно другому не мешает, на самом деле. Особенно, когда речь идет о валидации данных из внешних источников.<BR/><BR/>Но я бы пожалуй согласился, что Debug.Assert отойдет. Но не в пользу TDD, а в пользу Design by Contract, как более строгой и стройной форме этих самых ассертов.Igorhttps://www.blogger.com/profile/10232785741897411593noreply@blogger.comtag:blogger.com,1999:blog-8864435396524375431.post-86722786341157352392009-02-03T12:37:00.000+02:002009-02-03T12:37:00.000+02:00Еще один момент про Debug.Assert. Имхо эта практик...Еще один момент про Debug.Assert. Имхо эта практика будет все менее популярна в связи с внедрением в массы TDD (юнит тестов). ТДД покрывает бизнес-метод тестами, в т.ч. тестами на то, как метод будет реагировать на некорректные значения параметров. Т.е. ТДД стимулирует исправлять код метода, чтобы тесты проходили. А Дебаг.ассерт - это своего рода "юнит тест лайт", внедренный в код метода, т.е. это не стимулирует делать код лучше, а только засоряет код описаниями, когда методу будет фигово :-)<BR/>Пример: Функция, которая делит х на у:<BR/>private decmal Div(decimal x, decimal y) {<BR/> return x/y;<BR/>}<BR/><BR/>Вариант_1 с изменением кода для Дебаг.Ассерт:<BR/>надо добавить в метод код: Debug.Assert(y != 0);<BR/><BR/>Вариант_2 с изменением кода для юнит тестов:<BR/>надо добавить в метод код: if (y == 0) {throw new MyBussinesException()};<BR/>+ добавить 2 юнит теста: нормальное деление на y!=0 и там, где кидается бизнес эксепшн.<BR/><BR/>Имхо, 2-ой вариант намного лучше: а) повышается качество исходного кода б) исх. код не замусоривается лишним кодом в) в случае неправильного использования метода узнаем об этом мы (разработчики) на стадии прогона юнит-тестов, а не кастомеры в лайф версии.Anonymoushttps://www.blogger.com/profile/16086659212511843152noreply@blogger.comtag:blogger.com,1999:blog-8864435396524375431.post-45185253919322493272009-02-03T11:44:00.000+02:002009-02-03T11:44:00.000+02:00Есть мнение в ИТ, что дебаг.ассерт юзают крутые гу...Есть мнение в ИТ, что дебаг.ассерт юзают крутые гуру, но никто из опрошенных гуру эту информацию не подтвердил, но и не опроверг :DAnonymoushttps://www.blogger.com/profile/16086659212511843152noreply@blogger.com