Хотелось бы получить мнение по поводу идеи частичной реализации дизайна по контракту.Цель состоит в том, чтобы добавить к языкам, которые не предлагают упрощенную версию контрактов (только инварианты и условия публикации), без необходимости использования внешней библиотеки.
Мой пример написан на 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
}
}
Ограничения этого подхода:
- без предварительных условий.
- договор не наследуется (но обратите внимание, что инвариант и постусловия защищены и могут быть повторно использованы подклассом).
- тамнет никакой проверки, что инвариант и постусловия не изменяют состояние нашего объекта, следовательно, существует риск побочных эффектов.
- контракт не является частью нашей документации в явном виде.
- нам нужно сделать клонируемым каждый класс.
Теперь несколько вопросов:
- не мешает ли этот метод выступлениям?Я имею в виду, что даже старые локальные переменные и переменные res удаляются компилятором JIT, если утверждения отключены?
- видите ли вы какие-либо недостатки этого подхода?Почему бы вам не использовать это в своих классах?
- можете ли вы предложить какие-либо улучшения?
Спасибо за ваше чтение и за ваши мнения.