Язык ограничений объектов (OCL) для стека в пакете java.util

10

Я готовлюсь к экзамену и просматриваю прошлые статьи, чтобы понять, чего ожидать. Я немного застрял на следующем и был бы очень признателен, если бы кто-нибудь мог дать несколько примеров ответов.

Записать предварительные условия и постусловия в OCL для каждой из следующих операций (включенных в класс Stack в пакете java.util):

  • (1) Boolean empty () - Проверяет, пуст ли этот стек
  • (2) E peek () - смотрит на объект в верхней части стека, не удаляя его из стека.
  • (3) E pop () - удаляет объект в верхней части этого стека и возвращает этот объект в качестве значения этой операции.
  • (4) E push (E item) - помещает предмет на вершину стека.

Здесь E обозначает тип элементов в стеке.

Мои попытки заключаются в следующем:

Boolean empty()
pre: none
post: self -> IsEmpty() = true
//should this be result -> IsEmpty() = true because it returns a boolean value?

E peek()
pre: self -> NotEmpty() = true
post: result = ??? 
// I lose hope at this stage. 

Я также не знаю, должен ли я ссылаться на элементы в стеке. Например: self.elements -> IsEmpty () = true

Если бы кто-нибудь мог мне помочь, я бы очень признателен.

РЕДАКТИРОВАТЬ

У друга есть следующие идеи:

context Stack empty()
pre: self.data.size = 0

context Stack peek()
pre: self.data.AsSequence.first

context Stack pop()
pre: !self.data.isEmpty
post: self.data.AsSequence.first.remove (not sure about this one)
post: self.data.count = @pre:data - 1

context Stack push(E Item)
post: self.data.asSquence.prepend(E.asSequence)
post: self.data.size = @pre.data.size + 1
Эми Джонс
источник
Если вы не получили никакой помощи, попробуйте группу UMLforum в группах Google.
Стивен С
1
Или, может быть, на StackOverflow :-)
Стивен C
Вы можете найти иллюстративные образцы OCL здесь: www-st.inf.tu-dresden.de/Lehre/WS01-02/fs/slides/fss5a-sl.pdf
Аксель Кемпер
Лекция по OCL 2.0: st.inf.tu-dresden.de/files/general/OCLByExampleLecture.pdf
Аксель Кемпер

Ответы:

1

Предварительные и постусловия являются контрактом.

  • Предварительным условием является та часть контракта, которую должен выполнить абонент. Если предварительным условием не trueявляется, функция должна выдать ошибку.
  • Постусловие - это часть контракта, которая должна выполняться функцией, и описывает ожидаемое изменение объекта / мира. Если постусловие не trueявляется реализацией, есть ошибка.

И предварительные, и постусловия должны быть логическими выражениями.

Давайте возьмем empty?в качестве примера. Эта функция всегда может быть вызвана, поэтому нет никаких предварительных условий. И функция не имеет побочного эффекта, поэтому нет постусловия.

Давайте возьмем в popкачестве другого примера. Если эта функция вызывает исключение для пустого стека, предварительное условие self.size > 0, с другой стороны, если функция возвращает nilпустой стек, предусловия нет. Оба являются допустимыми вариантами дизайна, не знакомы с выбором Java. В любом случае постусловием является то, self.size = previous.size - 1что договорным побочным эффектом является удаление элемента.

И так далее …

NB, использовал псевдокод, так как не знаком с OCL.

akuhn
источник