2015-03-09 2 views
1

Вчера меня спросили в интервью: «Может ли сделка быть классом?»Может ли транзакция быть классом?

Я сказал: «Да». Он ответил класс или функцию?

Я ответил, если у него очень простая функциональность, он может быть функцией, но должен быть классом.

Он сказал, что давайте примем его на тот момент, когда он может быть классом. Напишите свой код.

я писал:

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. 

} 

Позвольте мне знать, если я ответил, что правильно или неправильно, я не мог воспринимать многое из его выражений.

ответ

3

Transaction является существительное, и поэтому оно должно быть смоделировано как объект. Сообщения (или, если на то пошло, функции) являются глаголами и поэтому хорошо подходят для выполнения действий. transaction (существительное) может start (глагол), end (глагол) или abort (глагол) и должны быть полностью revert ред (глагола) или commit Ted (глагола).

EDIT

@ замечание AlexeiLevenkov в разделе комментариев правильно указывает на то, что withdraw не является надлежащим Transaction сообщение. Правильное сообщение для withdraw операции будет (Smalltalk синтаксис)

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, а также метод do: для общей оценки общих операций (представленных блоками Smalltalk в моем кодировании.)

+0

Итак, я думаю, я был прав, да? –

+0

Да, вы были правы. Надеюсь, у парня, который попросил, есть хорошее образование ООП. –

+1

@LeandroCaniglia Я бы сказал, что «вывод» - это не операция объекта транзакции, как показано в исходном образце, а тип транзакции ... Я действительно сомневаюсь, что OP был где-то рядом с тем, что искал интервьюер. –

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). Класс транзакции не должен иметь действия, такие как снятие и внесение депозита, это просто запись о действии на счет, а не действительное действие.