클래스 불변성

Class invariant

컴퓨터 프로그래밍, 특히 객체 지향 프로그래밍에서 클래스 불변제(또는 유형 불변제)는 클래스객체를 구속하는 데 사용되는 불변제다.수업 방법은 불변성을 보존해야 한다.클래스 불변성은 객체에 저장된 상태를 구속한다.

계급 불변제는 건설하는 동안 설립되고 공공 방법에 대한 호출 사이에 지속적으로 유지된다.함수 내의 코드는 공적인 기능이 종료되기 전에 불변성을 복구하는 한 불변성을 파괴할 수 있다.동시성이 있는 경우, 방법에서 불변성을 유지하려면 일반적으로 뮤텍스를 사용하여 상태를 잠가 중요한 부분을 설정해야 한다.

개체 불변성 또는 표현 불변성은 개체의 상태에 관계없이 타협되지 않은 상태로 남아 있는 불변성 속성 집합으로 구성된 컴퓨터 프로그래밍 구성물이다.이렇게 하면 개체는 항상 미리 정의된 조건을 충족하며, 따라서 그 방법은 부정확한 가정을 할 위험 없이 항상 개체를 참조할 수 있다.클래스 불변제를 정의하면 프로그래머와 테스터가 소프트웨어 테스트 중에 더 많은 버그를 잡을 수 있다.

계급불변제 및 상속

객체지향 소프트웨어에서 클래스 불변제의 유용한 효과는 상속을 전제로 강화된다.계급 불변은 유전되는 것으로, 즉 "한 반의 모든 부모의 불변은 학급 자체에 적용된다"[1]는 것이다.

상속은 하위 클래스가 상위 클래스의 구현 데이터를 변경할 수 있도록 하므로 하위 클래스가 상위 클래스의 관점에서 무효로 만드는 방식으로 인스턴스 상태를 변경할 수 있다.이러한 유형의 잘못된 후손에 대한 우려는 객체 지향 소프트웨어 설계자들이 상속(즉, 상속 중단 캡슐화)보다 구성을 선호하는 한 가지 이유다.[2]

그러나, 계급 불변제들은 유전되기 때문에, 특정 계급에 대한 계급 불변제는 계급의 부모로부터 물려받은 모든 불변제 조항과 함께 그 계급에 즉시 암호화된 불변제 주장으로 구성된다.즉, 하위 클래스가 부모의 구현 데이터에 액세스할 수 있더라도 클래스 불변성 클래스는 런타임에 유효하지 않은 인스턴스를 생성하는 어떤 방법으로도 해당 데이터를 조작하지 못하도록 할 수 있다.

프로그래밍 언어 지원

주장

Python, PHP,[3][4] JavaScript, [citation needed]C++ 및 Java와 같은 일반적인 프로그래밍 언어는 클래스 불변량을 정의하는 데 사용할 수 있는 주장을 기본적으로 지원한다.클래스에서 불변제를 구현하는 일반적인 패턴은 클래스 생성자가 불변제가 충족되지 않을 경우 예외를 두는 것이다.방법은 불변성을 보존하므로 불변성의 유효성을 가정할 수 있으므로 명시적으로 확인할 필요는 없다.

원주민 지원

클래스 불변제는 계약에 의한 설계의 필수 요소다.그래서 러스트, 에펠, 에이다, D와 같이 계약에 의한 디자인에 대한 완전한 원주민 지원을 제공하는 프로그래밍 언어 또한 클래스 불변제들에 대한 전폭적인 지원을 제공할 것이다.

비원천적 지원

C++의 경우 로키 도서관은 클래스 불변제, 정적 데이터 불변제, 예외 안전성 등을 확인할 수 있는 프레임워크를 제공한다.

자바에게는 클래스 불변량을 보다 강력하게 정의할 수 있는 Java Modeling Language라는 보다 강력한 도구가 있다.

원주민 지원

D

D 프로그래밍 언어는 다른 계약 프로그래밍 기법뿐만 아니라 클래스 불변성의 기본 지원을 가지고 있다.공식 문서로부터 예를 들어보자.[5]

계급 날짜 {   인트로 낮의;   인트로 시간;    불변의() {     주장하다(낮의 >= 1 && 낮의 <= 31);     주장하다(시간 >= 0 && 시간 <= 23);   } } 

에펠

에펠에서는 수업 끝에 키워드를 따라 수업 불변자가 나타난다.invariant.

계급  날짜  만들다  만들다  특집 기사 {없음} -- 초기화   만들다 (a_day: 정수; 1시간: 정수)    -- 'a_day'와 'a_hours'로 'current'를 초기화하십시오.   요구하다    유효일: a_day >= 1 그리고 a_day <= 31    유효시간_시간: 1시간 >= 0 그리고 1시간 <= 23   하다    낮의 := a_day    시간 := 1시간   보증하다    day_set: 낮의 = a_day    hour_set: 시간 = 1시간   종지부를 찍다  특집 기사 -- 액세스   낮의: 정수   -- '현재'의 월일   시간: 정수   -- '현재'의 하루 중 시간  특집 기사 -- 요소 변경   set_day (a_day: 정수)    -- 'day'를 'day'로 설정   요구하다    유효_주장: a_day >= 1 그리고 a_day <= 31   하다    낮의 := a_day   보증하다    day_set: 낮의 = a_day   종지부를 찍다   set_hours를 설정하다. (1시간: 정수)    -- 'hour'를 'a_hour'로 설정   요구하다    유효_주장: 1시간 >= 0 그리고 1시간 <= 23   하다    시간 := 1시간   보증하다    hour_set: 시간 = 1시간   종지부를 찍다  불변의  유효일: 낮의 >= 1 그리고 낮의 <= 31  유효시간_시간: 시간 >= 0 그리고 시간 <= 23 종지부를 찍다 

비원천적 지원

C++

로키(C++) 라이브러리는 클래스 불변제, 정적 데이터 불변제, 예외 안전 수준 등을 확인하기 위해 리처드 스포사토가 작성한 프레임워크를 제공한다.

이것은 클래스가 로키를 어떻게 사용할 수 있는지를 보여주는 예다:개체가 변경된 후에도 불변성을 확인하기 위한 체커는 참으로 유지된다.이 예에서는 지오펜스 개체를 사용하여 지구 상의 위치를 위도와 경도의 좌표로 저장한다.

지오펜스 불변성은 다음과 같다.

  • 위도는 북위 90° 이하일 수 있다.
  • 위도는 남쪽으로 -90° 이하일 수 있다.
  • 경도는 동쪽으로 180° 이하일 수 있다.
  • 경도는 서쪽으로 -180° 이하일 수 있다.
#include <로키/체커.h>// 클래스 불변제 확인 필요  #include <세상.hpp>  계급 지오포인트 {  공중의:   지오포인트( 위도,  경도);    /// 이동 기능은 GeoPoint의 위치를 이동시킨다.   공허하게 하다 이동하다( 위도_변경,  경도_변화) {     // 이를 증명하기 위해 함수 입력 및 종료 시 체커 개체가 IsValid를 호출함     // GeoPoint 개체가 유효함.또한 Checker는 GeoPoint:이동하다     // 기능은 절대 던지지 않는다.     CheckFor::CheckForNoDrow 체커하다(, &IsValid);      위도_ += 위도_변경;     만일 (위도_ >= 90.0) 위도_ = 90.0;     만일 (위도_ <= -90.0) 위도_ = -90.0;      경도_ += 경도_변화;     하는 동안에 (경도_ >= 180.0) 경도_ -= 360.0;     하는 동안에 (경도_ <= -180.0) 경도_ += 360.0;   }   사유의:   /** @참고 CheckFor는 많은 함수에서 유효성 검사를 수행하여 결정 코드가 불변자를 위반하거나, 내용이 변경되거나, 함수는 예외를 두었다. */   사용. CheckFor = ::로키::CheckFor<경시하다 지오포인트>;    /// 이 함수는 모든 개체 불변성을 검사한다.   바가지 긁다 IsValid() 경시하다 {     주장하다( != 무효의);     주장하다(위도_ >= -90.0);     주장하다(위도_ <= 90.0);     주장하다(경도_ >= -180.0);     주장하다(경도_ <= 180.0);     돌아오다 진실의;   }     위도_;   ///< 적도로부터의 온도.긍정적인 것은 북쪽, 부정적인 것은                        ///< 남부.    경도_;  ///<Primary Meridian에서 온도.긍정적인 것은 동쪽이다.                        ///< 네거티브는 서쪽이다. } 

자바

이것은 Java Modeling Language와 함께 Java 프로그래밍 언어의 클래스 불변성의 예다.불변성은 시공자가 종료된 후 모든 공공 회원 기능의 진입과 퇴장에 참이어야 한다.공용 회원 기능은 계급 불변성을 보장하는 전제 조건과 사후 조건을 정의해야 한다.

공중의 계급 날짜 {     인트로 /*@spec_public@*/ 낮의;     인트로 /*@spec_public@*/ 시간;      /*@날 >= 1 &&day <= 31; @*/ //클래스 불변성     /*@시간 >= 0 &&시간 <= 23; @*/ //클래스 불변성      /*@ @190 d >= 1 &&d <= 31; @requires h >= 0 &&h <= 23; @*/     공중의 날짜(인트로 d, 인트로 h) { //시공자         낮의 = d;         시간 = h;     }      /*@ @190 d >= 1 &&d <= 31; @1901일 ==d; @*/     공중의 공허하게 하다 세트데이(인트로 d) {         낮의 = d;     }      /*@ @requires h >= 0 &&h <= 23; @190시 == h; @*/     공중의 공허하게 하다 시간 설정(인트로 h) {         시간 = h;     } } 

참조

  1. ^ 마이어, 베르트랑객체 지향 소프트웨어 건설, 2판, 프렌티스 홀, 1997, 페이지 570.
  2. ^ E. 감마, R.헬름, R. 존슨, J. 블리시데스.설계 패턴: 재사용 가능한 개체 지향 소프트웨어의 요소.애디슨 웨슬리, 매사추세츠 주 레딩, 1995년, 페이지 20.
  3. ^ 공식 파이톤 독스, 진술서 작성
  4. ^ "PHP assert function". Archived from the original on 2001-03-21.
  5. ^ "Contract Programming - D Programming Language". dlang.org. Retrieved 2020-10-29.