交易可以成为一个类吗?

时间:2015-03-09 02:01:06

标签: java c# oop object-oriented-analysis

昨天我在采访中被问到“交易可以成为一个班级吗?”

我说,“是的”。他回答了课程或功能?

我回答说,如果它有一个非常简单的功能,它可以是一个函数,但它应该是一个类。

他说好吧让我们接受它,因为它可以成为一个班级。写下它的代码。

我写道:

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.

} 

如果我回答对错,请告诉我,我从他的表达中看不出多少。

2 个答案:

答案 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] 对象中有趣的是它能够捕获(和模型化)基本协议Transactionstartcommit以及方法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类处理)。交易类不应该有撤回和存款等操作,只需记录一个帐户操作,而不是实际操作。