Уменьшение влияния человеческого фактора при
разработке бизнес-приложений (на примере CustIS Universal)
Алексеев Алексей[email protected]
Николай Гребнев[email protected]@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
Top Related