Статический анализ кода (на примере DDD-фреймворка) Алексеев Алексей alekseev.aleksei@gmail.com aalekseev@custis.ru Николай Гребнев ngrebnev@gmail.com.

Презентация:



Advertisements
Похожие презентации
NHibernate что, где, когда Артур Дробинский ЗетаСофт Томск, 2012.
Advertisements

Михаил Черномордиков Developer Evangelist, Microsoft Россия
ИТЕРАТОРЫ И LINQ Лекция 1. Интерфейс IEnumerable и IEnumerator Любая коллекция реализует интерфейс IEnumerable. public interface IEnumerable : IEnumerable.
Автоматическая генерация кода программ с явным выделением состояний Канжелев С.Ю. магистрант СПбГУ ИТМО Шалыто А.А. доктор технических наук профессор СПбГУ.
Инструменты Visual Studio для контроля качества и безопасности кода MSSD-3 Александр Яковлев, Microsoft.
Автоматическая генерация схемы реляционной базы данных на основе объектной схемы данных Богданов Алексей.
Классы в С#. Перечисления С# Перечисление задает конечное множество возможных значений, которые могут получать объекты класса перечисление. [атрибуты][модификаторы]
Object Relational Mapping (ORM) Объектно-реляционное отображение.
КРУПНЕЙШАЯ ТЕХНИЧЕСКАЯ КОНФЕРЕНЦИЯ MICROSOFT В УКРАИНЕ.
Вадим Думбравану руководитель проектов D7. ORM. Object-relational mapping Недостатки текущего похода в API На каждую сущность программируется свой GetList,
Делегаты Как созданные объекты могут посылать сообщения тем объектам, которые их породили? При программировании под Windows на С и C++ основное средство.
Полиморфизм Полиморфизм (polymorphism) - последний из трех "китов", на которых держится объектно-ориентированное программирование Слово это можно перевести.
ORM Паттерны. Repository Repository (хранилище) выступает в роли посредника между слоем домена и слоем отображения данных, предоставляя интерфейс в виде.
АтрибутыСериализация Лекция 10. Атрибуты Сериализация.
Необъектные модели предметной области Докладчик: Максим Цепков Опыт CUSTIS.
Методология объектно- ориентированного программирования.
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
Полиморфизм. Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Источники данных LINQ РУБД. LINQ (Language Integrated Query, язык интегрированных запросов ) это технология, которая позволяет разработчикам формировать.
ИНТЕГРАЦИЯ МЕТОДОВ ИНЖЕНЕРИИ ЗНАНИЙ И ИНЖЕНЕРИИ ПРОГРАММ СИСТЕМА УПРАВЛЕНИЯ ЗНАНИЯМИ KNOWLEDGE.NET Участники проекта Новиков Антон Владимирович Сигалин.
Транксрипт:

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

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

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

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

Общепринятые методологии Ручное тестирование Автоматическое тестирование, TDD Code Review

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

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

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

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

Аспекты статических проверок Диагностика Скорость Полнота

Полнота статических проверок С++: if (a = 2) if (ptr == null) Корректность if (ptr) Лаконичность VS

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

Терминология ORM – object relational mapper: – Отображение: Класс таблица Объект запись Свойство колонка – Запросы – Процесс компиляции

ВАЛИДАЦИЯ МОДЕЛИ ВО ВРЕМЯ КОМПИЛЯЦИИ Демонстрация

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

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

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

Запросы к доменной модели На языке ORM: LINQ: SimpleQuery q = new SimpleQuery Post p where p.Blog.Author = ?", author); return q.Execute(); from Post p in Session.Posts where p.Blog.Author == author select p;

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

Требуется: Но в 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;

Свойства, используемые в запросах В 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();

Решение public class Employee { … [Attr] [Implemented] public abstract bool IsManager {get; } // Это реализация для атрибута IsManager. static Expression > IsManagerImpl { get { return e => Subordinates.Count() > 0; } } … } … var q = from Employee e in Session.Employee where e.IsManager select e; q.ToList();

from Employee e in Session select e.IsManager Свойства, используемые в запросах from Employee e in Session select Subordinates.Count() > 0

Корректность [Attr] [Implemented] public abstract MyEntity Attr1 {get; } [Attr] [Implemented] public abstract MyEntity Attr2 {get; } static Expression > Attr1Impl { get {return e => e.Attr2; } } static Expression > Attr2Impl { get {return e => e.Attr1; } }

Пример анализа реализации static Expression > Attr1Impl { get {return e => e.Attr2; } } static Expression > Attr2Impl { get {return e => e.Attr1; } } Обнаружена циклическая зависимость

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

Состояния /// Состояние автомобиля. [Flags] [State] public enum AutoState { /// Машина стоит и не заведена. Stopped = 1, /// Машина заведена и не едет. Winded = 2, /// Машина едет. Driving = 4, }

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

Декларативные ограничения [Method] [StateRestriction(AutoState.Stopped)] public virtual void WindUp() {...} [Method] [StateRestriction(AutoState.Winded)] public virtual bool TryRun() {...}

Декларативные ограничения [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() {...}

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

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

CTL, формулы состояний CTL - Computation tree logic. Формулы состояний: – A f - All: f должен выполняться на всех путях из данного состояния; – E f - Exists: существует хотя бы один путь из данного состояния, на котором выполняется f. В этом определении f – формула пути.

CTL, формулы пути Формулы пути: – X p - Next: p выполняется на следующем состоянии пути; – G p - Globally: p выполняется на всех последующих состояниях пути; – F p - Finally p выполняется на одном из последующих состояний пути; – p U q - Until: p выполняется, пока на каком-то из состояний пути не выполнится q, причем q должен обязательно когда-нибудь выполнится в будущем. – p – формула состояния или предикат

CTL

Список литературы Ю.Г. Карпов. Model Checking. Верификация параллельных и распределенных программных систем. Turing award. Model Checking: Algorithmic Verification and Debugging. LINQ introduction. Проектирование по контракту.