Поиск по этому блогу

пятница, 20 января 2012 г.

Пример использования контрактного программирования в java (iContract)

Впервые встретилось описание контрактного программирования на хабре в одном из комментариев, да и в статье. А после прочтения "Программиста - прагматика" появилось желание попробовать технологию.

В общем контрактное программирование - это попытка формализовать

взаимодействие между элементами алгоритма - делать на выходе, то что оговорено, получая оговоренные условия на вход.


Read more!
В работе я часто встречала ситуации, когда, например, начало методов было проверкой параметров на Null. Или эта проверка была в середине, что, очевидно, не добавляло понимания в работу метода. К тому же часто эти проверки дублировались в многих местах, или, что намного хуже вообще пропускались, из-за чего был баг.

Вот именно из-за этой неразберихи со вводом-выводом контрактное программирование выглядит довольно привлекательным.

В целом, можно выделить 3 блока при работе с контрактами
1) проверка предусловий - типы данных, формально оговоренные состояния входной информации;

2) проверка постусловий - типы возвращаемого значения, условия, которым должны соответствовать выходные данные;

3) проверка инвариантов - проверка на соблюдение условий, которым должны удовлетворять инварианты на каждом шаге алгоритма.

Разбор контрактного программирования я начала, с самой известной библиотеки iContract.

  1. Пример проверки предусловий
  2. 
        /**
         * @pre positiveParam > 0 
         */
        public static void setPositiveParam(int positiveParam) {
            System.out.println("Set a param" + positiveParam);
        } 
    
  3. Пример проверки постусловий
  4.     /**
         * @pre word != null
         * @post getWord() != null
         */
        public static void setWord(String word) {
            _word = word;
        }
    
  5. Пример для инвариантов
  6.     /**
         * 
         * @invariant forall Object r_text in list 
         *   r_text!=null
         */
        public static void addNotNullValues(List list, Integer value)
            list.add(value);
        }
Подключается iContract добавлением jar файло в проект + добавлением target в ant.

Однако, как оказалось, это не самая удачная технология для бизнес-приложений, у которой есть множество аналогов: от Google, для Spring framework, и другие, например contract4j
Вохможно, в следующей части рассмотрю аналог от google.

Комментариев нет:

Отправить комментарий