Допустимое состояние в классе лучше всего выражается с помощью понятия инвариант класса . Это логическое выражение, которое должно быть истинным, чтобы объекты этого класса были действительными.
Подход Design by Contract предполагает, что вы, как разработчик класса C, должны гарантировать, что инвариант класса имеет место:
- После строительства
- После вызова публичного метода
Это будет означать, что, поскольку объект инкапсулирован (никто не может изменить его, кроме как через вызовы открытых методов), инвариант также будет удовлетворен при входе в любой открытый метод или при входе в деструктор ( на языках с деструкторами), если есть.
Каждый открытый метод заявляет предварительных условий , которые должен выполнить вызывающий объект, и постусловий , которые будут удовлетворены классом в конце каждого открытого метода. Нарушение предусловия эффективно нарушает контракт класса, так что оно все еще может быть правильным, но оно не должно вести себя каким-либо особым образом или поддерживать инвариант, если оно вызывается с нарушением предусловия. Класс, который выполняет свой контракт при отсутствии нарушений вызывающего абонента, можно назвать правильный .
Концепция, отличная от правильной, но дополняющая ее (и, безусловно, принадлежащая множеству факторов качества программного обеспечения), - это надежная . В нашем контексте устойчивый класс будет обнаруживать, когда один из его методов вызывается без выполнения предварительных условий метода. В таких случаях обычно генерируется исключение нарушения утверждения, чтобы вызывающий абонент знал, что он его выдал.
Итак, отвечая на ваш вопрос, и у класса, и у его абонента есть обязательства в рамках классового контракта. Крепкий класс будет выявлять нарушения контракта и плевать. Правильный абонент не будет нарушать договор.
Классы, принадлежащие общедоступному интерфейсу библиотеки кода, должны быть скомпилированы как надежные, в то время как внутренние классы могут быть протестированы как надежные, но затем запускаться в выпущенном продукте как правильные, без проверки предварительных условий. Это зависит от ряда вещей и обсуждалось в другом месте .