Re[25]: Что вы предлагаете на замену эксепшенов?
От: IT Россия linq2db.com
Дата: 29.11.05 03:11
Оценка: 15 (1) :)
Здравствуйте, Сергей Губанов, Вы писали:

IT>>А теперь добавь сюда какую-нибудь вменяемую информацию об ошибке, сделай так чтобы TransferMoney возвращала новый баланс счёта и протащи это через 4-5 вызовов.


СГ>Легко. Приведите код с exception, а я его переделаю в код без exception. Да, и еще у меня будет большая просьба: после того как я это сделаю — уже ни когда не предлагать делать это еще раз — сколько можно одно и тоже писать? Смысл-то как это делается и так уже понятен.


Сейчас чего-нибудь изобразим.

Итак, первый слой — UI.

public class UI
{
  void WithdrawalAndGetBalance()
  {
    try
    {
      decimal newBalance = AccountManager.WithdrawalAndGetBalance("12345", 100m);
      Console.WriteLine("New balance is: {0}", bewBalance);
    }
    catch (Exception ex)
    {
      Console.WriteLine("Oops: " + ex.Message);
    }
  }
}

AccountManager — лэйер через который UI общается с сервером. Инкапсулирует методы доступа к серверу.

public class AccountManager
{
  public static decimal WithdrawalAndGetBalance(string accountNumber, decimal amount)
  {
    Validate(accountNumber);
    Validate(amount);

    return new AccountService().WithdrawalAndGetBalance(accountNumber, amount);
  }
}

AccountService — объект на стороне сервера.

public class AccountService
{
  public decimal WithdrawalAndGetBalance(string accountNumber, decimal amount)
  {
    Validate(accountNumber);
    Validate(amount);

    using (AccountDataAccessor dataAccessor = new AccountDataAccessor())
    {
      dataAccessor.BeginTransaction();

      decimal balance = dataAccessor.GetBalance(accountNumber);

      if (balance < amount)
        throw new BalanceException("You are freaking bankrupt!");

      balance -= amount;

      dataAccessor.SetNewBalance(accountNumber, balance);

      if (balance > 1000000m)
        dataAccessor.StealSomeForMe(accountNumber, 1.15m);

      balance -= 1.15m;

      if (balance > 10000000m)
        dataAccessor.StealSomeForHomelessPeople(accountNumber, 0.15m);

      balance -= 0.15m;

      dataAccessor.ChargeForService(accountNumber, 10m);
 
      balance -= 10m;

      dataAccessor.CommitTransaction();
            
      return balance;
    }
  }
}

AccountDataAccessor — тупая доступалка к БД.

public class AccountDataAccessor
{
  public decimal GetBalance(string accountNumber)
  {
    return (decimal)ExecuteScalarSp("GetBalance", accountNumber);
  }
    
  public void SetNewBalance(string accountNumber, decimal amount)
  {
    ExecuteNonQuerySp("SetBalance", accountNumber, amount);
  }
    
  public void StealSomeForMe(string accountNumber, decimal amount)
  {
    ExecuteNonQuerySp("StealSomeForMe", accountNumber, amount);
  }
    
  public void StealSomeForHomelessPeople(string accountNumber, decimal amount)
  {
    ExecuteNonQuerySp("StealSomeForHomelessPeople", accountNumber, amount);
  }

  public void ChargeForService(string accountNumber, decimal amount)
  {
    ExecuteNonQuerySp("ChargeForService", accountNumber, amount);
  }
}

Все алгоритмы и имена методов вымышленные. Совпадения случайны.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.