25.10. Подробно о типах OCLBвыражений 561
Обратите внимание, как оба этих класса, переопределив инвариант
класса BankAccount::balance, усилили его.
Ограничение, касающееся уникальности accountNumber каждого счета,
можно представить как инвариант класса BankAccount:
context BankAccount
inv uniqueAccountNumber:
у каждого BankAccount должен быть уникальный accountNumber
BankAccount::allInstances( )>isUnique( account | account.accountNumber )
Из рис. 25.13 видно, что у каждого BankAccount есть единственный вла
делец (owner) и один или более операторов (operator). Владелец – это че
ловек (Person), которому принадлежит счет, а операторы – это люди
(People), имеющие право снимать деньги и имеющие доступ к информа
ции счета. Существует бизнесограничение о том, что owner должен
быть также и operator. Данное ограничение может быть отражено сле
дующим образом:
context BankAccount
inv ownerIsOperator:
владельцем BankAccount должен быть один из его операторов
self.operators>includes( self.owner )
Для Person можно записать такое ограничение:
context Person
inv ownedAccountsSubsetOfOperatedAccounts:
счета, принадлежащие Person (ownedAccount), должны быть
подмножеством счетов, управляемых этим Person (operatedAccount)
self.operatedAccounts>includesAll( self.ownedAccounts )
При сравнении объектов в OCLвыражениях необходимо помнить, что
они могут быть:
• идентичные – каждый объект ссылается на одну и ту же область па
мяти (имеют идентичные объектные ссылки);
• эквивалентные – каждый объект имеет одинаковый набор значе
ний атрибутов, но разные объектные ссылки.
В приведенных выше OCLвыражениях мы всегда аккуратны при
сравнении объектов на основании их идентичности или эквивалентно
сти соответственно. С этим надо проявлять осторожность. Например,
сравнение объектов BankAccount (сравнение на основании идентично
сти) не то же самое, что сравнение accountNumber этих объектов (сравне
ние на основании эквивалентности).
25.10.2. pre:, post: и @pre
Предусловия и постусловия применяются к операциям. Их экземпля
ром контекста является экземпляр классификатора, которому при
надлежат эти операции.