는 전제조건과 사후 조건에서 필요한 불변에서 회원 기능을 하는 경우 디자인 계약에 의해?

StackOverflow https://stackoverflow.com/questions/1219564

문제

을 이해에 DbC 방법,전제조건과 사후 조건에 부착되어 있습니다.

내가 무엇인지 궁금은 경우에 적용되는 회원 기능을 뿐입니다.

예를 들어,가정용 고정 시작 부분에서 공공 기능,회원 기능은 다음과 같이 표시됩니다:

편집:(청소 예제)

void Charcoal::LightOnFire() {
  invariant();
  in_LightOnFire();

  StartBurning();    
  m_Status = STATUS_BURNING;
  m_Color = 0xCCCCCC;

  return; // last return in body

  out_LightOnFire();
  invariant();
}

inline void Charcoal::in_LightOnFire() {
  #ifndef _RELEASE_
  assert (m_Status == STATUS_UNLIT);
  assert (m_OnTheGrill == true);
  assert (m_DousedInLighterFluid == true);
  #endif
}

inline void Charcoal::out_LightOnFire() {
  #ifndef _RELEASE_
  assert(m_Status == STATUS_BURNING);
  assert(m_Color == 0xCCCCCC);
  #endif
}

// class invariant
inline void Charcoal::invariant() {
  assert(m_Status == STATUS_UNLIT || m_Status == STATUS_BURNING || m_Status == STATUS_ASHY);
  assert(m_Color == 0x000000 || m_Color == 0xCCCCCC || m_Color == 0xEEEEEE);
}

괜찮습니다 그것을 사용하여 전제조건과 사후 조건을 가진 글로벌/일반 기능만 사용 invariants 내부 클래스가?

이 잔인한 것 같다,하지만 어쩌면 그 예가 나쁜 것입니다.

편집:

지 않은 사후 조건을 확인하기만 하위 집합의 invariant?

에서 위에 나는 다음의 지침 http://www.digitalmars.com/ctg/contract.html 는 국가는,"고정 확인할 때 클래스가 완료되면에서 시작하는 클래스의 소멸하기 전에 공공 구성원은,실행 후 대중 기능을 완료합니다."

감사합니다.

도움이 되었습니까?

해결책

그렇습니다.

클래스 C invariant 일반적인 속성의 모든 해당 인스턴스(object).고정 true 인 경우에만 개체가 의미상으로는 유효한 상태입니다.

엘리베이터의 불변성 등과 같은 정보가 포함되어 있습 ASSERT(IsStopped() || Door.IsClosed()), 기 때문에 그것이 잘못되었을 위한 엘리베이터 등이 수 상태에서 서로 다른 것보다 중지(예를 들어,가)및 문을 열려 있습니다.

대조적으로,구성원과 같은 기능 MoveTo(int flat)CurrentFlat()==flat사후 조건;기 때문에를 호출한 후에 MoveTo(6)현재한 평가 6.마찬가지로,그것은있을 수 있습니다 IsStopped()전제 조건, 기 때문에,(디자인에 따라)할 수 없습 MoveTo 함수는 경우 엘리베이터 같은 이미 이동합니다.첫째,당신이하는 쿼리를 그 상태로는지 확인 그것은 중지되고 다음의 함수를 호출.

물론 내가 될 수 있습이 완전히 지나치게 단순화법 엘리베이터 등이 작동합니다.

어떤 경우에는,운전 및 사후 조건되지 않을 것이다,일반적으로,invariant 조건엘리베이터 등이 필요하지 않에는 6 층에 있는 유효한 상태입니다.

간단한 예제는 여기에서 찾을 수 있습니다: 차단 및 특성:디자인-에 의해 계약에 의하여 견본 사샤 Goldshtein.

다른 팁

을 제한하는 계약에서 클래스를 고정은 최적화되지 않았습니다.

전제조건과 사후 조건은 단지의 하위 집합 invariants.

고정,사전 조건 및 사후 조건에는 아주 다른 역할을 수행합니다.

Invariants 을 확인합 내부의 일관성체입니다. 그들이 유효해야 한의 끝에서 생성자 및 전후 각 방법에서 호출합니다.

사전 조건이 있는지 확인하는 상태의 개체수가 적합한 실행하는 방법입니다. 전제 조건을 보완하여 고정.그들은 커버의 체크 인수(강을 확인하는 유형을 자체,즉not null,>0,..등등)또한 확인할 수 있는 개체에 대한 내부 상태(i.e호출이 파일입니다.쓰("안녕하세요" 은)유효한 호출하는 경우에만 파일입니다.is_rw 고 파일입니다.is_open true).

후 조건을 검사하는 방법에 만족하의 의무 Post 조건은 또한 보완 invariants.물론 상태의 개체는 일관된 후 방법을 실행하지만,사후 조건을 검사하는 예상된 작업을 수행하였다(즉목록입니다.추가를(i)해야로는 결과 목록입니다.는(i)이 사실과 목록입니다.count=old 목록입니다.카운트+1)입니다.

론,점의 고정은 그것에 대해 설명합 뭔가 진정한 객체의 모든 시간.이 경우,무언가가 그릴,또는(아무것도)있습니다.그들은 일반적으로 설명하는 시설의 전체 상태의 개체입니다.

사전 및 사후 조건을 설명하는 것은 진정한 다기 전에 실행하는 방법과 후,그리고 염려됩니다 다만 주어야 하는 감동 방법에 의해.이것은 다른 아마도,국가에서의 개체입니다.사전 및 사후 조건 수 있으로의 생각을 설명하는 공간의 방법-다만 그것이 무엇을 필요로 그냥 무엇을 감동을 받았습니다.

그래서,특정 질문,아이디어를 하는 다른 것들,그래서 잘 할 수 있습니다.당신은 확실히 수 없습니다 단지 사용 invariants 대신 사전 및 사후 조건에서 인스턴스의 일부 개체 고정은"무언가가 그릴에는지"지만,사전 조건의 lightOnFire 알 필요가 있는 항목은 그릴에.지 않을 수 있습추이에서 고정되어 있습니다.그것은 사실에서 사전 및 사후 조건 및 알려진 상태를 시작할 수 있습니다(정체 구조 변경 가능한 방법을 통하여,그리고 사전 및 사후 조건을 설명하는 모든 환경 변화),추는 객체에 고정되어 있습니다.그러나,이것은 복잡할 수 있습,그리고 당신이 알리는 것"에서는 언어",그것은 쉽게 그냥을 제공합니다.

물론 하에서 개는 상태 boolean 항목을 참 또는 거짓 것을 제어 할 수 있습니다.-형 시스템을 보장합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top