Sind Vor- und Nachbedingungen zusätzlich zu Invarianten in Elementfunktionen benötigt, wenn Design by Contract tun?

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

Frage

Ich verstehe, dass in dem DBC-Verfahren, Vor- und Nachbedingungen an eine Funktion gebunden sind.

Was ich frage mich, wenn das zu Funktionen Mitglied gilt als gut.

Zum Beispiel unter der Annahme, ich Invarianten am Anfang am Ende jeder öffentlichen Funktion, eine Member-Funktion wird wie folgt aussehen:

edit: (bereinigt mein Beispiel)

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);
}

Ist es in Ordnung Voraussetzungen zu nutzen und Nachbedingungen mit global / generischen Funktionen nur und nur innerhalb von Klassen verwenden Invarianten?

Das scheint übertrieben, aber vielleicht ist es mein Beispiel ist schlecht.

edit:

Ist das nicht die Nachbedingung nur eine Teilmenge der Invarianten Überprüfung?

In dem obigen verfolge ich die Anweisungen von http://www.digitalmars.com /ctg/contract.html , die besagt: „die invariante wird geprüft, wenn ein Konstruktor der Klasse abgeschlossen hat, zu Beginn der Klasse destructor, bevor ein öffentliches Mitglied ausgeführt wird, und nach einer öffentlichen Funktion beendet ist.“

Danke.

War es hilfreich?

Lösung

Ja.

Klasse C invariant ist eine gemeinsame Eigenschaft aller seiner Instanzen (Objekte). Die Invariante wahr ausgewertet, wenn und nur dann, wenn sich das Objekt in einem semantisch gültigen Zustand.

eine Invariante des Aufzugs kann Informationen wie ASSERT(IsStopped() || Door.IsClosed()) enthalten, weil sie ungültig ist für einen Aufzug in einem Zustand, anders zu sein als gestoppt (sagen wir, hinauf) und bei geöffneter Tür.

Im Gegensatz dazu eine Elementfunktion wie MoveTo(int flat) haben kann als eine CurrentFlat()==flat Nachbedingung ; denn nach einem Aufruf von MoveTo (6) die aktuelle Wohnung 6. Ebenso ist, kann es IsStopped() als Voraussetzung , da (je nach Ausführung) haben Sie nicht Funktion MoveTo, wenn der Aufzug aufrufen kann, ist bereits in Bewegung. Zuerst müssen Sie seinen Zustand abfragen, stellen Sie sicher, dass es gestoppt wird, und dann die Funktion aufrufen.

Natürlich kann ich total zu einfach, wie ein Aufzug funktioniert.

In jedem Fall ist die Vor- und Nachbedingungen werden keinen Sinn machen, in der Regel als unveränderliche Bedingungen; ein Aufzug braucht nicht 6 am Boden zu sein, in einem gültigen Zustand zu sein.

Ein prägnantes Beispiel ist hier zu finden: Interception und Attribute: Eine Design-by-Contract Probe von Sasha Goldshtein

.

Andere Tipps

Die Beschränkung der Verträge in den Klassen Invarianten nicht optimal ist.

Vor- und Nachbedingungen sind nicht nur eine Teilmenge der Invarianten.

Invarianten, Pre-Bedingungen und Post-Bedingungen haben sehr unterschiedliche Rollen.

Invarianten bestätigt die innere Kohärenz des Objekts. Sie sollten am Ende des Konstrukteurs und vor und nach jedem Methodenaufruf gültig sein.

Vorbedingungen überprüfen, ob der Status des Objekts und die Argumente für die Durchführung des Verfahrens geeignet sind. Voraussetzungen für die Invarianten komplementär sind. Sie decken die Prüfung der Argumente (eine stärkere Kontrolle, dass der Typ selbst, also nicht null,> 0, .. etc), sondern auch für das Objekt internen Status überprüfen konnte (dh ein Aufruf an file.write ( "Hallo „) ist ein gültiger Aufruf nur, wenn file.is_rw und file.is_open wahr sind).

Post-Bedingungen sind cheking, dass die Methode seiner Verpflichtung nachgekommen, Post-Bedingungen auf die Invarianten auch komplementär sind. Natürlich ist der Status des Objekts hat nach der Methode Ausführung kohärent sein, aber die Post-Bedingungen überprüft, dass die erwartete Aktion durchgeführt wurde (dh list.add (i) als Folge haben sollte, dass list.has (i) wahr ist und list.count = alt list.count + 1).

Nun, der Punkt einer invariant ist, dass es etwas beschreibt, das ist gilt für das Objekt jederzeit . In diesem Fall ist etwas auf dem Grill, oder nicht (nichts dazwischen). Sie beschreiben normalerweise eine Eigenschaft des gesamten Zustand des Objekts.

Vor und nach Bedingungen Dinge beschreiben, die wahr sind, kurz bevor ein Verfahren ausführt, und kurz nach, und betreffen nur den Zustand, der durch das Verfahren berührt werden soll. Dies unterscheidet sich vermutlich aus dem Zustand des Objekts. Pre- und Post-Bedingungen könnte als Beschreibung der Fußabdruck eines Verfahrens gedacht werden. - genau das, was es brauchte, genau das, was es berührt

Also, auf die spezifische Frage, tun die Ideen verschiedene Dinge, so können Sie auch beide wollen. Sie können sicherlich nicht nur Invarianten anstelle von Pre- und Post-Bedingungen - in diesem Fall Teil des Objekt unveränderlich ist „Etwas auf dem Grill ist oder nicht“, sondern die Voraussetzung für lightOnFire muss wissen, dass das Element auf dem Grill ist. Sie können nie von dem Objekt invariant schließen. Es stimmt, dass von Vor- und Nachbedingungen und einem bekannten Startzustand, können Sie (unter der Annahme, dass die Objekte Struktur durch Methoden nur wandelbar ist und die prä- und post Bedingungen beschreiben alle Umweltveränderungen), ein Objekt invariant schließen. Dies kann jedoch komplex sein, und wenn man die Dinge „in der Sprache“ ist die besagt, es ist einfacher, nur beides zu bieten.

Natürlich in Varianten zu tun, dass ein boolean Element angeben, entweder wahr oder falsch ist, ist ein bisschen sinnlos -. Das Typsystem dafür sorgt, dass

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top