Я реализую свой собственный ArrayList для школьных целей, но чтобы немного оживить ситуацию, я пытаюсь использовать C # 4.0 Code Contracts. Все было хорошо, пока мне не нужно было добавлять Контракты в конструкторы. Должен ли я добавить Contract.Ensures () в пустой конструктор параметров?
public ArrayList(int capacity) {
Contract.Requires(capacity > 0);
Contract.Ensures(Size == capacity);
_array = new T[capacity];
}
public ArrayList() : this(32) {
Contract.Ensures(Size == 32);
}
Я бы сказал, да, у каждого метода должен быть четко определенный контракт. С другой стороны, зачем ставить, если это просто делегирование работы «главному» конструктору? Логично, что мне не нужно.
Единственное, что я вижу, где было бы полезно явно определить контракт в обоих конструкторах, - это если в будущем у нас будет поддержка контрактов Intelisense. Если это произойдет, было бы полезно четко указать, какие контракты имеет каждый метод, как это будет отображаться в Intelisense.
Кроме того, есть ли какие-нибудь книги, в которых рассказывается о принципах и использовании дизайна в контрактах? Одно дело - знать синтаксис использования контрактов в языке (в данном случае C #), другое - знать, как и когда его использовать. Я прочитал несколько уроков и статью Джона Скита о C # в глубине, но я хотел бы пойти немного глубже, если это возможно.
Спасибо