这里主要想分享ATM这道题, 其余和面经都一样
题目是: 给定五个interface(除了display以外, 其余皆为***空的***)
- Display
- string readInput(string displayText)
- void showError(string errMsg)
- void showMessage(string msg)
- AccountStore
- CardHandler
- CashDispenser
- CashInTake
请设计每个interface需要的methods来implement一个ATM以下的功能:
- createAccount
- login
- withdraw
- deposit
- checkBalance
- logout
…etc
Example
1. createAccount
void createAccount() {
string name = _display.readInput("Enter your name");
string address = _display.readInput("Enter your address");
// 除了display以外的interface皆为空的, 所以这里containsUser就是你要设计的
if (_accountStore.containsUser(name, address)) {
_display.showError("User already exists");
return;
}
string pincode = _display.readInput("Enter pincode");
// 这里, 我们设计卡片都带有userId, 之后只需要read卡片的userId再让user输入pincode, 即可login
string userId = _accountStore.createUser(name, address, pincode);
// ATM会做出一张实体的卡片并带有userId发给user
_cardHandler.createCard(userId);
}
2. withdraw
void withdraw() {
// 从卡片中读取userId
string userId = _cardHandler.readCard();
string pincode = _display.readInput("Enter pincode");
if (!_accountStore.verify(userId, pincode)) {
_display.showError("Invalid card or pincode");
return;
}
string amountStr = _display.readInput("Enter withdraw amount");
int amount = int.parse(amountStr);
// 扣除这个user的balance, 如果余额不足, 则不继续
if (!_accountStore.withdraw(userId, amount)) {
_display.showError("Not enough balance");
return;
}
// 发钞
_cardDispenser.dispense(amount);-baidu 1point3acres
}
这里就随意写写, 有错误就别经结了
这里只考虑一台ATM, 你也能和面试官讨论如果有多个ATM的时候, 这些method要怎么设计比较好
下午面了四个managers还是跪了, 不知道标准为何
补充内容 (2018-11-6 18:27):
比较像是设计另外4个interface的API