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

697 views

Published on

Они расскажут как при разработке бизнес-приложений в модели 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
697
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

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

    1. 1. Статический анализ кода ( на примере DDD-фреймворка) Алексеев Алексей [email_address] [email_address] Николай Гребнев [email_address] [email_address]
    2. 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. 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. 4. Человеческий фактор
    5. 5. Общепринятые методологии <ul><li>Ручное тестирование </li></ul><ul><li>Автоматическое тестирование, TDD </li></ul><ul><li>Code Review </li></ul>
    6. 6. Средства разработки
    7. 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. 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. 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. 10. Аспекты статических проверок <ul><li>Диагностика </li></ul><ul><li>Удобство использования </li></ul><ul><li>Скорость </li></ul><ul><li>Эффективность </li></ul>
    11. 11. Эффективность статических проверок <ul><li>С++ : if (a = 2) </li></ul>if (ptr == null) Корректность if (ptr) Лаконичность VS
    12. 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. 13. Терминология <ul><li>ORM – object relational mapper: </li></ul><ul><ul><li>Отображение: </li></ul></ul><ul><ul><ul><li>Класс -> таблица </li></ul></ul></ul><ul><ul><ul><li>Объект -> запись </li></ul></ul></ul><ul><ul><ul><li>Свойство -> колонка </li></ul></ul></ul><ul><ul><li>Запросы </li></ul></ul><ul><ul><li>Процесс компиляции </li></ul></ul>
    14. 14. ВАЛИДАЦИЯ МОДЕЛИ ВО ВРЕМЯ КОМПИЛЯЦИИ <ul><li>Демонстрация </li></ul>
    15. 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. 16. Запросы к доменной модели <ul><li>На языке ORM ( HQL Hibernate): </li></ul><ul><li>LINQ: </li></ul>SimpleQuery < Post > q = new SimpleQuery < Post >( @“from Post p where p.Blog.Author = ?&quot; , author); return q.Execute(); from Post p in Session.Posts where p.Blog.Author == author select p;
    17. 17. Преимущества LINQ <ul><li>Статическая типизация </li></ul><ul><li>IntelliSense </li></ul><ul><li>Полная интеграция в язык программирования </li></ul>
    18. 18. Максимальная типизация в Linq <ul><li>Требуется: </li></ul><ul><li>Но в Entity Framework: </li></ul><ul><ul><li>Не удалось создать константу с типом &quot;Тип замыкания&quot;. В этом контексте поддерживаются только типы-примитивы (&quot;например Int32, String и Guid&quot;). </li></ul></ul>Employee leader = Session.Employee.First(); var q = from Department d in Session.Department where d.Leader == leader select d;
    19. 19. Свойства, используемые в запросах <ul><li>В Entity Framework: </li></ul><ul><ul><li>Указанный член типа &quot;IsManager&quot; не поддерживается в выражениях LINQ to Entities. Поддерживаются только инициализаторы, члены сущности и свойства навигации сущности. </li></ul></ul>public class Employee { … public bool IsManager { get { return Subordinates.Count() > 0; } } … } … var q = from Employee e in Session.Employee where e.IsManager select e; q.ToList();
    20. 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< Func < Employee , bool >> IsManagerImpl </li></ul><ul><li>{ </li></ul><ul><li>get { return e => Subordinates.Count() > 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. 21. Свойства, используемые в запросах from Employee e in Session select e.IsManager from Employee e in Session select Subordinates.Count() > 0
    22. 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 < Func < MyEntity , MyEntity >> Attr1Impl </li></ul><ul><li>{ </li></ul><ul><li>get { return e => e.Attr2 ; } </li></ul><ul><li>} </li></ul><ul><li>static Expression < Func < MyEntity , MyEntity >> Attr2Impl </li></ul><ul><li>{ </li></ul><ul><li>get { return e => e.Attr1 ; } </li></ul><ul><li>} </li></ul>
    23. 23. Пример анализа реализации <ul><li>static Expression < Func < MyEntity , MyEntity >> Attr1Impl </li></ul><ul><li>{ </li></ul><ul><li>get { return e => e.Attr2; } </li></ul><ul><li>} </li></ul><ul><li>static Expression < Func < MyEntity , MyEntity >> Attr2Impl </li></ul><ul><li>{ </li></ul><ul><li>get { return e => e.Attr1; } </li></ul><ul><li>} </li></ul>Обнаружена циклическая зависимость
    24. 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. 25. Состояния <ul><li>/// <summary> Состояние автомобиля. </summary> </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>/// <summary> Машина стоит и не заведена. </summary> </li></ul><ul><li>Stopped = 1, </li></ul><ul><li>/// <summary> Машина заведена и не едет. </summary> </li></ul><ul><li>Winded = 2, </li></ul><ul><li>/// <summary> Машина едет. </summary> </li></ul><ul><li>Driving = 4, </li></ul><ul><li>} </li></ul>
    26. 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. 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. 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. 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. 30. Структура Крипке
    31. 31. Структура Крипке
    32. 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. 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. 34. CTL
    35. 39. Вопросы ? Следите за http://team.custis.ru
    36. 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>

    ×