Скачать презентацию Программная инженерия Зарецкий Дмитрий Викторович Email dmitryzar stbpwr com Скачать презентацию Программная инженерия Зарецкий Дмитрий Викторович Email dmitryzar stbpwr com

4626dd84aaed8dedb19c2ad5b122f0e8.ppt

  • Количество слайдов: 57

Программная инженерия Зарецкий Дмитрий Викторович Email: dmitryzar@stbpwr. com Программная инженерия Зарецкий Дмитрий Викторович Email: [email protected] com

Программа курса Ø Программное обеспечение: природа и качество. Классификация ПО. Требования и показательные качества Программа курса Ø Программное обеспечение: природа и качество. Классификация ПО. Требования и показательные качества ПО. Виды систем. Принципы инженерии ПО. Ø Основные понятия объектноориентированного программирования. Объекты, сообщения, интерфейсы, классы, полиморфизм.

Обзор языков, платформ, технологий и средств разработки. . NET Framework и J 2 EE Обзор языков, платформ, технологий и средств разработки. . NET Framework и J 2 EE – сравнительный анализ. Основы CORBA, DCOM, EJB, . NET Remoting. Реляционные и объектно-ориентированные базы данных. Интернет приложения, веб сервисы. Средства управления исходным кодом (CVS, Subversion, Source. Safe) Ø Стратегии распределенных вычислений. Связи. Процессы. Синхронизация. Репликация. Отказоустойчивость. Распределенные системы объектов, файлов, документов. Распределенные системы согласования. Ø

Проектирование, спецификация. Составление технических заданий. Методы сбора информации. UML. Use case диаграммы. Диаграммы классов, Проектирование, спецификация. Составление технических заданий. Методы сбора информации. UML. Use case диаграммы. Диаграммы классов, объектов, компонентов, состояний, последовательностей, действий. ORM. CASE инструменты. Спецификации асинхронных систем. Логические, алгебраические спецификации. Концептуальный, логический и физический дизайн. Прототипирование. Паттерны проектирования. Ø Процесс разработки программного обеспечения. Структура проектной группы. Стадии проекта. Нотации оформления кода. cамодокументированность кода. Рефакторинг. Экстремальное программирование. Безопасность кода. Принципы построения GUI. Ведение параллельных версий. Компиляция и отладка ПО. Оптимизация. Ø

Тестирование. Верификация. Методы тестирования (методы “черного и белого ящика”) Планы тестирования проекта, компонентов. Модели Тестирование. Верификация. Методы тестирования (методы “черного и белого ящика”) Планы тестирования проекта, компонентов. Модели анализа. Автоматизированные регрессивные тесты. Тестирование классов и иерархий классов. Тестирование распределенных объектов. Тестирование интернет приложений. Ø Внедрение продукта. Разработка пользовательской документации. Создание программы установки. Обучение пользователей, поддержка ПО. Повторное использование и переносимость ПО, реинженерия. Ø

Управление. Ø Планирование проекта. Анализ рисков. Оценка затрат. Внутренняя проектная документация. Командная работа, распределение Управление. Ø Планирование проекта. Анализ рисков. Оценка затрат. Внутренняя проектная документация. Командная работа, распределение ролей и ответственности (централизованный, децентрализованный и смешанный тип управления). Диаграммы Ганта. Графики PERT. Контроль качества. Анализ текущего состояния проекта. Стабильность/нестабильность проекта, построение графиков интенсивности возникновения и устранения ошибок. Средства поддержки управления проектом. Модель развития функциональных возможностей CMM.

Литература Ø Ø Ø Ø Мартин Фаулер Архитектура корпоративных программых приложений. Москва. Изд. Вильямс Литература Ø Ø Ø Ø Мартин Фаулер Архитектура корпоративных программых приложений. Москва. Изд. Вильямс 2004. Карло Гецци, Мехди Джазайери, Дино Мандриоли. Основы инженерии программного обеспечения. Санкт-Петербург БХВ 2005. Э. Таненбаум, М. ван Стеен. Распределенные системы. Принципы и парадигмы. Изд. Питер 2004. Джон Макгрегор, Девид Сайкс Тестирование объектноориентированного программного обеспечения. 2002 Beck. Test-Driven Development: By Example. Addison-Wisley, 2003. Эд Салливан. Время-деньги. Microsoft Press, Русская редакция. Москва 2002. Бек, К. Экстремальное программирование. Библиотека программиста. СПб. : Питер, 2002.

Ссылки Microsoft Solution Framework White Paper June 2002, http: //www. microsoft. com/msf/ Ø Object Ссылки Microsoft Solution Framework White Paper June 2002, http: //www. microsoft. com/msf/ Ø Object Management Group’s Unified Modeling Language http: //www. omg. org/uml/ Ø Русскоязычный сайт программистов http: //www. rsdn. ru Ø Сайт посвященный вопросам программирования под. NET http: //www. gotdotnet. ru Ø

Жизненный цикл программного обеспечения. Ø Envisioning. Анализ и спецификация требований. Ø Planning. Проектирование. Ø Жизненный цикл программного обеспечения. Ø Envisioning. Анализ и спецификация требований. Ø Planning. Проектирование. Ø Developing. Кодирование. Ø Stabilizing. Тестирование. Ø Deploying. Сборка. Поставка и эксплуатация.

Качества программного обеспечения Ø Внутренние и внешние качества, связь между ними. Ø Оценка продукта. Качества программного обеспечения Ø Внутренние и внешние качества, связь между ними. Ø Оценка продукта. Ø Оценка процесса создания ПО.

Корректность (correctness) – соответствие требованиям функциональной спецификации Ø Надежность (reliability) – вероятность того, что Корректность (correctness) – соответствие требованиям функциональной спецификации Ø Надежность (reliability) – вероятность того, что программное обеспечение будет работать как ожидалось в течении определенного интервала времени. Ø Надежность Корректность Ø Устойчивость(stability) – правильное поведение программы даже в обстоятельствах не предусмотренных в спецификации

Ø Производительность (productivity). Ø Эффективность (performance). Подходы к расчету производительности системы: 1. 2. 3. Ø Производительность (productivity). Ø Эффективность (performance). Подходы к расчету производительности системы: 1. 2. 3. Измерение Анализ Имитационное моделирование. Ø Удобство. Дружественный интерфейс. Ø Верифицируемость.

Ø Рассмотреть влияние пользовательского интерфейса (GUI) на надежность. Ø Рассмотреть влияние пользовательского интерфейса (GUI) на надежность.

Сопровождаемость В среднем затраты на сопровождение превышают 60% от общей стоимости программного обеспечения. Категории Сопровождаемость В среднем затраты на сопровождение превышают 60% от общей стоимости программного обеспечения. Категории сопровождения Корректирующее – устранение ошибок. Ø Настраивающее – адаптация приложения к изменениям среды. Ø Усовершенствующее – изменение ПО с целью улучшения некоторых из его качеств Ø Проблема унаследованного ПО. Необходимость проведение обратного инжиниринга и реинженеринга.

Ремонтопригодность (repairability) – возможность устранения дефектов приемлемыми усилиями. Ø Способность к эволюции. Ø Повторная Ремонтопригодность (repairability) – возможность устранения дефектов приемлемыми усилиями. Ø Способность к эволюции. Ø Повторная применимость. Ø Переносимость (portability) – возможность работать в различных системах. Ø Понятность. Ø Интероперабельность (interoperability) – возможность ПО сотрудничать с другими системами. Ø Продуктивность. Ø

Как повторная применимость может влиять на надежность продуктов? Ø Как можно использовать наследование для Как повторная применимость может влиять на надежность продуктов? Ø Как можно использовать наследование для увеличения повторной применимости? Ø Какова связь повторной применимости и переносимости? Ø Как можно применить переносимость для web страниц? Ø Что можно сказать о способности к эволюции открытых систем? Ø Можно ли использовать подсчет количества строк для измерения продуктивности. Ø

Своевременность ПО Функциональность Требования пользователя Реальные возможности системы T 0 T 1 T 2 Своевременность ПО Функциональность Требования пользователя Реальные возможности системы T 0 T 1 T 2 T 3 Наиболее часто встречающиеся проблемы в разработке ПО.

Классификация ПО. Ø Информационные системы. Хранение, поиск, извлечение данных. Ø Системы реального времени. Должны Классификация ПО. Ø Информационные системы. Хранение, поиск, извлечение данных. Ø Системы реального времени. Должны реагировать на событие в течении строго предопределенного периода времени. Ø Распределенные системы. Располагаются на нескольких независимых или частично независимых компьютерах. Ø Встроенные системы. ПО является одним из множества компонентов, часто не имеют GUI.

Охарактеризуйте такие качества как тестируемость, целостность, легкость в использовании, изучаемость. Приведите примеры. Ø Оценить Охарактеризуйте такие качества как тестируемость, целостность, легкость в использовании, изучаемость. Приведите примеры. Ø Оценить преимущества и недостатки повторной используемости методов в применении к программному процессу. Ø Какова роль протоколов TCP/IP в интероперабельности? Ø Можно ли оценивать процесс создания ПО с точки зрения интероперабельности? Ø

Принципы создания ПО. Принципы Методы и приемы Методологии Инструментальные средства Принципы создания ПО. Принципы Методы и приемы Методологии Инструментальные средства

Ø Строгость и формальность. Ø Разделение задач. Преимущества и недостатки (избыточность, взаимоблокировки). Ø Модульность. Ø Строгость и формальность. Ø Разделение задач. Преимущества и недостатки (избыточность, взаимоблокировки). Ø Модульность. Проектирование снизу вверх и сверху вниз.

Преимущества модульности Разложимость – возможность разложить систему на простые части. Ø Компонуемость – возможность Преимущества модульности Разложимость – возможность разложить систему на простые части. Ø Компонуемость – возможность собрать систему из готовых модулей. Ø Возможность интерпретировать систему как состоящую из простых частей. Ø Возможность модифицировать систему путем модификации небольшого количества частей. Ø

Внутримодульная и межмодульная связность. А Б Внутримодульная и межмодульная связность. А Б

Ø Какие могут быть причины низкой внутримодульной связности? Как их устранить? Ø Какие могут Ø Какие могут быть причины низкой внутримодульной связности? Как их устранить? Ø Какие могут быть причины высокой межмодульной связности? Как их устранить?

Абстракция Выделяем существенные аспекты явления и игнорируем его подробности. Переменные в языках программирования можно Абстракция Выделяем существенные аспекты явления и игнорируем его подробности. Переменные в языках программирования можно рассматривать как абстракции адресов ячеек памяти. От каких подробностей абстрагируются переменные языков программирования? Каковы преимущества и недостатки использования такой абстракции? Ø Модель жизненного цикла ПО является абстракцией программного процесса. Почему? Ø Какие абстракции полезны конечному пользователю, проектировщику и специалисту по поддержке приложений? Ø

Ø Предусмотрение изменений. Принцип позднего связывания. Ø Общность. Каждый раз, когда надо решить какую-либо Ø Предусмотрение изменений. Принцип позднего связывания. Ø Общность. Каждый раз, когда надо решить какую-либо проблему, постарайтесь сосредоточится на решении более общей проблемы, которая может быть скрыта за рассматриваемой задачей. Ø Инкрементность. Итерационный процесс разработки. Способ получения раннего отклика от клиента.

Ø Какое взаимоотношение между обобщением и предусмотрением изменений? Ø Какое взаимоотношение между общностью и Ø Какое взаимоотношение между обобщением и предусмотрением изменений? Ø Какое взаимоотношение между общностью и абстракцией? Ø Какое взаимоотношение между формальностью и предусмотрением изменений?

Парадигмы программирования Будем говорить, что язык поддерживает данный стиль программирования, если он предоставляет средства, Парадигмы программирования Будем говорить, что язык поддерживает данный стиль программирования, если он предоставляет средства, которые делают использование стиля удобным (достаточно простым, надежным и эффективным) Ø Язык не поддерживает технику программирования, если для написания соответсвующей программы требуются чрезмерные усилия или мастерство. Ø

Литература Ø Бьерн Страуструп Язык программирования С++. Москва. Binom 2000. Ø Джеффри Рихтер Программирование Литература Ø Бьерн Страуструп Язык программирования С++. Москва. Binom 2000. Ø Джеффри Рихтер Программирование на платформе. NET Framework. Ø Брюс Эккель Философия JAVA. СПб. Питер, 2000.

Процедурное программирование Реши, какие требуются процедуры; используй наилучшие доступные алгоритмы. Пример. double sqrt(double arg) Процедурное программирование Реши, какие требуются процедуры; используй наилучшие доступные алгоритмы. Пример. double sqrt(double arg) { //text } void f() { double root 2 = sqrt(2); }

Модульное программирование Реши, какие требуются модули; разбей программу так, чтобы скрыть данные в модулях. Модульное программирование Реши, какие требуются модули; разбей программу так, чтобы скрыть данные в модулях. Пример. Реализовать стек, удовлетворяющий следующим требованиям: 1. Предоставить пользовательский интерфейс для стека (например, функции push() и pop(), помещающий данные в стек и извлекающий их оттуда) 2. Гарантировать, что представление стека доступно только через этот пользовательский интерфейс. 3. Обеспечить инициализацию стека до первого использования.

namespace Stack { //интерфейс void push(char); char pop(); } void f() { Stack: : namespace Stack { //интерфейс void push(char); char pop(); } void f() { Stack: : push(‘c’); if(Stack: : pop()!=‘c’) error (“Такое невозможно”); } namespace Stack{ //реализация const int max_size = 200; char v[max_size]; int top = 0; void push(char c){/*Поместить в стек. */} char pop() {/*Извлечь из стека. */} }

Раздельная компиляция stack. h Интерфейс стека user. cpp #include “stack. h” Использование стека stack. Раздельная компиляция stack. h Интерфейс стека user. cpp #include “stack. h” Использование стека stack. cpp #include “stack. h” Использование стека

Модули, определяющие типы namespace Stack { struct Rep; typedef Rep& stack; stack create(); void Модули, определяющие типы namespace Stack { struct Rep; typedef Rep& stack; stack create(); void destroy(stack s); void push(stack s, char с); char pop(stack s); } void f() { Stack: : stack s 1 = Stack: : create(); //Создать новый стек Stack: : stack s 2 = Stack: : create(); //и еще один

Stack: : push(s 1, ’c’); Stack: : push(s 2, ’k’); If(Stack: : pop(s 1)!=‘c’) Stack: : push(s 1, ’c’); Stack: : push(s 2, ’k’); If(Stack: : pop(s 1)!=‘c’) throw Bad. Pop(); If(Stack: : pop(s 2)!=‘k’) throw Bad. Pop(); Stack: : destroy(s 1); Stack: : destroy(s 2); } namespace Stack{ struct Rep{ char v[max_size]; int top; }; const int max = 16; Rep stacks[max]; … }

Объектно-ориентированное программирование Реши, какие требуются классы; обеспечь полный набор операций для каждого класса; явно Объектно-ориентированное программирование Реши, какие требуются классы; обеспечь полный набор операций для каждого класса; явно вырази общность через наследование. Инкапсуляция – объединение в единое целое данных и алгоритмов обработки этих данных. Ø Наследование – свойство объектов порождать своих потомков. Ø Полиморфизм – свойство родственных объектов (имеющих общего родителя) решать схожие по смыслу проблемы разными способами. Ø

Классический пример для случая отображения различных фигур: А. Диаграмма классов. В. Объединение классов в Классический пример для случая отображения различных фигур: А. Диаграмма классов. В. Объединение классов в единый пакет.

Определение наследников class Circle extends Shape {…} // java class Circle: Shape {…} // Определение наследников class Circle extends Shape {…} // java class Circle: Shape {…} // C# Пример создания общих методов для всех наследников: void rotate(Shape s, int angle) { s. rotate(angle); s. draw(); } Circle c = new Circle(); Polygon p = new Polygon(); rotate(c, 60); rotate(p, 40);

Ø Можно ли при создании класса Circle воспользоваться реализацией из класса Shape не применяя Ø Можно ли при создании класса Circle воспользоваться реализацией из класса Shape не применяя наследование? Если возможно, то как? Ø Всегда ли использование наследования несет только преимущества? Ø Приведите примеры возможного использования наследования.

Более сложный пример использования наследования. Более сложный пример использования наследования.

Множественное наследование В отличии от C++ для Java и. NET множественное наследование от обычных Множественное наследование В отличии от C++ для Java и. NET множественное наследование от обычных классов не поддерживается. Оно заменяется на одиночное наследование от обычного класса и множественное от интерфейсов. Реfлизация серверного класса в NET Remoting.

Модификаторы доступа Private – доступен только методам в определяющем типе и вложенных в него Модификаторы доступа Private – доступен только методам в определяющем типе и вложенных в него типах. Ø Protected – доступен только методам в этом типе или одном из производных типов. Ø Public – доступен всем методам. Ø Нестандартные модификаторы доступа и атрибуты в разных языках: internal, friend, abstract, sealed, final, readonly Атрибут static (Shared) – означает, что поле частично определяет состояние типа, а не объекта.

Члены класса Ø Константа – идентификатор, определяющий некую постоянную величину. public const Int 32 Члены класса Ø Константа – идентификатор, определяющий некую постоянную величину. public const Int 32 Max. Entiries. In. List = 50; Ø Поле – неизменяемое или изменяемое значение, определяющее состояние типа или объекта (статическое или нестатическое) public static readonly Random = new Random(); static Int 32 number. Of. Writes = 0; public readonly String path. Name =“Untitled”; public File. Stream fs;

Ø Конструктор экземпляра – метод, используемый для установки в корректное начальное состояние экземпляров полей Ø Конструктор экземпляра – метод, используемый для установки в корректное начальное состояние экземпляров полей нового объекта. class Some. Type{ Int 32 x; String s; public Some. Type(){/* Общая часть */} public Some. Type(Int 32 x): this(){ this. x = x; } public Some. Type(String s): this(){ this. s = s; } }

Ø Конструктор типа (статический конструктор, конструктор класса, инициализатор типа) – метод, используемый для установки Ø Конструктор типа (статический конструктор, конструктор класса, инициализатор типа) – метод, используемый для установки в корректное начальное состояние статических полей типа. class Some. Type { static Int 32 x = 5; static Some. Type() { x = 10; } } Чему будет равна переменнная x после обращения к классу Some. Type?

Ø Метод – функция, выполняющая операции, которые изменяют или опрашивают состояние типа(статический метод) или Ø Метод – функция, выполняющая операции, которые изменяют или опрашивают состояние типа(статический метод) или объекта (экземплярный метод). public static Boolean Reference. Equals(Object, obj. AObject obj. B) static void Set. Val(out Int 32 v) {…} void Add. Val(ref Int 32 v) {…} static Int 32 Add(params Int 32[] values) {…} Ø Перегрузка оператора – метод, определяющий, что нужно проделать с объектом, применении к нему оператора. Class Complex { public static Complex operator+(Complex c 1, Complex c 2) {…} }

Ø Оператор преобразования – метод, определяющий как неявно/явно привести объект из одного типа в Ø Оператор преобразования – метод, определяющий как неявно/явно привести объект из одного типа в другой. Class Rational { public Rational(Int 32 numerator) {…} public Rational(Single value) {…} public Int 32 To. Int 32() {…} public Single To. Single() {…} //Неявно создает Rational из Int 32 и Single public static implicit operator Rational(Int 32 numerator) { return new Rational(numerator); } public static implicit operator Rational(Single value) { return new Rational(value); }

//Явно возвращает объет типа Int 32, полученный из Rational public static explicit operator Int //Явно возвращает объет типа Int 32, полученный из Rational public static explicit operator Int 32(Rational r) { return r. To. Int 32(); } //Явно возвращает объет типа Single, полученный из Rational public static explicit operator Single(Rational r) { return r. To. Single(); } } Пример использования: Rational r 1 = 5; //Неявное приведение Int 32 к Rational r 2 = 1. 202 e 18; //Неявное приведение Single к Rational Int 32 x = (Int 32) r 1; //Явное приведение Rational к Int 32 Single s = (Single) r 1; //Явное приведение Rational к Single

Ø Свойство – метод, который позволяет применить простой синтаксис для установки или получения части Ø Свойство – метод, который позволяет применить простой синтаксис для установки или получения части логического состояния типа или объекта, не нарушая это состояние. public class Employee { private String _Name; private Int 32 _Age; //Ключевое слово value идентифицирует //новое значение public String Name { get { return _Name; } set { _Name = value; } }

public Int 32 Age { get { return _Age; } set { if (value public Int 32 Age { get { return _Age; } set { if (value < 0) throw new Out. Of. Rage. Exception(); _Age = value; } } }

Ø Событие (статическое, экземплярное) – механизм, который позволяет типу/объекту посылать уведомление слушающему типу/объекту. Объявление Ø Событие (статическое, экземплярное) – механизм, который позволяет типу/объекту посылать уведомление слушающему типу/объекту. Объявление события в C# public delegate void Data. Changed. Delegate ( Event. Value. Changed val); public event Data. Changed. Delegate Data. Changed; if(Data. Changed !=null ) Data. Changed(null); //вызов ((IForm)_table. Form). Data. Changed += new Data. Changed. Delegate( Control. Constructor. List. Form_Data. Changed); Пример подписки на события компонетов Swing (java) JText. Field name = new JText. Field(25); Class Name. L implements Action. Listner {…} name. add. Action. Listner(new Name. L());

Исключения Компактное размещение кода, выполняющего очистку, и его гарантированное исполнение. Ø Централизованное хранение кода, Исключения Компактное размещение кода, выполняющего очистку, и его гарантированное исполнение. Ø Централизованное хранение кода, имеющего дело с исключительными ситуациями. Ø Облегчение поиска и исправления ошибок в коде. Ø Следует отметить, что при разработке API Win 32 и COM Microsoft отказались от использования исключений для уведомления вызывающего кода о сбоях. Вопрос: Какая методика используется в API Win 32 и COM?

void Some. Method() { try { } catch (Invalid. Cast. Exception) { } catch void Some. Method() { try { } catch (Invalid. Cast. Exception) { } catch (Null. Reference. Exception) { } catch (Exception e) { throw; } catch { throw; } finally { } }

Обобщенное программирование Реши, какие требуются алгоритмы; параметризируй их так, чтобы они могли работать со Обобщенное программирование Реши, какие требуются алгоритмы; параметризируй их так, чтобы они могли работать со множеством подходящих типов и структур данных. Шаблоны в C++ template class Stack { T * v; int max_size; int top; public: Stack (int s); ~Stack(); void push(T); T pop (); }

Префикс template<class T> делает T параметром объявления, которому этот префикс предшествует. Функции-члены можно определить Префикс template делает T параметром объявления, которому этот префикс предшествует. Функции-члены можно определить следующим образом: template void Stack: : push(T c) { if (top == max_size) throw Overflow (); v[top] = c; top ++; } Использование стека: Stack sc (200); Stack scplx(30); sc. push(‘c’); Scplx. push (complex(1, 2));

Generic в C# 2. 0 List<int> items = new List<int> (); items. Add(1); items. Generic в C# 2. 0 List items = new List (); items. Add(1); items. Add(2); items[1]++; int I = items[1]; //Объявление class List {…}

Generic в java 1. 5 List<String> items = new Array. List<String> (); items. Add(“some Generic в java 1. 5 List items = new Array. List (); items. Add(“some text”); String str = items. get(0); //Объявление class Generic. List {…} Последовательности и связные списки …