fddb7ae93c4061f2f7c7e78e0e434bf7.ppt
- Количество слайдов: 33
Software Design Корректность программ Бреслав А. А.
Корректность Соответствие программы ее спецификации n Программа должна делать то, что от нее ждут n Грубо говоря, программа не должна содержать ошибок n Бреслав А. А. Паттерны проектирования. Введение
Способы достижения корректности n n n Обоснования алгоритмов Формальные доказательства корректности реализаций Автоматические проверки кода Просмотр кода Тесты ¨ ручные ¨ автоматизированные Бреслав А. А. Паттерны проектирования. Введение
Когда обнаруживать ошибки n Чем раньше, тем лучше ¨ никто не видел ¨ исправить легко быстро n дешево n понятно как n ¨ не появятся ошибки, связанные с тем, что-то не было исправлено Бреслав А. А. Паттерны проектирования. Введение
Ошибка обнаружена… n До создания кода ¨ отлично n – ошибки в программе не было В процессе кодирования ¨ очень хорошо – ошибка не успела проявиться n При первом запуске ¨ хорошо – никто не видел, что ошибка проявилась Бреслав А. А. Паттерны проектирования. Введение
Ошибка обнаружена… n На этапе интеграции ¨ неплохо – видели только другие разработчики ¨ все сразу исправлено ¨ ошибка так и не попала в продукт ¨ вот зачем нужно собирать продукт целиком как можно чаще Бреслав А. А. Паттерны проектирования. Введение
Ошибка обнаружена… n На этапе тестирования продукта ¨ плохо – видели тестеры, менеджеры, другие разработчики ¨ Вы уже забыли, как там все работает ¨ исправления могут затронуть много кода, появившегося позже ¨ растет нагрузка на тестеров ¨ однако это еще не сметрельно Бреслав А. А. Паттерны проектирования. Введение
Ошибка обнаружена… n На стадии бета-тестирования ¨ совсем плохо – видели пользователи ¨ правда еще есть шанс все исправить ¨ хотя это может быть очень трудно n После релиза ¨ ВСЕ. КОНЕЦ. ¨ все знают, что в продукте есть ошибка ¨ репутация продукта падает, падает и спрос Бреслав А. А. Паттерны проектирования. Введение
Что делать с ошибками Обнаруживать как можно раньше n Исправлять сразу n Помнить: не делать ошибок невозможно n Бреслав А. А. Паттерны проектирования. Введение
Кто может рано обнаружить ошибку n Компилятор – пока пишется код ¨ Статическая типизация ¨ Контроль доступа n обеспечение инкапсуляции ¨ Контроль потока управления n неинициализированные переменные n недоступный код n обработка исключений ¨ Aннотации вроде @Override ¨… Бреслав А. А. Паттерны проектирования. Введение
Статическая типизация n В хорошей программе все (или почти все) о типах известно статически ¨ использовать Generics ¨ избегать приведения типов и intanceof ¨ не использовать Reflection без острой нужды ¨ не подавлять и не игнорировать предупреждения компилятора Бреслав А. А. Паттерны проектирования. Введение
Лозунг n СВАЛИ ВСЕ НА КОМПИЛЯТОР ¨ он Бреслав А. А. железный – пусть ищет ошибки Паттерны проектирования. Введение
Другие инструменты для статических проверок n n APT – работа с аннотациями http: //findbugs. sf. net http: //pmd. sf. net http: //www. eclipse. org/aspectj Бреслав А. А. Паттерны проектирования. Введение
Динамические проверки n Защитное программирование ¨ проверять все входные данные как только они получены проверять ввод стразу n проверять значения параметров функций n тогда ошибка будет обнаружена на ранней стадии n ¨ всегда писать защиту от дурака – кругом ТОЛЬКО дураки Бреслав А. А. Паттерны проектирования. Введение
Проверки и реакции на ошибки n Фильтрующие модули ¨ безопасные n зоны Что делать, если произошла ошибка ¨ запросить повторный ввод ¨ попробовать скорректировать данные ¨ попробовать другой алгоритм ¨ попробовать устранить сбой ¨ сообщить об ошибке пользователю Бреслав А. А. Паттерны проектирования. Введение
Утверждения Позволяют удостовериться в том, что все работает именно так, как Вы думаете n assert <условие> [: <сообщение>]; n ¨ если n условие ложно, выбрасывается Error Ключ командной строки /ea ¨ условие вычисляется только если утверждения включены Бреслав А. А. Паттерны проектирования. Введение
Пример использования утверждений if (x > y) { n … n float z = x – y; n assert z > 0 : “x must be greater then y”; n return sqrt(z); n} n Бреслав А. А. Паттерны проектирования. Введение
Примеры утверждений Созданный Вами объект не равен null n Цикл сделал столько шагов, сколько ожидалось n Определитель обратной матрицы не равен нулю n Длина отрезка положительна n Стороны квадрата равны n Бреслав А. А. Паттерны проектирования. Введение
Использование утверждений n Нужно ¨ там, где Вы уверены, что условие выполняется, но код достаточно сложен ¨ например, для проверки входных данных в безопасной зоне ¨ например, для проверки инвариантов алгоритма ¨ например, для проверки известных свойств объектов n Не нужно ¨ там, где Вы допускаете, что условие может быть ложным ¨ например, для проверки входных данных вне безопасной зоны ¨ например, вместо бросания runtime-исключения Бреслав А. А. Паттерны проектирования. Введение
Зачем использовать утверждения n Ошибка может быть плохо заметной ¨ Особенно это касается сложный алгоритмов и алгоритмов, работающих с математическими вычислениями Вы могли не до конца понять, как работает алгоритм n Проверка побочных свойств алгоритма поможет выявить эти проблемы n Бреслав А. А. Паттерны проектирования. Введение
Программирование по контракту n Проф. Б. Мейер, язык Eiffel ¨ АТД, n аксиомы Контракт метода ¨ предусловие – когда метод может корректно работать ¨ постусловие – что метод обязан сделать n Контракт класса ¨ инвариант – утверждение о состоянии класса, истинное между вызовами методов Бреслав А. А. Паттерны проектирования. Введение
Контракт метода n Контракт класса ¨ для всякого существующего объекта инвариант выполняется ¨ инвариант – постусловие конструктора n Если предусловие истинно и инвариант класса выполнен, метод закончит работу и постусловие будет истинно и инвариант класса будет выполнен Бреслав А. А. Паттерны проектирования. Введение
Ленивый метод n Лучший контракт ¨ предусловие: false n вообще все равно, что написано в методе ¨ постусловие: true n все равно, что метод сделает, но он обязан закончиться n Худший контракт ¨ предусловие: true n придется работать в любых условиях ¨ постусловие: false n выполнить контракт невозможно Бреслав А. А. Паттерны проектирования. Введение
О предусловиях n Толерантность – слабое предусловие ¨ все n проблемы решает метод Требовательность – сильное предусловие ¨ проблемы решает клиент ¨ так лучше распределяются ответственности n Предусловие должно быть полностью доступно извне класса (или гарантироваться инвариантом) Бреслав А. А. Паттерны проектирования. Введение
Роль контракта Лучшая организация утверждений n Документация n ¨ краткая ¨ формальная – удается не всегда, иногда приходится писать что-то словами ¨ автоматически проверяется Бреслав А. А. Паттерны проектирования. Введение
Контракт стека n size() ¨ ¨ n push(x) ¨ ¨ n pre: size() < MAX post: (size() == @old size() + 1) && (peek() == x) pop() ¨ ¨ n pre: true post: 0 <= result <= MAX (MAX – максимальный размер стека) pre: size() > 0 post: (size() == @old size() – 1) && (result = @old peek()) peek() ¨ ¨ pre: size() > 0 post: (size() == @old size()) // и result – последний элемент, добавленный с помощью push() Бреслав А. А. Паттерны проектирования. Введение
Пример на Java n n public abstract class Stack<T> { public final int size() { ¨ ¨ n n } public final void push(T x) { ¨ ¨ n n int result = do. Size(); assert (0 <= result) && (result <= MAX); assert size() < MAX; int old. Size = size(); do. Push(x); assert (size() == old. Size + 1) && (peek() == x); } … protected abstract int do. Size(); protected abstract void do. Push(T x); Бреслав А. А. Паттерны проектирования. Введение
Как это сделать в Java n Невиртуальный интерфейс ¨ абстрактный класс ¨ каждый метод из API реализован так n n он final - невиртуальный проверки предусловия вызов реализации (do-метода) проверки постусловия ¨ потомки n реализуют do-методы Другой способ: Contract 4 J – специальный инструмент Бреслав А. А. Паттерны проектирования. Введение
Чтобы не тормозило n Все дополнительные вычисления должны быть внутри assert ¨ тогда они не будут работать при выключенных утверждениях n Пример ¨ int old. Size = 0; ¨ assert ((old. Size = size()) == 0) || true; Бреслав А. А. Паттерны проектирования. Введение
Предусловия в Java n n Программа часто не может работать без проверки предусловий Лучше проверять предусловия даже при выключенных assert Вместо assert для предусловий можно использовать runtime-исключения public final void push(T x) { ¨ if (size() >= MAX) { n Бреслав А. А. throw new Stack. Overflow. Exception(); Паттерны проектирования. Введение
Источники n n n Макконнелл С. , Совершенный код. Мастеркласс / Пер. с англ. – М. : Издательскоторговый дом «Русская редакция» ; СПб. : Питер, 2005. – 896 стр. : ил. Мейер Б. , Объектно-ориентированное конструирование программных систем / Пер. с англ. – М. : Издательско-торговый дом «Русская редакция» , 2005 – 1232 стр. : ил. Джоэл Спольски, Джоэл о программировании… – СПб: Символ-Плюс, 2006 – 352 с. , ил. Бреслав А. А. Паттерны проектирования. Введение
Задание n Создать невиртуальный интерфейс для ДДП, проверяющий контракт ¨ добавление ¨ проверка наличия элемента ¨ поиск минимума/максимума ¨ количество вершин ¨ проверка на пустоту n Использовать созданные ранее реализации: ¨ Хранение элементов в динамическом массиве ¨ Каждая вершина – отдельный объект n Дополнить реализации утверждениями Бреслав А. А. Паттерны проектирования. Введение
Вопросы Бреслав А. А. Паттерны проектирования. Введение
fddb7ae93c4061f2f7c7e78e0e434bf7.ppt