Хотелось бы получить мнения по поводу идеи частичного выполнения дизайна по контракту. Цель состоит в том, чтобы добавить к языкам, которые не предлагают ему облегченную версию контрактов (только инварианты и условия публикации), без необходимости во внешней библиотеке.
Мой пример написан на Java, но я полагаю, что идея хороша для многих объектно-ориентированных языков.
У нас есть такой класс:
class myClass{
type1 field1;
type2 field2;
public myClass(type1 param1){
//do something
}
public type3 method1(type1 param1, type3 param2){
if (paramsAreNotOk()){
throw new IllegalArgumentException();
}
// do a lot of things
return //do something
}
}
Мы расширяем приведенный выше код таким образом:
class myClass{
type1 field1;
type2 field2;
public myClass(type1 param1){
//do something
assert invariant();
}
public type3 method1(final type1 param1, final type3 param2){
assert invariant();
myClass old;
assert ((old = this.clone()) != null)
if (paramsAreNotOk()){
throw new IllegalArgumentException();
}
//do a lot of things
type3 res = //do something
assert method1_post(old, param1, param2, res);
assert invariant();
return res;
}
protected boolean invariant(){
// states something about myClass and return a boolean
// OR
// uses some assertions on some helping methods
}
protected boolean method1_post(myClass old, type1 param1, type3 param2, type3 res){
// states something about res and about the modifications made on old
// OR
// uses some assertions on some helping methods
}
}
Ограничения этого подхода:
- без предварительных условий.
- контракт не наследуется (но обратите внимание, что инвариант и пост-условия защищены и могут быть повторно использованы подклассом).
- нет Не проверяйте, не изменяют ли инварианты и постусловия состояние нашего объекта, следовательно, существует риск побочных эффектов.
- контракт не является частью нашей документации в ясной форме.
- нам нужно сделать клонируемым каждый класс.
Теперь несколько вопросов:
- этот метод каким-либо образом вредит выступлениям? Я имею в виду, что даже локальные переменные old и res удаляются JIT-компилятором, если утверждения отключены?
- видите ли вы какие-либо недостатки этого подхода? Почему бы вам не использовать это в своих классах?
- вы можете предложить какие-нибудь улучшения?
Спасибо за чтение и за ваше мнение.