4626dd84aaed8dedb19c2ad5b122f0e8.ppt
- Количество слайдов: 57
Программная инженерия Зарецкий Дмитрий Викторович Email: dmitryzar@stbpwr. com
Программа курса Ø Программное обеспечение: природа и качество. Классификация ПО. Требования и показательные качества ПО. Виды систем. Принципы инженерии ПО. Ø Основные понятия объектноориентированного программирования. Объекты, сообщения, интерфейсы, классы, полиморфизм.
Обзор языков, платформ, технологий и средств разработки. . NET Framework и J 2 EE – сравнительный анализ. Основы CORBA, DCOM, EJB, . NET Remoting. Реляционные и объектно-ориентированные базы данных. Интернет приложения, веб сервисы. Средства управления исходным кодом (CVS, Subversion, Source. Safe) Ø Стратегии распределенных вычислений. Связи. Процессы. Синхронизация. Репликация. Отказоустойчивость. Распределенные системы объектов, файлов, документов. Распределенные системы согласования. Ø
Проектирование, спецификация. Составление технических заданий. Методы сбора информации. 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 Management Group’s Unified Modeling Language http: //www. omg. org/uml/ Ø Русскоязычный сайт программистов http: //www. rsdn. ru Ø Сайт посвященный вопросам программирования под. NET http: //www. gotdotnet. ru Ø
Жизненный цикл программного обеспечения. Ø Envisioning. Анализ и спецификация требований. Ø Planning. Проектирование. Ø Developing. Кодирование. Ø Stabilizing. Тестирование. Ø Deploying. Сборка. Поставка и эксплуатация.
Качества программного обеспечения Ø Внутренние и внешние качества, связь между ними. Ø Оценка продукта. Ø Оценка процесса создания ПО.
Корректность (correctness) – соответствие требованиям функциональной спецификации Ø Надежность (reliability) – вероятность того, что программное обеспечение будет работать как ожидалось в течении определенного интервала времени. Ø Надежность Корректность Ø Устойчивость(stability) – правильное поведение программы даже в обстоятельствах не предусмотренных в спецификации
Ø Производительность (productivity). Ø Эффективность (performance). Подходы к расчету производительности системы: 1. 2. 3. Измерение Анализ Имитационное моделирование. Ø Удобство. Дружественный интерфейс. Ø Верифицируемость.
Ø Рассмотреть влияние пользовательского интерфейса (GUI) на надежность.
Сопровождаемость В среднем затраты на сопровождение превышают 60% от общей стоимости программного обеспечения. Категории сопровождения Корректирующее – устранение ошибок. Ø Настраивающее – адаптация приложения к изменениям среды. Ø Усовершенствующее – изменение ПО с целью улучшения некоторых из его качеств Ø Проблема унаследованного ПО. Необходимость проведение обратного инжиниринга и реинженеринга.
Ремонтопригодность (repairability) – возможность устранения дефектов приемлемыми усилиями. Ø Способность к эволюции. Ø Повторная применимость. Ø Переносимость (portability) – возможность работать в различных системах. Ø Понятность. Ø Интероперабельность (interoperability) – возможность ПО сотрудничать с другими системами. Ø Продуктивность. Ø
Как повторная применимость может влиять на надежность продуктов? Ø Как можно использовать наследование для увеличения повторной применимости? Ø Какова связь повторной применимости и переносимости? Ø Как можно применить переносимость для web страниц? Ø Что можно сказать о способности к эволюции открытых систем? Ø Можно ли использовать подсчет количества строк для измерения продуктивности. Ø
Своевременность ПО Функциональность Требования пользователя Реальные возможности системы T 0 T 1 T 2 T 3 Наиболее часто встречающиеся проблемы в разработке ПО.
Классификация ПО. Ø Информационные системы. Хранение, поиск, извлечение данных. Ø Системы реального времени. Должны реагировать на событие в течении строго предопределенного периода времени. Ø Распределенные системы. Располагаются на нескольких независимых или частично независимых компьютерах. Ø Встроенные системы. ПО является одним из множества компонентов, часто не имеют GUI.
Охарактеризуйте такие качества как тестируемость, целостность, легкость в использовании, изучаемость. Приведите примеры. Ø Оценить преимущества и недостатки повторной используемости методов в применении к программному процессу. Ø Какова роль протоколов TCP/IP в интероперабельности? Ø Можно ли оценивать процесс создания ПО с точки зрения интероперабельности? Ø
Принципы создания ПО. Принципы Методы и приемы Методологии Инструментальные средства
Ø Строгость и формальность. Ø Разделение задач. Преимущества и недостатки (избыточность, взаимоблокировки). Ø Модульность. Проектирование снизу вверх и сверху вниз.
Преимущества модульности Разложимость – возможность разложить систему на простые части. Ø Компонуемость – возможность собрать систему из готовых модулей. Ø Возможность интерпретировать систему как состоящую из простых частей. Ø Возможность модифицировать систему путем модификации небольшого количества частей. Ø
Внутримодульная и межмодульная связность. А Б
Ø Какие могут быть причины низкой внутримодульной связности? Как их устранить? Ø Какие могут быть причины высокой межмодульной связности? Как их устранить?
Абстракция Выделяем существенные аспекты явления и игнорируем его подробности. Переменные в языках программирования можно рассматривать как абстракции адресов ячеек памяти. От каких подробностей абстрагируются переменные языков программирования? Каковы преимущества и недостатки использования такой абстракции? Ø Модель жизненного цикла ПО является абстракцией программного процесса. Почему? Ø Какие абстракции полезны конечному пользователю, проектировщику и специалисту по поддержке приложений? Ø
Ø Предусмотрение изменений. Принцип позднего связывания. Ø Общность. Каждый раз, когда надо решить какую-либо проблему, постарайтесь сосредоточится на решении более общей проблемы, которая может быть скрыта за рассматриваемой задачей. Ø Инкрементность. Итерационный процесс разработки. Способ получения раннего отклика от клиента.
Ø Какое взаимоотношение между обобщением и предусмотрением изменений? Ø Какое взаимоотношение между общностью и абстракцией? Ø Какое взаимоотношение между формальностью и предусмотрением изменений?
Парадигмы программирования Будем говорить, что язык поддерживает данный стиль программирования, если он предоставляет средства, которые делают использование стиля удобным (достаточно простым, надежным и эффективным) Ø Язык не поддерживает технику программирования, если для написания соответсвующей программы требуются чрезмерные усилия или мастерство. Ø
Литература Ø Бьерн Страуструп Язык программирования С++. Москва. Binom 2000. Ø Джеффри Рихтер Программирование на платформе. NET Framework. Ø Брюс Эккель Философия JAVA. СПб. Питер, 2000.
Процедурное программирование Реши, какие требуются процедуры; используй наилучшие доступные алгоритмы. Пример. 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: : 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. cpp #include “stack. h” Использование стека
Модули, определяющие типы 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’) 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 {…} // 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 не применяя наследование? Если возможно, то как? Ø Всегда ли использование наследования несет только преимущества? Ø Приведите примеры возможного использования наследования.
Более сложный пример использования наследования.
Множественное наследование В отличии от C++ для Java и. NET множественное наследование от обычных классов не поддерживается. Оно заменяется на одиночное наследование от обычного класса и множественное от интерфейсов. Реfлизация серверного класса в NET Remoting.
Модификаторы доступа Private – доступен только методам в определяющем типе и вложенных в него типах. Ø Protected – доступен только методам в этом типе или одном из производных типов. Ø Public – доступен всем методам. Ø Нестандартные модификаторы доступа и атрибуты в разных языках: internal, friend, abstract, sealed, final, readonly Атрибут static (Shared) – означает, что поле частично определяет состояние типа, а не объекта.
Члены класса Ø Константа – идентификатор, определяющий некую постоянную величину. 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 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 < 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 (Null. Reference. Exception) { } catch (Exception e) { throw; } catch { throw; } finally { } }
Обобщенное программирование Реши, какие требуются алгоритмы; параметризируй их так, чтобы они могли работать со множеством подходящих типов и структур данных. Шаблоны в C++ template<class T> class Stack { T * v; int max_size; int top; public: Stack (int s); ~Stack(); void push(T); T pop (); }
Префикс template<class T> делает T параметром объявления, которому этот префикс предшествует. Функции-члены можно определить следующим образом: template<class T> void Stack<T>: : push(T c) { if (top == max_size) throw Overflow (); v[top] = c; top ++; } Использование стека: Stack<char> sc (200); Stack<complex> scplx(30); sc. push(‘c’); Scplx. push (complex(1, 2));
Generic в C# 2. 0 List<int> items = new List<int> (); items. Add(1); items. Add(2); items[1]++; int I = items[1]; //Объявление class List<Item. Type> {…}
Generic в java 1. 5 List<String> items = new Array. List<String> (); items. Add(“some text”); String str = items. get(0); //Объявление class Generic. List<E> {…} Последовательности и связные списки …
4626dd84aaed8dedb19c2ad5b122f0e8.ppt