Здравствуйте, Сергей Губанов, Вы писали:
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>>