- •1. Технология разработки программного обеспечения. Определение. Основные этапы на примере классического жизненного цикла.
- •2. Два взгляда на по: научная разработка, программное изделие. Свободное по.
- •3. Парадигмы проектирования программных систем. Макетирование.
- •4.Парадигмы проектирования пс. Инкрементная модель.
- •5. Парадигмы проектирования программных систем. Быстрая разработка приложений.
- •6. Парадигмы проектирования программных систем. Спиральная модель.
- •7. Парадигмы проектирования программных систем. Компонентно-ориентированная модель.
- •8. Парадигмы проектирования программных систем. Унифицированный процесс. Rup.
- •1. Начало
- •2. Уточнение
- •3. Построение (Конструирование)
- •4. Внедрение
- •9. Парадигмы проектирования программных систем. Экстремальное программирование.
- •10. Спецификация требований. Виды требований.
- •1) Пользовательские требования
- •2) Системные требования
- •3) Проектная системная спецификация.
- •11. Функциональные требования.
- •12. Нефункциональные требования.
- •13. Требования предметной области.
- •14. Пользовательские требования.
- •15. Системные требования.
- •16. Описание технического задания по гост.
- •17. Прецеденты. Определение. Актеры. Сценарии.
- •18. Задачи и рамки прецедентов.
- •19. Степень формализации прецедентов. Сжатый, свободный и развёрнутый формат описания.
- •20. Пояснения к прецедентам. Предусловия и постусловия. Альтернативные сценарии.
- •22. Объектно-ориентированные анализ и проектирование программных систем. Основные определения.
- •23. Основные принципы объектно-ориентированной разработки программ.
- •24. Обязанности объектов. Разложение системы на объекты. Crc-карты.
- •25. Инкапсуляция. Связность внутри классов и зацепление между классами.
- •26. Композиция и наследование. Абстрактные классы. Интерфейс класса. Рекомендации.
- •27. Методы, операции, сообщения. Разделение команд и запросов.
- •28. Проектирование по контракту. Предусловия и постусловия в методах. Инварианты.
- •29. Паттерны проектирования. Определение. Формат описания.
- •30. Виды паттернов по уровню абстракции и по цели. Примеры.
- •36. Минимальное грубое тестирование
- •37. Автоматизированные тесты. Основные определения. XUnit
- •38. Разработка через тестирование
- •39. Особенности командной разработки по
- •40. Оценка стоимости по. Модели и методики. Модель cocomo
27. Методы, операции, сообщения. Разделение команд и запросов.
Метод в объектно-ориентированном программировании — процедура или функция, принадлежащая какому-то классу или объекту.
Методы реализуют операции. Объект выполняет операцию, когда получает сообщение.
Для объявления любой операции должно быть задано:
- имя операции
- объекты-параметры
- тип возвращаемого значения
Эту триаду называют сигнатурой операции.
Множество сигнатур операция называется интерфейсом этого объекта. Интерфейс определяет все множество запросов, которые можно отправить объекту. В ООП интерфейсы фундаментальны. Разные объекты могут иметь одинаковые интерфейсы.
При проектировании интерфейсов классов часто используется принцип разделения команд и запросов. При проектировании класса следует методы разделять на команды и запросы. Команда модифицируют объект, а запросы возвращают информацию об объекте.
Команды реализуются с помощью процедур, а запросы – функций. В Си++ это const функции.
Функции с побочным эффектом – это плохо. Можно сформулировать этот принцип так:
«Операции-запросы не должны обладать побочным эффектом»
28. Проектирование по контракту. Предусловия и постусловия в методах. Инварианты.
Это метод программирования ПО предполагающий, что проектировщик должен определить формальные, точные и верифицируемые спецификации интерфейсов для компонентов системы. Повышается документированность системы.
Утверждение (assertion) – формальное условие, описывающее свойство программных элементов (особенно программ и циклов).
Выделяют 3 вида утверждений: предусловия, постусловия, инварианты.
Программист предполагает, что все утверждения истины при выполнении его программы.
Смысл контрактного программирования в открытом объявлении своих намерений программистом. Система, основанная на использовании контрактов, состоит из элементов, которые взаимодействуют между собой на основе определенных обязательств и требований.
Перед написание модуля необходимо написать формальное утверждение корректности этого модуля.
Пусть А – некоторая операция.
{p}A{Q} – формула корректности для операции А.
Смысл таков: любое выполнение А, начинающееся в состоянии, когда предикат p истинен, завершится и в заключительном состоянии будет истинен предикат Q.
{p}А{Q} – триада Хоара.
Пример: {x>=9} x:=x+5 {x>=13}
P – предусловие, Q – постусловие
{P}A{Q}; {Q}B{R}; {P}A;B{R} – важно – Q не проверяется
{x+1=43} y:=x+1 {y=43}
{y=43} z:=y {z=43}
Формальная проверка корректности математическими методами используется очень редко.
Предусловие должно быть истинно до выполнения операции. Постусловие должно быть истинно после выполнения операции. Корректная система никогда не вызовет операцию, в которой не выполняется ее условия. Это накладывает ответственность на клиента.
Так как условие предполагается истинным при заходе в подпрограмму, то нет необходимости проверять это условие в теле подпрограммы.
Постусловие выражает гарантию, предоставленную создателем операции, что выполнение операции завершится и приведет к состоянию с заданными свойствами, в случае, если операция была запущена в состоянии с выполняющимся предусловием.
Любое нарушение утверждения – это баг. Если нарушено предусловие, то баг у клиента. Нарушение постусловия – баг у поставщика.
В ООП добавляется понятие «инвариант класса».
Инвариант цикла – это утверждение, которое должно быть истинно до выполнения цикла, после каждой итерации и после выполнения цикла.
В ООП предусловия могут быть ослаблены у подкласса, а постусловия усилены.
При использовании контрастного программирования сам код в принципе не обязан проверять выполнение утверждений. Часто в релизном варианте кода проверки утверждений убираются, чтобы повысить производительность.
Часто используется подход «fail hard». В этом случае программа завершает свою работу при невыполнении какого-либо утверждения.
При использовании контрастного программирования предполагается, что клиент действует по следующему принципу:
«сначала проверка статуса, затем выполнение операции».
Наиболее проблематичной является проверка постусловий. Обычно проверку постусловий не включают в код, а корректность достигается тестированием.
Наиболее полно контрактное программирование используется в языке Eifell. В С/С++ используется макрос assert(P).
Утверждения не предназначены для проверки вводимых пользователем данных и других внешних данных. Контрактное программирование повышает возможность повторного использования кода и повышает документированность модуля.