Ich implementiere mein eigenes ArrayList für Schulzwecke, aber um die Dinge etwas aufzupeppen, versuche ich C# 4.0 Code Contracts zu verwenden. Alles war in Ordnung, bis ich Contracts zu den Konstruktoren hinzufügen musste. Soll ich Contract.Ensures() im leeren Parameterkonstruktor hinzufügen?Design von Verträgen und Konstruktoren
public ArrayList(int capacity) {
Contract.Requires(capacity > 0);
Contract.Ensures(Size == capacity);
_array = new T[capacity];
}
public ArrayList() : this(32) {
Contract.Ensures(Size == 32);
}
Ich würde sagen ja, jede Methode sollte einen gut definierten Vertrag haben. Auf der anderen Seite, warum, wenn es nur Arbeit an den "Haupt" Konstruktor delegiert? Logischerweise würde ich nicht brauchen.
Der einzige Punkt, den ich sehe, wo es nützlich wäre, den Vertrag in beiden Konstruktoren explizit zu definieren, ist, wenn wir in Zukunft Intelisense Unterstützung für Verträge haben. Wäre dies der Fall, dann wäre es sinnvoll, genau anzugeben, welche Verträge jede Methode hat, wie sie in Intelisense erscheinen würde.
Gibt es auch Bücher, die ein wenig tiefer in die Prinzipien und die Verwendung von Design by Contracts einsteigen? Eine Sache ist das Wissen über die Syntax, wie man Contracts in einer Sprache benutzt (C#, in diesem Fall), andere wissen, wie und wann man sie benutzt. Ich habe mehrere Tutorials und Jon Skeets C# in Depth Artikel darüber gelesen, aber ich würde gerne ein bisschen tiefer gehen, wenn möglich.
Dank
bezogen: http://stackoverflow.com/questions/2539497/code-contracts-do-we-have-to-specify-contract-requires-statements-redundant/2626997 – porges
Sie könnten den "Vertrag. Benötigt (Kapazität> 0); " Wenn Sie den c'tor nehmen, nehmen Sie einen UI, der einem int gegenübersteht. Ich versuche Contracts als letzten Ausweg zu verwenden, da die Sprache Ihre Fähigkeit einschränkt, den nächsten Entwickler wissen zu lassen, was Sie bei der Erstellung des Codes gedacht haben. Wenn Sie sich entscheiden, den Vertrag zu behalten, würde ich schreiben "Contract.Requires (Kapazität> = 0);" Denn man sollte immer in der Lage sein, eine leere Datenstruktur zu konstruieren und später Objekte hinzuzufügen. –
"... in Zukunft haben wir die Unterstützung von Intelisense für Verträge." Die Zukunft ist jetzt! http://visualstudiogallery.msdn.microsoft.com/1ec7db13-3363-46c9-851f-1ce455f66970 –