Корректность класса
Корректность класса
Вооруженные понятиями инварианта, предусловий и постусловий, мы можем теперь точно определить понятие корректности уже не отдельной подпрограммы, а класса в целом.
Класс, подобно всем остальным программным элементам, не может быть корректным или некорректным сам по себе, - только по отношению к некоторой спецификации. Инварианты, предусловия и постусловия, это способ задания спецификации класса. На этой основе можно приступать к определению корректности: класс корректен, если и только если его реализация, заданная подпрограммами, согласована с предусловиями, постусловиями и инвариантами.
Нотация {P} A {Q} поможет выразить наше определение более строго.
Пусть C обозначает класс, Inv - инвариант, r - программа класса. Для каждой программы Bodyr - ее тело, prer(xr), postr(xr) - ее предусловие и постусловие с возможными аргументами xr. Если предусловие или постусловие для программы r опущены, то будем считать их заданными константой True.
Наконец, пусть DefaultC обозначает утверждение, выражающее тот факт, что атрибуты класса C имеют значения по умолчанию, определенные их типами. Например, DefaultSTACK2 для класса STACK2 является следующим утверждением:
representation = Void
capacity = 0
count = 0
Эта нотация позволяет дать общее определение корректности класса:
Определение: Корректность класса
Класс C корректен по отношению к своим утверждениям, если и только если:
1
Для любого правильного множества аргументов xp процедуры создания p:
{DefaultC and prep(xp)} Bodyp {postp(xp) and Inv}
2
Для каждой экспортируемой программы r и для любого множества правильных аргументов xr:
{prer(xr) and Inv} Bodyr {postr(xr) and Inv}
Это правило является математической формулировкой ранее рассмотренной неформальной диаграммы, показывающей жизненный цикл типичного объекта (рис. 11.4). Условие (1) означает, что любая процедура создания при ее вызове с выполняемым предусловием должна вырабатывать начальное состояние (S1 на рисунке), удовлетворяющее постусловию и инварианту. Условие (2) отражает тот факт, что любая экспортируемая процедура r (f и g на рисунке), вызываемая в состояниях (S1, S2, S3), удовлетворяющих предусловию и инварианту, должна завершаться в состояниях, удовлетворяющих постусловию и инварианту.
Два практических замечания:
[x]. Если у класса нет предложения creation, то можно полагать, что существует неявная процедура создания по умолчанию - nothing с пустым телом. Применение правила (1) к Bnothing в этом случае означает, что DefaultC влечет Inv; другими словами, значения полей по умолчанию должны удовлетворять инварианту в этом случае.
[x]. Из определения корректности класса следует, что любая экспортируемая программа может делать, все что угодно, если при ее вызове нарушается предусловие или инвариант.
Только что было описано, как определить корректность класса. На практике чаще хочется проверить, что данный класс действительно корректен. Эта проблема будет обсуждаться позднее в этой лекции.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Имя класса
Имя класса Имя класса должно быть уникальным в пределах пакета, который описывается некоторой совокупностью диаграмм классов (возможно, одной диаграммой). Оно указывается в первой верхней секции прямоугольника. В дополнение к общему правилу наименования элементов
6. Главное — корректность, простота и ясность
6. Главное — корректность, простота и ясность РезюмеКорректность лучше быстроты. Простота лучше сложности. Ясность лучше хитроумия. Безопасность лучше ненадежности (см. рекомендации 83 и 99).ОбсуждениеСложно преувеличить значение простоты проектирования и ясности кода.
Методы класса
Методы класса Метод — это процедура или функция, реализованная в классе. В качестве примера пользовательских методов можно привести процедуры обработки событий. Кроме того, методом становится любая процедура или функция, заголовок которой указан в объявлении
Шаг 8 - Еще раз о статистике класса.
Шаг 8 - Еще раз о статистике класса. Пока праздники не начались и не кончились, пока работает интернет и библиотека, снова займемся любимым делом - статистикой класса. Мы уже говорили о ней, и уяснили, что здесь неплохо работает идиома ведущих указателей. Но на плюсах
Тип класса
Тип класса Любой язык, совместимый с .NET, поддерживает, как минимум, тип класса, который является "краеугольным камнем" объектно-ориентированного программирования (ООП). Класс может состоять из любого числа членов (таких, как свойства, методы и события) и элементов данных
Тип класса в C#
Тип класса в C# Если вы имеете опыт создания объектов в рамках какого-то другого языка программирования, то, несомненно, знаете о роли определений классов. Формально говоря, класс – это определенный пользователем тип (User-Defined Type - UDT), который скомпонован из полей данных
Три класса приложений. NET
Три класса приложений. NET Приложения WebFormsДля конечного пользователя приложение WebForms выглядит как обычное веб-приложение. Если в нем не используется выборка данных, то можно даже не заподозрить наличия активной составляющей на стороне сервера. Для программиста же это
13.1. Определение класса
13.1. Определение класса Определение класса состоит из двух частей: заголовка, включающего ключевое слово class, за которым следует имя класса, и тела, заключенного в фигурные скобки. После такого определения должны стоять точка с запятой или список объявлений:class Screen { /* ... */
14.1. Инициализация класса
14.1. Инициализация класса Рассмотрим следующее определение класса:class Data {public:int ival;char *ptr;};Чтобы безопасно пользоваться объектом класса, необходимо правильно инициализировать его члены. Однако смысл этого действия для разных классов различен. Например, может ли ival
Конструкторы класса
Конструкторы класса Для класса CObject определены два конструктора. Первый конструктор используется по умолчанию и не имеет параметров. Именно этот конструктор вызывается конструкторами классов, наследованных от CObject:CObject();Второй конструктор класса CObject называется
Корректность (Correctness)
Корректность (Correctness) Определение: корректностьКорректность - это способность ПО выполнять точные задачи так, как они определены их спецификацией.Корректность является важнейшим качеством. Если система не делает того, что она должна делать, то все остальное - ее
Инварианты класса
Инварианты класса Предусловия и постусловия описывают свойства отдельных программ. Но экземпляры класса обладают также глобальными свойствами. Их принято называть инвариантами класса (class invariants), и они определяют более глубокие семантические свойства и ограничения
Корректность предложения rescue
Корректность предложения rescue Формальное определение корректности класса выдвигает два требования к компонентам класса. Первое (1) требует, чтобы процедуры создания гарантировали корректную инициализацию - выполнение инварианта класса. Второе (2) напрямую относится к
Корректность систем и классов
Корректность систем и классов Для обсуждения проблем ковариантности и скрытия потомком нам понадобится несколько новых терминов. Будем называть классово-корректной (class-valid) систему, удовлетворяющую трем правилам описания типов, приведенным в начале лекции. Напомним их:
Корректность систем: первое приближение
Корректность систем: первое приближение Давайте сконцентрируемся вначале на проблеме ковариантности, более важной из двух рассматриваемых. Этой теме посвящена обширная литература, предлагающая ряд разнообразных