Wie füge ich eine Voraussetzung, die in einer java-Klasse, die Methode oder Konstruktor?
Dies ist für eine java-Klasse, ich bin dabei. Das Buch erwähnt die Vorbedingungen und nachbedingungen, aber macht nicht irgendwelche Beispiele, wie man code. Es geht auf zu reden, behauptet habe ich, aber die Zuordnung mache ich speziell Mitgliedstaaten legen die Voraussetzungen und Prüfung der Voraussetzungen mit versichert.
Jede Hilfe wäre toll.
Ich denke, man könnte wickeln Sie den Konstruktor oder einer Methode in eine andere cnostructor oder einer Methode und implementieren Sie pre - oder postconditions es
Wie über das werfen von Ausnahmen wie Eifel-shows in Ihrer toturials?
Voraussetzung ist nicht wirklich etwas, was man-code. Es ist Bestandteil des Vertrages für eine Methode. Sie können code schreiben, der verhält sich in gewisser Weise, wenn eine Voraussetzung scheitert. In Java die Konvention ist das werfen einer RuntimeException. Aber das ist nicht wirklich Codierung die Voraussetzung.
public MyClass() { assert <precondition>; ... stuff ... assert <postcondition>; }
an-es ist wirklich nichts besonderes. Beachten Sie, dass keine echten code würde die nachbedingungen. Das Zeug ist geprüft von außen, durch unit-tests.Wie über das werfen von Ausnahmen wie Eifel-shows in Ihrer toturials?
Voraussetzung ist nicht wirklich etwas, was man-code. Es ist Bestandteil des Vertrages für eine Methode. Sie können code schreiben, der verhält sich in gewisser Weise, wenn eine Voraussetzung scheitert. In Java die Konvention ist das werfen einer RuntimeException. Aber das ist nicht wirklich Codierung die Voraussetzung.
InformationsquelleAutor Jay Rohrssen | 2012-11-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einige Beispiele, die hier gegeben werden express-Voraussetzungen parameter-Validierung und übt Sie in Behauptungen. Eine nicht-private Methode sollte immer durchführen überprüfung der parameter, wie seine Anrufer aus dem Umfang der Umsetzung.
Neige ich dazu, zu behaupten, dass parameter valdiation nicht als eine Voraussetzung, die im Kontext von Objekt-orientierten Systemen - obwohl ich viele Beispiele für diesen Ansatz in die google-Kugel.
Mein Verständnis von Verträgen gestartet mit [BINDER1999]; die angegebenen Invarianten, Vorbedingung und nachbedingungen in Bezug auf den Zustand des Objekts-unter-test; ausgedrückt als Boolesche Prädikate. Diese Behandlung hält, wie der Staat-Raum gekapselt, die von einer Klasse verwaltet, in dem Methoden repräsentieren übergänge zwischen den Zuständen.
Diskussion der pre - und post-Bedingungen in Bezug auf die parameter und Rückgabewerte ist viel einfacher zu vermitteln, als die Diskussionen in Bezug auf die Zustand-Räume! So kann ich sehen, warum diese Ansicht ist weit verbreitet.
Zur Erinnerung, es gibt drei Arten der Vertrag unter Diskussion:
Wenn Sie treffen die (sinnvolle) Ansatz, dass überladene Methoden sind semantisch äquivalent, dann pre - und post-Bedingungen sind die gleichen für jede überlastung einer bestimmten Methode in eine Klasse.
Wenn interitance und überschriebene Methoden sind als, Vertrags-driven-design Folgen muss, das Liskov-Substitution-Prinzip; die Ergebnisse in der folgenden Regeln:
Denken Sie daran, natürlich, dass, Wann immer eine pre - oder post-condition geprüft wird, ist die invariante für die class-under-test müssen ebenfalls geprüft werden.
In Java können die Verträge geschrieben werden als geschützt Boolesche Prädikate. Zum Beispiel:
Nicht die Rolle der Invarianten Prädikat in der pre - oder post-condition-Prädikate, wie dies hätte zur Folge, invariante wird mehrmals aufgerufen bei jedem test-Punkt in einer abgeleiteten Klasse.
Dieser Ansatz verwendet ein wrapper für die Methode-unter-test, die Durchführung, für die ist jetzt in einer privaten Implementierung Methode, und lässt den Körper der Implementierung unberührt durch den Vertrag Behauptungen. Der wrapper übernimmt auch außergewöhnliches Verhalten - in diesem Fall, wenn die Umsetzung wirft und Ausnahme, der pre-Bedingung erneut geprüft, wie erwartet, für die eine Ausnahme-sichere Umsetzung.
Beachten Sie, dass, wenn, wie im obigen Beispiel, 'foo_impl_()' löst eine Ausnahme aus, und die nachfolgende Voraussetzung, Behauptung in 'finally' block auch fehlschlägt, dann wird die original-Ausnahme von 'foo_impl_()' verloren zugunsten der assertion-Fehler.
Bitte beachten Sie, dass die oben geschrieben ist, aus der top-of-my-head, also Fehler enthalten kann.
Referenz:
Update 2014-05-19
Ich gegangen back-to-basics mit Verträgen über ein-und Ausgänge.
Die Diskussion oben, und basierend auf [BINDER1999], als die Verträge in Bezug auf den Zustandsraum der Objekte-unter-test. Modellierung Klassen so stark gekapselt state-Räume ist grundlegend für die Entwicklung von software in einer skalierbaren Weise - aber das ist ein anderes Thema...
Überlegt, wie man die Lyskov substitutionsprinzip (LSP) Eins angewendet wird, kann (und muss) bei der Betrachtung der Vererbung:
Werden substituierbaren, die Methode in der abgeleiteten Klasse muss nicht mehr restriktiv auf seine input-Parameter als die Methode in der Basis Klasse - ansonsten dann Sie scheitern würden, wo die Basisklasse die Methode gelungen ist, zu brechen LSP Eins.
Ähnlich den output-Wert(s) und den Rückgabetyp (falls dies nicht Teil der Signatur der Methode) muss substituierbar für, hergestellt nach der Methode in der Basis Klasse - es muss mindestens so restriktiv in seiner Ausgabe Werte sonst auch brechen würde LSP Eins. Beachten Sie, dass dies gilt auch für den return-Typ - aus, die Regeln über die co-Variante Rückkehr Typen abgeleitet werden können.
Daher Verträge, die auf der input-und output-Werte von einer überschriebenen Methode folgt den gleichen Regeln für die Kombination des erbschaft-und pre - und post-Bedingungen sind; und um diese Regeln umsetzen effektiv diese umgesetzt werden müssen, getrennt von der Methode, für die Sie gelten:
Beachten Sie, dass diese nahezu identisch sind, mit
foo_pre_()
undfoo_post_()
beziehungsweise, und sollte aufgerufen werden, in der Testumgebung auf dem gleichen test-Punkte, da diese Verträge.Den pre - und post-Bedingungen definiert, für die eine Methode-die Familie - die gleichen Bedingungen gelten für alle überladenen Varianten der Methode. Die input-und output-Verträge für eine bestimmte Signatur der Methode; jedoch, diese zu verwenden, sicher und vorhersehbar war, müssen wir verstehen, die Signatur-lookup-Regeln für unsere Sprache und für die Umsetzung (vgl. C++
using
).Beachten Sie, dass in der oben genannten, ich benutze den Ausdruck
Parameters... p
als kurzer hand für einen beliebigen Satz von Parametertypen und-Namen; es ist nicht ment impliziert eine varatic Methode!InformationsquelleAutor simon.watts
Sprachen wie Eiffel support "Voraussetzungen" und "nachbedingungen", als einen grundlegenden Bestandteil der Sprache.
Kann man ein überzeugendes argument, dass der ganze Zweck einer "object-Konstruktor" ist genau, um "die Klasse invariant".
Aber mit Java (wie bei fast jedem anderen post-C++ Objekt orientierte Sprache), Sie haben ziemlich viel zu fake.
Hier ist eine ausgezeichnete tech-Hinweis auf die Nutzung von Java "assert":
Der link ist nun tot. 🙁
Link aktualisiert 🙂
InformationsquelleAutor paulsm4
Verwenden Sie einfach
assert
code die Voraussetzungen. Zum Beispiel:InformationsquelleAutor Eamonn O'Brien-Strain
Voraussetzung ist eine Bedingung, die hat zu halten an einem bestimmten Punkt in der Ausführung eines Programms, wenn die Ausführung des Programms ist weiterhin richtig. Zum Beispiel wird die Anweisung "x = A[i];" hat zwei Voraussetzungen: das Eine ist nicht null und 0 <= i < A. Länge. Wenn eine dieser Voraussetzungen verletzt wird, dann ist die Ausführung der Anweisung wird ein Fehler generiert.
Auch eine Voraussetzung für ein Unterprogramm ist eine Bedingung, die wahr ist, wenn das Unterprogramm wird aufgerufen, um für das Unterprogramm korrekt funktioniert.
Hier ist Detail &
Hier ist ein Beispiel:
Vorbedingungen-nachbedingungen-Invarianten
InformationsquelleAutor Zaheer Ahmed
Anwenden Vorbedingungen und nachbedingungen Technik in Java müssen Sie definieren und ausführen von assertions zur Laufzeit. Ist es eigentlich erlaubt, zu definieren, Prüfungen zur Laufzeit im Quellcode.
Bitte befolgen Sie die details obigen code hier
InformationsquelleAutor tokhi