Your SlideShare is downloading. ×
0
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Cтатический анализ кода (на примере DDD-фреймворка)

506

Published on

Они расскажут как при разработке бизнес-приложений в модели Domain-driven design они предупреждают ошибки программиста с помощью статического анализа кода и доменной модели. А именно: возможности …

Они расскажут как при разработке бизнес-приложений в модели Domain-driven design они предупреждают ошибки программиста с помощью статического анализа кода и доменной модели. А именно: возможности ORM-платформы по статическому анализу, преимущества широкого использования Linq, декларативных ограничений, модель состояний и формальной верификации элементов доменной модели.

Они разберут, в чем заключается удобство разработчика по использованию статического анализа и простота применения механизмов для задания формальных ограничений на модель предметной области. Интеграция средств статического анализа ORM в среду разработки, невозможность игнорирования ошибок, гарантия прохождения всех статических проверок до первого запуска программы. Ограниченные возможности запросов Linq к модели предметной области по сравнению с Linq to Objects и пути их преодоления.

Они расскажут, как обстоят дела с аналогичными механизмами в других ORM-системах и почему они решили реализовать собственную платформу для поддержки разработки в рамках DDD.

Published in: Technology, Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
506
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • 17:30 Отдел технол. Развития DDD- фреймворк для прикладных разработчиков
  • 17:35
  • 17:35
  • Человеческий фактор – причина многих проблем. В разработке ПО является одним из ключевых.
  • Можно решить проблему методологией, а можно – техникой (инфраструктурой). Если техникой получается сделать хорошо – то лучше техникой. Дальше будем говорить именно про технические средства
  • 17:35
  • Анимировать по строчкам?
  • Диагностика должна быть понятной, достаточно подробной, локальной Проверки не должны существенно замедлять цикл сборки Жесткость модели?
  • В промышленном ПО важнее корректность, предсказуемость
  • 17:35
  • Фреймворк для построения бизнес-логики в терминах модели предметной области ( DDD) Доп. этап «посткомпиляции», где осуществляются проверки модели доменной области
  • 17:35
  • * Статическая проверка, is
  • 17:35
  • 17:35
  • Доменная модель страхового случая.
  • Transcript

    • 1. Статический анализ кода ( на примере DDD-фреймворка) Алексеев Алексей [email_address] [email_address] Николай Гребнев [email_address] [email_address]
    • 2. Структура доклада <ul><li>Человеческий фактор разработке ПО </li></ul><ul><li>Статические проверки </li></ul><ul><li>DDD -фреймворк </li></ul><ul><li>Поддержка LINQ </li></ul><ul><li>Модель состояний </li></ul><ul><li>Верификация модели состояний </li></ul>
    • 3. Структура доклада <ul><li>Человеческий фактор разработке ПО </li></ul><ul><li>Статические проверки </li></ul><ul><li>DDD -фреймворк </li></ul><ul><li>Поддержка LINQ </li></ul><ul><li>Модель состояний </li></ul><ul><li>Верификация модели состояний </li></ul>
    • 4. Человеческий фактор
    • 5. Общепринятые методологии <ul><li>Ручное тестирование </li></ul><ul><li>Автоматическое тестирование, TDD </li></ul><ul><li>Code Review </li></ul>
    • 6. Средства разработки
    • 7. Структура доклада <ul><li>Человеческий фактор разработке ПО </li></ul><ul><li>Статические проверки </li></ul><ul><li>DDD -фреймворк </li></ul><ul><li>Поддержка LINQ </li></ul><ul><li>Модель состояний </li></ul><ul><li>Верификация модели состояний </li></ul>
    • 8. Стоимость исправления ошибок <ul><li>Момент выявления ошибки : </li></ul><ul><li>До написания кода </li></ul><ul><li>Статические проверки </li></ul><ul><li>Unit- тесты </li></ul><ul><li>Code Review </li></ul><ul><li>Интеграционные тесты </li></ul><ul><li>Ручные тесты </li></ul><ul><li>Ошибка при эксплуатации </li></ul>
    • 9. Стоимость исправления ошибок <ul><li>Момент выявления ошибки : </li></ul><ul><li>До написания кода </li></ul><ul><li>Статические проверки </li></ul><ul><li>Unit- тесты </li></ul><ul><li>Code Review </li></ul><ul><li>Интеграционные тесты </li></ul><ul><li>Ручные тесты </li></ul><ul><li>Ошибка при эксплуатации </li></ul>
    • 10. Аспекты статических проверок <ul><li>Диагностика </li></ul><ul><li>Удобство использования </li></ul><ul><li>Скорость </li></ul><ul><li>Эффективность </li></ul>
    • 11. Эффективность статических проверок <ul><li>С++ : if (a = 2) </li></ul>if (ptr == null) Корректность if (ptr) Лаконичность VS
    • 12. Структура доклада <ul><li>Человеческий фактор разработке ПО </li></ul><ul><li>Статические проверки </li></ul><ul><li>DDD -фреймворк </li></ul><ul><li>Поддержка LINQ </li></ul><ul><li>Модель состояний </li></ul><ul><li>Верификация модели состояний </li></ul>
    • 13. Терминология <ul><li>ORM – object relational mapper: </li></ul><ul><ul><li>Отображение: </li></ul></ul><ul><ul><ul><li>Класс -&gt; таблица </li></ul></ul></ul><ul><ul><ul><li>Объект -&gt; запись </li></ul></ul></ul><ul><ul><ul><li>Свойство -&gt; колонка </li></ul></ul></ul><ul><ul><li>Запросы </li></ul></ul><ul><ul><li>Процесс компиляции </li></ul></ul>
    • 14. ВАЛИДАЦИЯ МОДЕЛИ ВО ВРЕМЯ КОМПИЛЯЦИИ <ul><li>Демонстрация </li></ul>
    • 15. Структура доклада <ul><li>Человеческий фактор разработке ПО </li></ul><ul><li>Статические проверки </li></ul><ul><li>DDD -фреймворк </li></ul><ul><li>Поддержка LINQ </li></ul><ul><li>Модель состояний </li></ul><ul><li>Верификация модели состояний </li></ul>
    • 16. Запросы к доменной модели <ul><li>На языке ORM ( HQL Hibernate): </li></ul><ul><li>LINQ: </li></ul>SimpleQuery &lt; Post &gt; q = new SimpleQuery &lt; Post &gt;( @“from Post p where p.Blog.Author = ?&amp;quot; , author); return q.Execute(); from Post p in Session.Posts where p.Blog.Author == author select p;
    • 17. Преимущества LINQ <ul><li>Статическая типизация </li></ul><ul><li>IntelliSense </li></ul><ul><li>Полная интеграция в язык программирования </li></ul>
    • 18. Максимальная типизация в Linq <ul><li>Требуется: </li></ul><ul><li>Но в Entity Framework: </li></ul><ul><ul><li>Не удалось создать константу с типом &amp;quot;Тип замыкания&amp;quot;. В этом контексте поддерживаются только типы-примитивы (&amp;quot;например Int32, String и Guid&amp;quot;). </li></ul></ul>Employee leader = Session.Employee.First(); var q = from Department d in Session.Department where d.Leader == leader select d;
    • 19. Свойства, используемые в запросах <ul><li>В Entity Framework: </li></ul><ul><ul><li>Указанный член типа &amp;quot;IsManager&amp;quot; не поддерживается в выражениях LINQ to Entities. Поддерживаются только инициализаторы, члены сущности и свойства навигации сущности. </li></ul></ul>public class Employee { … public bool IsManager { get { return Subordinates.Count() &gt; 0; } } … } … var q = from Employee e in Session.Employee where e.IsManager select e; q.ToList();
    • 20. Решение <ul><li>public class Employee </li></ul><ul><li>{ </li></ul><ul><li>… </li></ul><ul><li>[ Attr ] </li></ul><ul><li>[ Implemented ] </li></ul><ul><li>public abstract bool IsManager { get ; } </li></ul><ul><li>// Это реализация для атрибута IsManager. </li></ul><ul><li>static Expression&lt; Func &lt; Employee , bool &gt;&gt; IsManagerImpl </li></ul><ul><li>{ </li></ul><ul><li>get { return e =&gt; Subordinates.Count() &gt; 0 ; } </li></ul><ul><li>} </li></ul><ul><li>… </li></ul><ul><li>} </li></ul><ul><li>… </li></ul><ul><li>var q = from Employee e in Session.Employee </li></ul><ul><li>where e.IsManager </li></ul><ul><li>select e; </li></ul><ul><li>q.ToList(); </li></ul>
    • 21. Свойства, используемые в запросах from Employee e in Session select e.IsManager from Employee e in Session select Subordinates.Count() &gt; 0
    • 22. Корректность <ul><li>[ Attr ] </li></ul><ul><li>[ Implemented ] </li></ul><ul><li>public abstract MyEntity Attr1 { get ; } </li></ul><ul><li>[ Attr ] </li></ul><ul><li>[ Implemented ] </li></ul><ul><li>public abstract MyEntity Attr2 { get ; } </li></ul><ul><li>static Expression &lt; Func &lt; MyEntity , MyEntity &gt;&gt; Attr1Impl </li></ul><ul><li>{ </li></ul><ul><li>get { return e =&gt; e.Attr2 ; } </li></ul><ul><li>} </li></ul><ul><li>static Expression &lt; Func &lt; MyEntity , MyEntity &gt;&gt; Attr2Impl </li></ul><ul><li>{ </li></ul><ul><li>get { return e =&gt; e.Attr1 ; } </li></ul><ul><li>} </li></ul>
    • 23. Пример анализа реализации <ul><li>static Expression &lt; Func &lt; MyEntity , MyEntity &gt;&gt; Attr1Impl </li></ul><ul><li>{ </li></ul><ul><li>get { return e =&gt; e.Attr2; } </li></ul><ul><li>} </li></ul><ul><li>static Expression &lt; Func &lt; MyEntity , MyEntity &gt;&gt; Attr2Impl </li></ul><ul><li>{ </li></ul><ul><li>get { return e =&gt; e.Attr1; } </li></ul><ul><li>} </li></ul>Обнаружена циклическая зависимость
    • 24. Структура доклада <ul><li>Человеческий фактор разработке ПО </li></ul><ul><li>Статические проверки </li></ul><ul><li>DDD -фреймворк </li></ul><ul><li>Поддержка LINQ </li></ul><ul><li>Модель состояний </li></ul><ul><li>Верификация модели состояний </li></ul>
    • 25. Состояния <ul><li>/// &lt;summary&gt; Состояние автомобиля. &lt;/summary&gt; </li></ul><ul><li>[ Flags ] </li></ul><ul><li>[ State ] </li></ul><ul><li>public enum AutoState </li></ul><ul><li>{ </li></ul><ul><li>/// &lt;summary&gt; Машина стоит и не заведена. &lt;/summary&gt; </li></ul><ul><li>Stopped = 1, </li></ul><ul><li>/// &lt;summary&gt; Машина заведена и не едет. &lt;/summary&gt; </li></ul><ul><li>Winded = 2, </li></ul><ul><li>/// &lt;summary&gt; Машина едет. &lt;/summary&gt; </li></ul><ul><li>Driving = 4, </li></ul><ul><li>} </li></ul>
    • 26. Императивные проверки <ul><li>[ Method ] </li></ul><ul><li>public virtual void WindUp() </li></ul><ul><li>{ </li></ul><ul><li>if (State != AutoState .Stopped) </li></ul><ul><li>throw new In validEntityStateException (...) ; </li></ul><ul><li>... </li></ul><ul><li>} </li></ul><ul><li>[ Method ] </li></ul><ul><li>public virtual bool TryRun() </li></ul><ul><li>{ </li></ul><ul><li>if (State != AutoState .Winded) </li></ul><ul><li>throw new InvalidEntityStateException (...); </li></ul><ul><li>... </li></ul><ul><li>} </li></ul>
    • 27. Декларативные ограничения <ul><li>[ Method ] </li></ul><ul><li>[ StateRestriction ( AutoState .Stopped)] </li></ul><ul><li>public virtual void WindUp() </li></ul><ul><li>{...} </li></ul><ul><li>[ Method ] </li></ul><ul><li>[ StateRestriction ( AutoState .Winded)] </li></ul><ul><li>public virtual bool TryRun() </li></ul><ul><li>{...} </li></ul>
    • 28. Декларативные ограничения <ul><li>[ Method ] </li></ul><ul><li>[ StateRestriction ( AutoState .Stopped)] </li></ul><ul><li>[ StateTransition ( AutoState .Stopped, </li></ul><ul><li>AutoState .Stopped | AutoState .Winded)] </li></ul><ul><li>public virtual void WindUp() </li></ul><ul><li>{...} </li></ul><ul><li>[ Method ] </li></ul><ul><li>[ StateRestriction ( AutoState .Winded)] </li></ul><ul><li>[ StateTransition ( AutoState .Winded, </li></ul><ul><li>AutoState .Driving | AutoState .Stopped)] </li></ul><ul><li>public virtual bool TryRun() </li></ul><ul><li>{ ... } </li></ul>
    • 29. Структура доклада <ul><li>Человеческий фактор разработке ПО </li></ul><ul><li>Статические проверки </li></ul><ul><li>DDD -фреймворк </li></ul><ul><li>Поддержка LINQ </li></ul><ul><li>Модель состояний </li></ul><ul><li>Верификация модели состояний </li></ul>
    • 30. Структура Крипке
    • 31. Структура Крипке
    • 32. CTL , формулы состояний <ul><li>CTL - Computation tree logic. </li></ul><ul><li>Формулы состояний: </li></ul><ul><ul><li>A f - A ll: f должен выполняться на всех путях из данного состояния ; </li></ul></ul><ul><ul><li>E f - E xists: существует хотя бы один путь из данного состояния, на котором выполняется f . </li></ul></ul><ul><ul><li>В этом определении f – формула пути. </li></ul></ul>
    • 33. CTL , формулы пути <ul><li>Формулы пути: </li></ul><ul><ul><li>X p - Ne x t: p выполняется на следующем состоянии пути; </li></ul></ul><ul><ul><li>G p - G lobally: p выполняется на всех последующих состояниях пути; </li></ul></ul><ul><ul><li>F p - F inally p выполняется на одном из последующих состояний пути; </li></ul></ul><ul><ul><li>p U q - U ntil: p выполняется, пока на каком-то из состояний пути не выполнится q , причем q должен обязательно когда-нибудь выполнится в будущем. </li></ul></ul><ul><ul><li>p – формула состояния или предикат </li></ul></ul>
    • 34. CTL
    • 35. &nbsp;
    • 36. &nbsp;
    • 37. &nbsp;
    • 38. &nbsp;
    • 39. Вопросы ? Следите за http://team.custis.ru
    • 40. Ссылки <ul><li>Следите за новостями http://team.custis.ru </li></ul><ul><li>Ю.Г. Карпов. Model Checking. Верификация параллельных и распределенных программных систем. </li></ul><ul><li>http://www-verimag.imag.fr/~sifakis/TuringAwardPaper-Apr14.pdf Turing award. Model Checking: Algorithmic Verification and Debugging . </li></ul><ul><li>http://www. introducinglinq.com/files/folders/5/download.aspx LINQ introduction . </li></ul><ul><li>http://www.rsdn.ru/article/design/Code_Contracts.xml Проектирование по контракту. </li></ul>

    ×