tag:blogger.com,1999:blog-8596733192274108952.post7457858559438025240..comments2024-03-12T06:00:18.305+02:00Comments on Programming stuff: Начать ли использовать контракты?Sergey Teplyakovhttp://www.blogger.com/profile/14300835272589262297noreply@blogger.comBlogger18125tag:blogger.com,1999:blog-8596733192274108952.post-38755873162650071162015-11-04T22:49:52.724+02:002015-11-04T22:49:52.724+02:00*Только в Ensures тут вбрасывается не ArgumentOutO...*Только в Ensures тут вбрасывается не ArgumentOutOfRangeException, а ContractException. Anonymoushttps://www.blogger.com/profile/03549688828980390992noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-9252023096437017272015-11-04T22:48:11.960+02:002015-11-04T22:48:11.960+02:00На MSDN встречаются примеры, где Contract.Requires...На MSDN встречаются примеры, где Contract.Requires используется в середине методов. Например тут: https://msdn.microsoft.com/ru-ru/library/dd412883(v=vs.110).aspx<br />Как такое возможно?<br /><br />Не совсем понятно, как быть, если нужно проверить входные параметры метода на соответствие какому-то сложному условию и вбросить исключение, если условие не выполняется.<br /><br />Например, пишу конструктор для треугольника. Хотелось бы написать так:<br /><br />private List sideList;<br />private int perimeter;<br /><br />public Triangle(int a, int b, int c)<br />{<br /> sideList = new List«int»(3) { a, b, c};<br /> perimeter = sideList.Sum();<br /> Contract.Requires«ArgumentOutOfRangeException»(Contract.ForAll(sideList, side > 0));<br /> Contract.Requires«ArgumentOutOfRangeException»(Contract.ForAll(sideList, side => side < perimeter - side));<br />}<br /><br />А получается только так:<br /><br />private List«int» sideList;<br />private int perimeter;<br />public Triangle(int a, int b, int c)<br />{<br /> Contract.Requires«ArgumentOutOfRangeException»(a> 0);<br /> Contract.Requires«ArgumentOutOfRangeException»(b> 0);<br /> Contract.Requires«ArgumentOutOfRangeException»(c> 0);<br /> Contract.Ensures(Contract.ForAll(sideList, side => side < perimeter - side));<br /> var sideList = new List«int»(3) { a, b, c};<br /> var perimeter = sideList.Sum();<br />}<br /><br />Только в Ensures тут вбрасывается не ArgumentOutOfRangeException, а не ContractException. Возможно ли решить такую проблему при помощи контрактов, или лучше в таких случаях использовать if-throw ?Anonymoushttps://www.blogger.com/profile/03549688828980390992noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-35190806225643877532015-11-04T19:02:09.852+02:002015-11-04T19:02:09.852+02:00Идея EnsuresOnThrow в том, чтобы "убедиться&q...Идея EnsuresOnThrow в том, чтобы "убедиться", что при возникновении исключения состояние объекта/мира находится в определенном состоянии.<br /><br />Вот пример метода, который упадет с нарушением постусловия:<br /><br />private static string field;<br />static void Foo()<br />{<br /> Contract.EnsuresOnThrow<Exception>(field == "hello");<br /> throw new Exception();<br />}<br /><br />Этот метод говорит, что когда произойдет исключение, поле 'field' должно содержать значение "hello". Поскольку это не так, то текущий метод упадет не просто со сгенерированным исключением, а с ContractException-ом, в котором будет сказано, что исключительное постусловие не выполнено, и поле field не было равно "hello".<br />Sergey Teplyakovhttps://www.blogger.com/profile/14300835272589262297noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-44241556955350459962015-11-04T13:31:12.372+02:002015-11-04T13:31:12.372+02:00Я тут нафлудил - при публикации комментария обреза...Я тут нафлудил - при публикации комментария обрезается TException в угловых скобках.Anonymoushttps://www.blogger.com/profile/03549688828980390992noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-87085865279773296482015-11-04T13:20:59.554+02:002015-11-04T13:20:59.554+02:00Сергей!
Пробую использовать контракты. Второй ден...Сергей!<br /><br />Пробую использовать контракты. Второй день не могу решить проблему с методом <br />Contract.EnsuresOnThrow(...);<br /><br />По какой-то причине он у меня не отрабатывается (в пошаговом режиме - попросту в него не заходит). В то время как Contract.Requires(...), Contract.Requires(...), Contract.Ensures(...) отрабатывают корректно. Попытки найти решение в поисковом сервисе ничего не дали.<br /><br />Например, в следующей функции Exception никогда не будет вызван:<br /><br />static void Main(string[] args)<br />{<br />Contract.EnsuresOnThrow(true);<br />}<br /><br />У меня что-то не так с настройками?Anonymoushttps://www.blogger.com/profile/03549688828980390992noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-19999487025093994242015-11-04T13:19:39.587+02:002015-11-04T13:19:39.587+02:00Этот комментарий был удален автором.Anonymoushttps://www.blogger.com/profile/03549688828980390992noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-15082360224764578692015-11-04T13:11:54.388+02:002015-11-04T13:11:54.388+02:00Этот комментарий был удален автором.Anonymoushttps://www.blogger.com/profile/03549688828980390992noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-23712299809359171572015-08-20T18:00:20.359+03:002015-08-20T18:00:20.359+03:00Спасибо, не знал. Есть ли документация как использ...Спасибо, не знал. Есть ли документация как использовать?Karen Tazayanhttps://www.blogger.com/profile/17340270363445850237noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-2958470485381503512015-08-19T17:38:20.996+03:002015-08-19T17:38:20.996+03:00Проблнма решается путем использования своих common...Проблнма решается путем использования своих common targets, в которых будет определено нужное свойство. Так никто ничего не забудет. Sergey Teplyakovhttps://www.blogger.com/profile/14300835272589262297noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-21622553436665513792015-08-19T16:50:42.826+03:002015-08-19T16:50:42.826+03:00Евгений, но все равно ведь при каждом новом проект...Евгений, но все равно ведь при каждом новом проекте надо лезть в csproj и писать инклуд файла пропертей.<br />Я к тому, что при динамичной разработке попробуй всей ораве разъясни зачем это надо делать и проконтролируй, чтобы не забыли.Anonymoushttps://www.blogger.com/profile/04263621854767568342noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-91382073548707207812015-08-17T03:37:29.296+03:002015-08-17T03:37:29.296+03:00Для этого можно использовать специальный NuGet: Co...Для этого можно использовать специальный NuGet: <a href="https://www.nuget.org/packages/CodeContracts.MSBuild/" rel="nofollow">CodeContracts.MSBuild</a>.<br />Надо бы его тоже подпилить под новые платформы и обновить версию.Anonymoushttps://www.blogger.com/profile/05202812632999806619noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-32203653585406651372015-08-14T20:33:58.991+03:002015-08-14T20:33:58.991+03:00В обсуждении на rsdn-е кто-то предложил похожий по...В обсуждении на rsdn-е кто-то предложил похожий подход. Очень круто, но в обычном языке получается несколько многословно, ну и непонятно, как более сложные утверждения тут выражать...Sergey Teplyakovhttps://www.blogger.com/profile/14300835272589262297noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-4534584770218285242015-08-14T20:29:44.678+03:002015-08-14T20:29:44.678+03:00Я пользу от применения программирования по контакт...Я пользу от применения программирования по контакту (благодаря данному блогу) ощутил ещё года два назад. Выявлять, диагностировать и понимать требования к ПО становится намного легче, особенно на ранних стадиях разработки. Но вот, что касается Code Contracts для VS его, как уже отметил Сергей, его ещё допиливать и допиливать. Одно из основных препятствий, не считая вышеперечисленные, из-за чего пришлось отказаться от использования в некоторых проектах – автоматизированные билды, к машинам-агентам которых нет доступа (VSO в том числе). Там использовать CC не получится. А в целом было бы здорово иметь все это из коробки. Может user voice для этого организовать?Karen Tazayanhttps://www.blogger.com/profile/17340270363445850237noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-49527260602423855962015-08-14T15:17:12.049+03:002015-08-14T15:17:12.049+03:00угловые скобочки посъедались. NonZero<int> и...угловые скобочки посъедались. NonZero<int> и std::function<R(NonZero<T>)>Anonymoushttps://www.blogger.com/profile/03159331377410025186noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-80941397617155862342015-08-14T15:14:44.682+03:002015-08-14T15:14:44.682+03:00Альтернатива контрактам - это использование систем...Альтернатива контрактам - это использование системы типов и оверлоады. В Mercury есть mode'ы, в других функциональных языках используют "фантомные типы". В общем нелинейность проверки контрактов лечится правильной аннотацией значений которые могут попадать в функцию и которые могут выходить из функции.<br /><br />Например можно иметь что-то вроде:<br /><br />// annotation<br />template NonZero { T value; operator T() const; };<br />int safeDiv(int, NonZero);<br /><br />// handle both cases<br />template <br />R nonZero(std::function)>, std::function, T);<br /><br />// developers knows what he does<br />template <br />NonZero assertNonZero(T) noexcept;<br /><br />template <br />NonZero assumeNonZero(T); // thorws something<br /><br />// can't write safeDiv(42,2) and safeDiv(42,0)<br />int myfunc(int x)<br />{<br /> retur nonZero([](NonZero x) { return 42/x;}, []() { return -1; }, x);<br />}Anonymoushttps://www.blogger.com/profile/03159331377410025186noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-62451975801942377152015-08-14T07:54:49.441+03:002015-08-14T07:54:49.441+03:00Да, совет Евгения очень дельный. Это и правда лучш...Да, совет Евгения очень дельный. Это и правда лучший способ контроля за параметрами всех проектов в солюшене!Sergey Teplyakovhttps://www.blogger.com/profile/14300835272589262297noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-83626173922351145462015-08-14T00:12:27.051+03:002015-08-14T00:12:27.051+03:00По поводу "наточить топор" для простой и...По поводу "наточить топор" для простой и легкой настройки множества проектов - можно сделать один файл с студийными пропертями, а во всех vcsproj просто заинклудить его.<br />Я так вынес в один файл настройки по билду для почти 250 проектов в солюшене. В оригинальных файлах проекта осталось только имя, разные гуиды и референсы.<br />После этого например смена фреймворка с 4 на 4.5.1 заняла час: 5 минут на редактирование файла, 25 минут на проверку компиляции. еще пол часа на автотесты. Так что рекомендую.Anonymoushttps://www.blogger.com/profile/03999939535124861861noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-28869635601162907802015-08-13T09:58:37.712+03:002015-08-13T09:58:37.712+03:00Уже больше двух лет пользуюсь CodeContracts в прое...Уже больше двух лет пользуюсь CodeContracts в проекте (благодаря этому блогу). Но в силу особенностей проекта: я единственный разработчик, WinForms приложение - насладиться плюсами не удалось, а погоревать от минусов довелось сполна. Первые месяцы проекта, пока статический анализатор справлялся - всё было супер, код писался дикими темпами, вставка нужных проверок спасала от долгих дебагов. Первая печалька была, когда пришлось отключить статический анализатор, но руки по привычке используя сниппеты вставляли проверки аргуменов, какое-то время...потом рукам стало лень...=( <br />В солюшене больше 50 проектов и случается, что приходится ручками настраивать обработку контрактов...наточить топор нет времени и сил =(<br />Инструмент такой хочется, хотя бы с минимальным функционалом, но максимально удобный, даже хочется за него заплатить.Anonymoushttps://www.blogger.com/profile/08487458460734515606noreply@blogger.com