Уменьшение влияния человеческого фактора при...

Post on 24-Jan-2015

1.005 Views

Category:

Technology

3 Downloads

Preview:

Click to see full reader

DESCRIPTION

В этом докладе мы постараемся рассказать о принципах разработки инструментов для написания бизнес-логики, позволяющих сократить количество ошибок. Речь пойдет о нескольких практиках, принятых в отделе технологического развития нашей компании. Принципы будут проиллюстрированы на примере инструментария компании для платформы Microsoft .NET. Максимум статических проверок. Под статическими проверками мы понимаем проверки времени компиляции. Этот принцип является важным, но, к сожалению, зачастую недооценивается разработчиками инструментария разработки. Проверки времени компиляции могут отлавливать большой спектр ошибок. Есть и другая особенность – это удобство. Ошибки времени исполнения сложнее воспринимаются, труднее найти причину ошибки. Разнообразие и декларативность проверок. Проверки общего назначения удобно задавать в декларативном виде. При этом сами проверки должен осуществлять фреймворк. За счет уменьшения дублирования и декларативности снижается вероятность ошибок. Проверки должны быть, как техническими, так и уровня доменной модели. Мы будем говорить о проверках уровня доменной модели. Возможность анализа декларативных проверок. Любые ограничения порождают некоторую модель. Эту модель (проверки) можно формально верифицировать. Вообще, проблема доказательства большинства свойств программы невозможна. Этот вопрос выходит далеко за рамки нашего доклада. Но существует возможность верификации более слабых (менее выразительных моделей). Во второй части мы обсудим функционал, который мы называем "состояния". Эти "состояния" образуют что-то вроде автомата, или структуру Крипке. Так вот, существуют алгоритмы проверки выполнимости темпоральных логик на таких структурах.

TRANSCRIPT

Уменьшение влияния человеческого фактора при

разработке бизнес-приложений (на примере CustIS Universal)

Алексеев Алексейalekseev.aleksei@gmail.com

aalekseev@custis.ru

Николай Гребневngrebnev@gmail.comngrebnev@custis.ru

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

• Человеческий фактор разработке ПО• Методы снижения человеческого фактора• CustIS Universal• LINQ как инструмент повышения качества• Модель состояний• Верификация модели состояний

ЧЕЛОВЕЧЕСКИЙ ФАКТОР В РАЗРАБОТКЕ ПО

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

• Многозначный термин, описывающий возможность принятия человеком ошибочных или алогичных решений в конкретных ситуациях (Wikipedia®)

• Выражение, означающее в США область знания и профессию, определяемые в Европе термином эргономика (Словарь практического психолога)

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

Методологии

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

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

МЕТОДЫ СНИЖЕНИЯ ЧЕЛОВЕЧЕСКОГО ФАКТОРА

Стоимость ошибки

КодКод

СборкаСборка

Unit-тестыUnit-тесты

Code ReviewCode Review

ТестированиеТестирование

ЭксплуатацияЭксплуатация

Стоимость ошибки

Unit-тестыUnit-тесты

Code ReviewCode Review

ТестированиеТестирование

ЭксплуатацияЭксплуатация

Аспекты качества инструментария

• Диагностика• Удобство использования• Скорость• Эффективность

Эффективность

С++: if (a = 2)

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

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

CUSTIS UNIVERSAL

?

ORM

• технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования (Wikipedia®)

Класс → таблицаОбъект → запись

Свойство → колонка

Примеры ORM

• Hibernate • Entity Framework• CustIS Universal

Процесс компиляции

• Выдача ошибок в IDE• Время отклика• Локализация ошибки• Плагины компиляции

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

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

LINQ КАК ИНСТРУМЕНТ ПОВЫШЕНИЯ КАЧЕСТВА

LINQ (Language-Integrated Query)

• является революционной инновацией которая является мостом между миром объектов и миром данных (Microsoft©)

До LINQ

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

LINQ

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

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

• Проверка типов при компиляции• IntelliSense• Единообразие при работе с данными

LINQ (Language-Integrated Query) является революционной инновацией в Visual Studio 2008 и .NET Framework версии 3.5, которая является мостом между миром объектов и миром данных. Традиционно запросы к данным выражаются в виде простых строк без проверки типов при компиляции или поддержки IntelliSense. Кроме того, разработчику приходится изучать различные языки запросов для каждого типа источника данных: базы данных SQL, XML-документов, различных веб-служб и т. д. LINQ делает запрос первоклассной конструкцией языка в C# и Visual Basic. Можно создавать запросы к строго типизированным коллекциям объектов с помощью зарезервированных слов языка и знакомых операторов. На следующем рисунке показан частично выполненный запрос LINQ к базе данных SQL Server в C# с полной проверкой типов и поддержкой IntelliSense.

                                                                                            

Стоимость ошибки

СборкаСборка

Код

Unit-тестыUnit-тесты

Code ReviewCode Review

ТестированиеТестирование

ЭксплуатацияЭксплуатация

LINQ и данные

Требуется:

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

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

from Post p in Session.Postswhere p.Blog.Author.Id == author.Idselect p;

from Post p in Session.Postswhere p.Blog.Author.Id == (author == null ? null : author.Id)select p;

LINQ к доменной модели и ООП

Но:Указанный член типа "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;

LINQ к доменной модели невозможно или не имеет смысла использовать

Решение (на примере Universal)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;

from Employee e in Sessionselect e.IsManager

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

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

Корректность [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; }}

Анализ реализации

static Expression<Func<MyEntity, MyEntity>> Attr1Impl

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

static Expression<Func<MyEntity, MyEntity>> Attr2Impl

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

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

Стоимость ошибки

КодКод

Unit-тестыUnit-тесты

Code ReviewCode Review

ТестированиеТестирование

ЭксплуатацияЭксплуатация

Сборка

Роль Linq2Model

• Удобно использовать• Единый инструмент• Раннее обнаружение ошибок• Интеграция со средствами разработки

МОДЕЛЬ СОСТОЯНИЙ

Состояния/// <summary> Состояние автомобиля. </summary>

public enum AutoState{ // Машина стоит и не заведена. Stopped = 1,

// Машина заведена и не едет. Winded = 2,

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

Императивные проверки

public virtual void WindUp(){ if (State != AutoState.Stopped) throw new InvalidEntityStateException(...);

...}

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

...}

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

[StateRestriction(AutoState.Stopped)]public virtual void WindUp() {...}

[StateRestriction(AutoState.Winded)]public virtual bool TryRun(){...}

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

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

ВЕРИФИКАЦИЯ МОДЕЛИ СОСТОЯНИЙ

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

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

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

В ЗАКЛЮЧЕНИЕ

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

• Удобные инструменты• Раннее обнаружение ошибок (на этапе

набора кода или компиляции)• Интегрированность в среду разработки

СustIS Universal

Вопросы?

Следите за http://team.custis.ru

top related