Frage

habe ich vor kurzem hatte ein paar Szenarien, in denen kleine Änderungen an Code geführt haben Voraussetzungen für mehrere Klassen in wechselnden und ich frage mich, ob Design durch Vertrag sollte auf diese Weise oder nicht sein.

public Goal getNextGoal() {
    return goalStack.pop();
}

Wenn goalStack.pop() eine Voraussetzung hat, dass der Stapel nicht leer ist, dann tut getNextGoal() Notwendigkeit, explizit die gleiche Voraussetzung hat? Es scheint, wie die Voraussetzungen erben würde die Dinge machen spröde und zu einer Warteschlange oder eine andere Struktur zu ändern würde die Voraussetzungen zu getNextGoal() ändern, ist es Anrufer und der Anrufer seinen Anrufer. Aber es scheint, als ob nicht die Voraussetzungen erben würde die Verträge und die Anrufer verbergen, und die Anrufer Anrufer, würde nicht wissen, über die Voraussetzungen.

So spröde Code, in dem alle Anrufer kennen und übernehmen die Vor- und Nachbedingungen der Code, den sie anrufen oder mysteriösen Code, wo Anrufer nie wissen, was die tieferen Vor- und Nachbedingungen sind?

War es hilfreich?

Lösung

Es hängt davon ab, was Ihre Berufung Methode genau funktioniert. Das Wichtigste mit Voraussetzungen ist, dass der Anrufer für die Erfüllung der Voraussetzungen verantwortlich ist .

Also, wenn Anrufer Ihrer GetNextGoal Methode sollte zur Bereitstellung eines nicht leeren Stapel verantwortlich sein, dann sollten Sie in der Tat auch festlegen Voraussetzungen auf Ihrer GetNextGoal Methode. Klarheit der Voraussetzungen ist einer der großen Vorteile der Codes Verträge, so dass ich Sie in allen Orten setzen sie würde vorschlagen, wo Anrufer haben die Voraussetzungen zu erfüllen.


Wenn Ihr Code jedoch spröde scheint, es könnte ein Zeichen dafür sein, dass Sie benötigen einen Code Refactoring .

Es scheint, wie die Vererbungs Voraussetzungen würde die Dinge machen spröde und in eine Warteschlange zu ändern oder andere Struktur würde die Änderung Vorbedingungen getNextGoal (), ist es Anrufer und der Anrufer seiner Anrufer.

Wenn Sie die Warteschlange der Anrufer aussetzen und später (auf eine andere Struktur, wie Sie gesagt haben) ändern, wäre es der Anrufer auch zu ändern haben. Dies ist in der Regel ein Zeichen von spröden Code.

Wenn Sie belichten, um eine Schnittstelle statt eine bestimmte Warteschlange Implementierung , Ihre Voraussetzungen auch die Schnittstelle nutzen könnten, und Sie würden nicht die Voraussetzungen jedes Mal Ihrer Änderungen Implementierung ändern. So ist in weniger spröde Code zur Folge hat.

Andere Tipps

Ausnahmen eine Lösung, aber vielleicht nicht machbar für Ihre Situation.

Dokumentieren was, wenn es passiert, sind keine Ziele ist normal.E.G. Dies ist, was malloc () tut in C

Ich kann nicht sagen, wenn Sie mit Java oder C ++ oder etwas anderes als jede Sprache haben könnte etwas mehr natürliche Art und Weise für die jeweilige Sprache.

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