昨天我在采访中被问到“交易可以成为一个班级吗?”
我说,“是的”。他回答了课程或功能?
我回答说,如果它有一个非常简单的功能,它可以是一个函数,但它应该是一个类。
他说好吧让我们接受它,因为它可以成为一个班级。写下它的代码。
我写道:
class transaction{
int timestamp;
Account acc;
int type;
public transaction(int timestamp,int type,Account acc){
this.timestamp = timestamp; this.int = int ; this.acc =acc;
}
public withdraw ( double amount){
acc.amount -= amount;
}
//And other type of transaction function, like add money etc.
}
如果我回答对错,请告诉我,我从他的表达中看不出多少。
答案 0 :(得分:3)
Transaction
是一个名词,因此它应该被建模为一个对象。消息(或者就此而言,函数)是动词,因此非常适合执行操作。 transaction
(名词)可以start
(动词),end
(动词)或{ {1}}(动词)并且应该完全abort
ed(动词)或revert
ted(动词 )。
修改强>
@AlexeiLevenkov在评论部分中的评论正确地指出commit
不是正确的withdraw
消息。 Transaction
操作的正确消息是(Smalltalk语法)
withdraw
使anAccount withdraw: anAmount in: aTransaction
适当的withdraw:in:
操作(方法)。鉴于Account
的一般性质,它应该在
Transaction
这样我们就有了
aTransaction do: aBlock
aTransaction start
[aBlock value] ifCurtailed: [aTransaction abort].
aTransaction commit
anAccount withdraw: anAmount in: aTransaction
aTransaction do: [anAccount withdraw: anAmount]
对象中有趣的是它能够捕获(和模型化)基本协议Transaction
,start
,commit
以及方法abort
用于通用操作的一般评估(在我的编码中由Smalltalk块表示。)
答案 1 :(得分:0)
我可能会写得更像这样:
public interface IRecord
{
public DateTime TimeStamp {get;set;}
}
public enum TransactionType
{
Debit , Credit
}
public class Transaction : IRecord
{
public DateTime TimeStamp {get;set;}
public decimal Amount {get;set;}
public TransactionType Type {get;set;}
public Account TargetAccount {get;set;}
}
public class Atm
{
private List<Tuple<Acount,Transaction>> _record = new List<Tuple<Account,Transaction>>();
private ICashHandler _cashHandler;
public Atm(ICashHandler handler)
{
_cashHandler = handler;
}
public void Withdraw(Account account, decimal amount)
{
_record.Add(Tuple.Create(account,
new Transaction {
TimeStamp = DateTime.Now,
Amount = amount,
Type = TransactionType.Debit,
TargetAccount = account
})
);
_cashHandler.Dispense(amount);
}
public void Deposit(Account account)
{
decimal amount;
if( _cashHandler.TakeDeposit( out amount ) )
{
_record.Add(Tuple.Create(account,
new Transaction {
TimeStamp = DateTime.Now,
Amount = amount,
Type = TransactionType.Credit,
TargetAccount = account
})
);
}
}
}
只是一个简单的例子,应该检查帐户金额等。
想法是事务是一个记录,事务发生的动作将是方法(在这种情况下由Atm类处理)。交易类不应该有撤回和存款等操作,只需记录一个帐户操作,而不是实际操作。