~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ 4AE5091A33515CF97E4710A7E36B848E__1700682900 ✰
Заголовок документа оригинал.:
✰ Class invariant - Wikipedia ✰
Заголовок документа перевод.:
✰ Инвариант класса — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/Class_invariant ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/4a/8e/4ae5091a33515cf97e4710a7e36b848e.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/4a/8e/4ae5091a33515cf97e4710a7e36b848e__translat.html ✰
Дата и время сохранения документа:
✰ 12.06.2024 04:31:53 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 22 November 2023, at 22:55 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

Инвариант класса — Википедия Jump to content

Инвариант класса

Из Википедии, бесплатной энциклопедии

В компьютерном программировании , особенно в объектно-ориентированном программировании , инвариант класса (или инвариант типа ) — это инвариант, для ограничения объектов класса используемый . Методы класса должны сохранять инвариант. Инвариант класса ограничивает состояние, хранящееся в объекте.

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

или Инвариант объекта инвариант представления — это конструкция компьютерного программирования, состоящая из набора инвариантных свойств, которые остаются неизменными независимо от состояния объекта. Это гарантирует, что объект всегда будет соответствовать предопределенным условиям и, следовательно, методы всегда могут ссылаться на объект без риска сделать неточные предположения. Определение инвариантов классов может помочь программистам и тестировщикам выявлять больше ошибок во время тестирования программного обеспечения .

Инварианты классов и наследование [ править ]

Полезный эффект инвариантов классов в объектно-ориентированном программном обеспечении усиливается при наличии наследования. Инварианты классов наследуются, то есть «инварианты всех родителей класса применяются к самому классу». [1]

Наследование может позволить классам-потомкам изменять данные реализации родительских классов, поэтому класс-потомок может изменить состояние экземпляров таким образом, что они станут недействительными с точки зрения родительского класса. Забота о таком типе неправильного поведения потомков является одной из причин, по которой разработчики объектно-ориентированного программного обеспечения отдают предпочтение композиции, а не наследованию (т. е. наследование нарушает инкапсуляцию). [2]

Однако, поскольку инварианты классов наследуются, инвариант класса для любого конкретного класса состоит из любых инвариантных утверждений, закодированных непосредственно в этом классе, в сочетании со всеми инвариантными предложениями, унаследованными от родителей класса. Это означает, что даже несмотря на то, что классы-потомки могут иметь доступ к данным реализации своих родителей, инвариант класса может помешать им манипулировать этими данными любым способом, который приведет к созданию недопустимого экземпляра во время выполнения.

Поддержка языков программирования [ править ]

Утверждения [ править ]

Распространенные языки программирования, такие как Python, [3] PHP, [4] JavaScript, [ нужна цитата ] C++ и Java по умолчанию поддерживают утверждения , которые можно использовать для определения инвариантов классов. Распространенным шаблоном реализации инвариантов в классах является то, что конструктор класса генерирует исключение, если инвариант не удовлетворяется. Поскольку методы сохраняют инварианты, они могут предполагать допустимость инварианта и не нуждаются в его явной проверке.

Встроенная поддержка [ править ]

Инвариант класса является важным компонентом проектирования по контракту . Таким образом, языки программирования, которые обеспечивают полную встроенную поддержку проектирования по контракту , такие как Eiffel , Ada и D , также будут обеспечивать полную поддержку инвариантов классов.

Неродная поддержка [ править ]

Для C++ библиотека Loki предоставляет основу для проверки инвариантов классов, инвариантов статических данных и безопасности исключений.

Для Java существует более мощный инструмент под названием Java Modeling Language , который обеспечивает более надежный способ определения инвариантов классов.

Примеры [ править ]

Встроенная поддержка [ править ]

Есть [ править ]

Язык программирования Ada имеет встроенную поддержку инвариантов типов (а также пред- и постусловий, предикатов подтипов и т. д.). Инвариант типа может быть задан для частного типа (например, для определения связи между его абстрактными свойствами) или для его полного определения (обычно для помощи в проверке правильности реализации типа). [5] Вот пример инварианта типа, заданного в полном определении частного типа, используемого для представления логического стека. Реализация использует массив, а инвариант типа определяет определенные свойства реализации, которые обеспечивают доказательство безопасности. В этом случае инвариант гарантирует, что для стека логической глубины N первые N элементов массива являются допустимыми значениями. Default_Initial_Condition типа Stack, указывая пустой стек, обеспечивает начальную истинность инварианта, а Push сохраняет инвариант. Тогда истинность инварианта позволяет Попу полагаться на тот факт, что вершина стека является допустимым значением, что необходимо для доказательства постусловия Попа. Более сложный инвариант типа позволил бы доказать полную функциональную корректность, например, что Pop возвращает значение, переданное в соответствующий Push, но в этом случае мы просто пытаемся доказать, что Pop не возвращает Invalid_Value.

общий 
     тип   Item   is   Private  ; 
      Invalid_Value   :   в   элементе  ; 
  пакет   Stacks   имеет 
     тип   Stack  (  Max_Depth   :  Positive  )   является   частным 
         с   Default_Initial_Condition   =>   Is_Empty   (  Stack  ); 

      функция   Is_Empty  (  S   :  in   Stack  )   возвращает   логическое значение  ; 
      функция   Is_Full  (  S   :  in   Stack  )   возвращает   логическое значение  ; 

      процедура   Push  (  S   :  in   out   Stack  ;   I   :  in   Item  ) 
         с   Pre    =>   not   Is_Full  (  S  )   , а затем   I   /=   Invalid_Value  , 
              Post   =>   not   Is_Empty  (  S  ); 
      процедура   Pop  (  S   :  in   out   Stack  ;   I   :  out   Item  ) 
         с   Pre    =>   not   Is_Empty  (  S  ), 
              Post   =>   not   Is_Full  (  S  )   , а затем   I   /=   Invalid_Value  ; 
  частный 
     тип   Item_Array   представляет собой   (   положительный  диапазон   <   >)   элемента   массив  ; 

      тип   Stack  (  Max_Depth   :  Positive  )    записи 
         длина   :   Natural   :=   0  ; 
          Данные   :   Item_Array   (  1   ..   Max_Depth  )   : =   (  другие   =>   Invalid_Value  ); 
      завершить запись 
         с помощью   Type_Invariant   =>   Длина   <=   Max_Depth   , а   затем 
           (  для   всех   J   в   1   ..   Длина   =>   Данные   (  J  )   /=   Invalid_Value  ); 

      функция   Is_Empty  (  S   :  в   стеке  )   возвращает   логическое 
         значение   (  S.  Длина  =   ;   0  ) 
      функция   Is_Full  (  S   :  в   стеке  )   return   Boolean 
         is   (  S  .  Длина   =   S  .  Max_Depth  ); 
  конец   стеков  ; 

Д [ править ]

Язык программирования D имеет встроенную поддержку инвариантов классов, а также других методов контрактного программирования . Вот пример из официальной документации. [6]

 класса  дата   { 
   int   день  ; 
    интервал   часа  ; 

    инвариант  ()   { 
     утверждения  (  день   >=   1   &&   день   <=   31  ); 
      утверждать  (  час   >=   0   &&   час   <=   23  ); 
    } 
 } 

Эйфелева [ править ]

В Eiffel инвариант класса появляется в конце класса после ключевого слова invariant.

class 
	 DATE 

 create 
	 make 

 Feature   {  NONE  }   -- Инициализация 

	 make   (  a_day  :   INTEGER  ;   a_hour  :   INTEGER  ) 
			 -- Инициализируйте `Current' с `a_day' и `a_hour'. 
		  требуется 
			 valid_day  :   a_day   >=   1   и   a_day   <=   31 
			 valid_hour  :   a_hour   =   0   и   a_hour   <=   23 
		 do 
			 day   :=   : 
			 a_dayhour_set   =   a_hour 
		 обеспечения 
			 day_set  :   day   =   > 
			 :  hour   a_dayhour   =   a_hour 
		 end 

 Feature   доступа 

	 -- День  :   INTEGER 
		 — День месяца для «Текущего» 

	 часа  :   INTEGER 
		 — Час дня для «Текущей» 

 функции   — Изменение элемента 

	 set_day   (  a_day  :   INTEGER  ) 
			 — Установите для «day» значение «a_day» 
		 требуется 
			 valid_argument  :   a_day   >=   1   and   a_day   <=   31 
		 do 
			 day   :=   a_day 
		 обеспечения 
			 day_set  :   day   =   a_day 
		 end 

	 set_hour   (  a_hour  :   INTEGER  ) 
			 -- Установите `hour' в `a_hour' 
		 require 
			 valid_argument  :   a_hour   >=   0   и   a_hour   <=   23 
		 dohour 
			 :   =   a_hour 
		 обеспечить 
			 часов_set  :   час   =   а_час 
		 конец 

 инвариант 
	 действительный_день  :   день   >=   1   и   день   <=   31 
	 действительный_час  :   час   >=   0   и   час   <=   23 
 конец 

Неродная поддержка [ править ]

С++ [ править ]

Библиотека Loki (C++) предоставляет платформу, написанную Ричардом Спосато, для проверки инвариантов классов, инвариантов статических данных и уровня безопасности исключений .

Это пример того, как класс может использовать Loki::Checker для проверки того, что инварианты остаются верными после изменения объекта. В примере используется объект geopoint для хранения местоположения на Земле в виде координат широты и долготы.

Инварианты геоточки:

  • широта не может быть выше 90° северной широты.
  • широта не может быть ниже -90° южной широты.
  • долгота не может быть более 180° восточной долготы.
  • долгота не может быть меньше -180° западной долготы.
#include   <loki/Checker.h>  // Требуется для проверки инвариантов класса. 

  #include   <Degrees.hpp> 

 class   GeoPoint   { 
  public  : 
   GeoPoint  (  в градусах   широта  ,   в градусах   долгота  ); 

    /// Функция Move переместит местоположение GeoPoint. 
    void   Move  (  Degrees   latitude_change  ,   Degrees   longitude_change  )   { 
     // Объект проверки вызывает IsValid при входе и выходе из функции, чтобы доказать, что этот 
     // объект GeoPoint действителен.   Средство проверки также гарантирует, что 
     функция GeoPoint::Move // ​​никогда не выдаст ошибку. 
      CheckFor  ::  CheckForNoThrow   Проверка  (  this  ,   &  IsValid  ); 

      широта_   +=   широта_изменение  ; 
      если   (  широта_   >=   90,0  )   широта_   =   90,0  ; 
      если   (  широта_   <=   -90,0  )   широта_   =   -90,0  ; 

      долгота_   +=   изменение долготы  ; 
      while   (  longitude_   >=   180,0  )   longitude_   -=   360,0  ; 
      while   (  longitude_   <=   -180,0  )   longitude_   +=   360,0  ; 
    } 

  Private  : 
   /** @note CheckFor выполняет проверку правильности во многих функциях, чтобы определить, 
 не нарушил ли код какие-либо инварианты, не изменилось ли какое-либо содержимое или не 
 выдала ли функция исключение. 
  */ 
   используя   CheckFor   =   ::  Loki  ::  CheckFor  <  const   GeoPoint  >  ; 

    /// Эта функция проверяет все инварианты объекта. 
    bool   IsValid  ()   const   { 
     утверждать  ( это   !=   nullptr  ); 
      утверждать  (  широта_   >=   -90,0  ); 
      утверждать  (  широта_   <=   90,0  ); 
      утверждать  (  longitude_   >=   -180,0  ); 
      утверждать  (  longitude_   <=   180,0  ); 
      вернуть   истину  ; 
    } 

   Градусы   широты_  ;      ///< Градусы от экватора.   Положительное значение — север, отрицательное — 
                        ///< юг. 
    Градусы   долготы_  ;     ///< Градусы от нулевого меридиана.   Положительное значение — восток, 
                        ///< отрицательное — запад. 
  } 

Ява [ править ]

Это пример инварианта класса в языке программирования Java с помощью языка моделирования Java . Инвариант должен оставаться истинным после завершения конструктора, а также при входе и выходе всех открытых членов. функции. Открытые функции-члены должны определять предусловие и постусловие , чтобы гарантировать инвариантность класса.

публичный   класс   Date   { 
     int   /*@spec_public@*/   день  ; 
      int   /*@spec_public@*/   час  ; 

      /*@invariant day >= 1 && day <= 31;   @*/   //инвариант класса 
     /*@invarianthour >= 0 &&hour <= 23;   @*/   //инвариант класса 

     /*@ 
 @requires d >= 1 && d <= 31; 
  @requires h >= 0 && h <= 23; 
  @*/ 
     public   Date  (  int   d  ,   int   h  )   {   конструктора 
         // день   =   d  ; 
          час   =   час  ; 
      } 

     /*@ 
 @requires d >= 1 && d <= 31; 
  @обеспечивает день == d; 
  @*/ 
     public   void   setDay  (  int   d  )   { 
         day   =   d  ; 
      } 

     /*@ 
 @requires h >= 0 && h <= 23; 
  @обеспечивает час == час; 
  @*/ 
     public   void   setHour  (  int   h  )   { 
         hour   =   h  ; 
      } 
 } 

Ссылки [ править ]

  1. ^ Мейер, Бертран. Объектно-ориентированное построение программного обеспечения , второе издание, Prentice Hall, 1997, стр. 570.
  2. ^ Э. Гамма, Р. Хелм, Р. Джонсон и Дж. Влиссидес. Шаблоны проектирования: элементы объектно-ориентированного программного обеспечения многократного использования . Аддисон-Уэсли, Ридинг, Массачусетс, 1995 г., с. 20.
  3. ^ Официальная документация Python, утверждение утверждения
  4. ^ «Функция утверждения PHP» . Архивировано из оригинала 21 марта 2001 г.
  5. ^ «Справочное руководство Ada 7.3.2 Инварианты типов» . ada-auth.org . Проверено 27 ноября 2022 г.
  6. ^ «Контрактное программирование — язык программирования D» . dlang.org . Проверено 29 октября 2020 г.
Arc.Ask3.Ru: конец оригинального документа.
Arc.Ask3.Ru
Номер скриншота №: 4AE5091A33515CF97E4710A7E36B848E__1700682900
URL1:https://en.wikipedia.org/wiki/Class_invariant
Заголовок, (Title) документа по адресу, URL1:
Class invariant - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)