Я готовлюсь к экзамену и просматриваю прошлые статьи, чтобы понять, чего ожидать. Я немного застрял на следующем и был бы очень признателен, если бы кто-нибудь мог дать несколько примеров ответов.
Записать предварительные условия и постусловия в 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
Ответы:
Предварительные и постусловия являются контрактом.
true
является, функция должна выдать ошибку.true
является реализацией, есть ошибка.И предварительные, и постусловия должны быть логическими выражениями.
Давайте возьмем
empty?
в качестве примера. Эта функция всегда может быть вызвана, поэтому нет никаких предварительных условий. И функция не имеет побочного эффекта, поэтому нет постусловия.Давайте возьмем в
pop
качестве другого примера. Если эта функция вызывает исключение для пустого стека, предварительное условиеself.size > 0
, с другой стороны, если функция возвращаетnil
пустой стек, предусловия нет. Оба являются допустимыми вариантами дизайна, не знакомы с выбором Java. В любом случае постусловием является то,self.size = previous.size - 1
что договорным побочным эффектом является удаление элемента.И так далее …
NB, использовал псевдокод, так как не знаком с OCL.
источник