Код IT
← Каталог

Учебные примеры ООП — Банковский счёт

Инкапсуляция: скрытое поле баланса и методы deposit/withdraw.

smalltalk smalltalkencyclopediaoop-practice4 embed URL статья в энциклопедии
Smalltalk main.st
"=== bank-account.st — Pharo Playground ==="
Object subclass: #BankAccount
    instanceVariableNames: 'owner balance'
    classVariableNames: ''
    package: 'OOPPractice' !

BankAccount class >> newOwner: aName [
    ^ self basicNew
        owner: aName;
        balance: 1000;
        yourself
]

BankAccount >> owner: aString [ owner := aString ]
BankAccount >> balance: anInteger [ balance := anInteger ]

BankAccount >> deposit: amount [
    balance := balance + amount.
    Transcript show: 'Пополнение: +', amount printString, ' ₽. Баланс: ', balance printString, ' ₽'; cr
]

BankAccount >> withdraw: amount [
    amount > balance ifTrue: [
        Transcript show: 'Ошибка: недостаточно средств'; cr.
        ^ self ].
    balance := balance - amount.
    Transcript show: 'Снятие: -', amount printString, ' ₽. Баланс: ', balance printString, ' ₽'; cr
]

BankAccount >> showBalance [
    Transcript show: 'Текущий баланс: ', balance printString, ' ₽'; cr
]

"--- Demo ---"
| account |
account := BankAccount newOwner: 'Иван'.
account deposit: 500.
account withdraw: 200.
account showBalance.
Transcript show: 'Попытка прямого доступа к балансу...'; cr.
[ account balance ]
    on: MessageNotUnderstood do: [ :ex |
        Transcript show: 'Ошибка: прямой доступ к балансу запрещён'; cr ].
account showBalance.
"=== bank-account.st — Pharo Playground ==="
Object subclass: #BankAccount
    instanceVariableNames: 'owner balance'
    classVariableNames: ''
    package: 'OOPPractice' !

BankAccount class >> newOwner: aName [
    ^ self basicNew
        owner: aName;
        balance: 1000;
        yourself
]

BankAccount >> owner: aString [ owner := aString ]
BankAccount >> balance: anInteger [ balance := anInteger ]

BankAccount >> deposit: amount [
    balance := balance + amount.
    Transcript show: 'Пополнение: +', amount printString, ' ₽. Баланс: ', balance printString, ' ₽'; cr
]

BankAccount >> withdraw: amount [
    amount > balance ifTrue: [
        Transcript show: 'Ошибка: недостаточно средств'; cr.
        ^ self ].
    balance := balance - amount.
    Transcript show: 'Снятие: -', amount printString, ' ₽. Баланс: ', balance printString, ' ₽'; cr
]

BankAccount >> showBalance [
    Transcript show: 'Текущий баланс: ', balance printString, ' ₽'; cr
]

"--- Demo ---"
| account |
account := BankAccount newOwner: 'Иван'.
account deposit: 500.
account withdraw: 200.
account showBalance.
Transcript show: 'Попытка прямого доступа к балансу...'; cr.
[ account balance ]
    on: MessageNotUnderstood do: [ :ex |
        Transcript show: 'Ошибка: прямой доступ к балансу запрещён'; cr ].
account showBalance.