Статический анализ кода в ddd

41
Статический анализ кода (на примере DDD-фреймворка) Алексеев Алексей [email protected] [email protected] Николай Гребнев [email protected] [email protected]

Upload: aleksei-alekseev

Post on 20-Jul-2015

526 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Статический анализ кода в DDD

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

Алексеев Алексей[email protected]

[email protected]

Николай Гребнев[email protected]@custis.ru

Page 2: Статический анализ кода в DDD

Структура доклада

• Введение• Статические проверки• DDD-фреймворк• Поддержка LINQ• Модель состояний• Верификация модели состояний

Page 3: Статический анализ кода в DDD

Структура доклада

• Введение• Статические проверки• DDD-фреймворк• Поддержка LINQ• Модель состояний• Верификация модели состояний

Page 4: Статический анализ кода в DDD

Человеческий фактор

Page 5: Статический анализ кода в DDD

Общепринятые методологии

• Ручное тестирование• Автоматическое тестирование, TDD• Code Review

Page 6: Статический анализ кода в DDD

Средства разработки

Page 7: Статический анализ кода в DDD

Структура доклада

• Введение• Статические проверки• ДДД-фреймворк• Поддержка LINQ• Модель состояний• Верификация модели состояний

Page 8: Статический анализ кода в DDD

Стоимость исправления ошибок

Момент выявления ошибки:

До написания кода Статические проверки Unit-тесты Code Review Интеграционные тесты Ручные тесты Ошибка при эксплуатации

Цена

Page 9: Статический анализ кода в DDD

До написания кода Статические проверки Unit-тесты Code Review Интеграционные тесты Ручные тесты Ошибка при эксплуатации

Стоимость исправления ошибок

Время выявления ошибки:

Цена

Page 10: Статический анализ кода в DDD

Аспекты статических проверок

• Диагностика• Скорость• Полнота

Page 11: Статический анализ кода в DDD

Полнота статических проверок

С++: if (a = 2)

if (ptr == null)Корректность

if (ptr)ЛаконичностьVS

Page 12: Статический анализ кода в DDD

Структура доклада

• Введение• Статические проверки• DDD-фреймворк• Поддержка LINQ• Модель состояний• Верификация модели состояний

Page 13: Статический анализ кода в DDD

Терминология

• ORM – object relational mapper:– Отображение:• Класс → таблица• Объект → запись• Свойство → колонка

– Запросы– Процесс компиляции

Page 14: Статический анализ кода в DDD

ВАЛИДАЦИЯ МОДЕЛИ ВО ВРЕМЯ КОМПИЛЯЦИИ

Демонстрация

Page 15: Статический анализ кода в DDD

Статическая проверка метамодели

Page 16: Статический анализ кода в DDD

Структура доклада

• Введение• Статические проверки• DDD-фреймворк• Поддержка LINQ• Модель состояний• Верификация модели состояний

Page 17: Статический анализ кода в DDD

ПОДДЕРЖКА LINQ

Полнота поддержки LINQ напрямую влияет на снижение влияния человеческого фактора в разработке ПО

Page 18: Статический анализ кода в DDD

Запросы к доменной модели

• На языке ORM:

• LINQ:

SimpleQuery<Post> q = new SimpleQuery<Post>( @“from Post p where p.Blog.Author = ?", author); return q.Execute();

from Post p in Session.Postswhere p.Blog.Author == authorselect p;

Page 19: Статический анализ кода в DDD

Преимущества LINQ

• Статическая типизация• IntelliSense• Полная интеграция в язык

программирования

Page 20: Статический анализ кода в DDD

Требуется:

Но в Entity Framework:Не удалось создать константу с типом "Тип замыкания". В этом контексте поддерживаются только типы-примитивы ("например Int32, String и Guid").

Максимальная типизация в Linq

Employee leader = Session.Employee.First();var q = from Department d in Session.Department where d.Leader == leader select d;

Page 21: Статический анализ кода в DDD

Свойства, используемые в запросах

В Entity Framework:Указанный член типа "IsManager" не поддерживается в выражениях LINQ to Entities. Поддерживаются только инициализаторы, члены сущности и свойства навигации сущности.

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();

Page 22: Статический анализ кода в DDD

Решениеpublic class Employee{ … [Attr] [Implemented] public abstract bool IsManager {get; }

// Это реализация для атрибута IsManager. static Expression<Func<Employee, bool>> IsManagerImpl { get { return e => Subordinates.Count() > 0; } } …}…var q = from Employee e in Session.Employee where e.IsManager select e;q.ToList();

Page 23: Статический анализ кода в DDD

from Employee e in Sessionselect e.IsManager

Свойства, используемые в запросах

from Employee e in Sessionselect Subordinates.Count() > 0

Page 24: Статический анализ кода в DDD

Корректность [Attr][Implemented]public abstract MyEntity Attr1 {get; } [Attr][Implemented]public abstract MyEntity Attr2 {get; }

static Expression<Func<MyEntity, MyEntity>> Attr1Impl{ get {return e => e.Attr2; }}

static Expression<Func<MyEntity, MyEntity>> Attr2Impl{ get {return e => e.Attr1; }}

Page 25: Статический анализ кода в DDD

Пример анализа реализации

static Expression<Func<MyEntity, MyEntity>> Attr1Impl

{ get {return e => e.Attr2; }}

static Expression<Func<MyEntity, MyEntity>> Attr2Impl

{ get {return e => e.Attr1; }}

Обнаружена циклическая зависимость

Page 26: Статический анализ кода в DDD

Структура доклада

• Введение• Статические проверки• Валидация модели во время компиляции• Поддержка LINQ• Модель состояний• Верификация модели состояний

Page 27: Статический анализ кода в DDD

Состояния/// <summary> Состояние автомобиля. </summary>[Flags][State]public enum AutoState{ /// <summary> Машина стоит и не заведена.

</summary> Stopped = 1,

/// <summary> Машина заведена и не едет. </summary>

Winded = 2,

/// <summary> Машина едет. </summary> Driving = 4,}

Page 28: Статический анализ кода в DDD

Императивные проверки[Method]public virtual void WindUp(){ if (State != AutoState.Stopped) throw new InvalidEntityStateException(...); ...}

[Method]public virtual bool TryRun(){ if (State != AutoState.Winded) throw new InvalidEntityStateException(...); ...}

Page 29: Статический анализ кода в DDD

Декларативные ограничения

[Method]

[StateRestriction(AutoState.Stopped)]

public virtual void WindUp() {...}

[Method]

[StateRestriction(AutoState.Winded)]

public virtual bool TryRun(){...}

Page 30: Статический анализ кода в DDD

Декларативные ограничения

[Method][StateRestriction(AutoState.Stopped)][StateTransition(AutoState.Stopped, AutoState.Stopped | AutoState.Winded)]public virtual void WindUp() {...}

[Method][StateRestriction(AutoState.Winded)][StateTransition(AutoState.Winded, AutoState.Driving | AutoState.Stopped)]public virtual bool TryRun(){...}

Page 31: Статический анализ кода в DDD

Структура доклада

• Введение• Статические проверки• Валидация модели во время компиляции• Поддержка LINQ• Модель состояний• Верификация модели состояний

Page 32: Статический анализ кода в DDD

Структура Крипке

Page 33: Статический анализ кода в DDD

Структура Крипке

Page 34: Статический анализ кода в DDD

CTL, формулы состояний

CTL - Computation tree logic.

Формулы состояний:– A f - All: f должен выполняться на всех путях из

данного состояния;– E f - Exists: существует хотя бы один путь из

данного состояния, на котором выполняется f.

В этом определении f – формула пути.

Page 35: Статический анализ кода в DDD

CTL, формулы пути

Формулы пути: – X p - Next: p выполняется на следующем

состоянии пути; – G p - Globally: p выполняется на всех

последующих состояниях пути; – F p - Finally p выполняется на одном из

последующих состояний пути; – p U q - Until: p выполняется, пока на каком-то

из состояний пути не выполнится q , причем q должен обязательно когда-нибудь выполнится в будущем.

– p – формула состояния или предикат

Page 36: Статический анализ кода в DDD

CTL

Page 37: Статический анализ кода в DDD
Page 38: Статический анализ кода в DDD
Page 39: Статический анализ кода в DDD
Page 40: Статический анализ кода в DDD
Page 41: Статический анализ кода в DDD

Список литературы

• Ю.Г. Карпов. Model Checking. Верификация параллельных и распределенных программных систем.

• http://www-verimag.imag.fr/~sifakis/TuringAwardPaper-Apr14.pdf Turing award. Model Checking: Algorithmic Verification and Debugging.

• http://www.introducinglinq.com/files/folders/5/download.aspx LINQ introduction.

• http://www.rsdn.ru/article/design/Code_Contracts.xml Проектирование по контракту.