Выбрать главу

/// </summary>

public class Account1

{

    //закрытые поля класса

    int debit=0, credit=0;

    /// <summary>

    /// Зачисление на счет с проверкой

    /// </summary>

    /// <param name="sum">зачисляемая сумма</param>

    public void putMoney(int sum)

    {

        int res =1;

        if (sum >0)credit += sum;

        else res = -1;

        Mes(res,sum);

     }//putMoney

     /// <summary>

     /// Снятие со счета с проверкой

     /// </summary>

     /// <param name="sum"> снимаемая сумма</param>

     public void getMoney(int sum)

     {

          int res=2;

          if(sum <= balance())debit += sum;

          else res = -2;

          balance();

          Mes(res, sum);

     }//getMoney

/// <summary>

/// вычисление баланса

/// </summary>

/// <returns>тeкyщий бaлaнc</returns>

     int balance()

     {

          return(credit — debit);

     }

     /// <summary>

     /// Уведомление о выполнении операции

     /// </summary>

     void Mes(int result, int sum)

     {

          switch (result)

     {

              case 1:

                  Console.WriteLine("Операция зачисления денег прошла успешно!");

                  Console.WriteLine("Сумма={0},

                       Ваш текущий баланс={1}", sum,balance());

                  break;

             case 2:

                  Console.WriteLine("Операция снятия денег прошла успешно!");

                  Console.WriteLine("Сумма={0},

                        Ваш текущий баланс={1}", sum,balance());

                   break;

              case -1:

                   Console.WriteLine("Операция зачисления денег не выполнена!");

                   Console.WriteLine("Сумма должна быть больше нуля!");

                   Console.WriteLine("Сумма={0},

                         Ваш текущий баланс={1}", sum,balance());

                   break;

             case -2:

                   Console.WriteLine("Операция снятия денег не выполнена!");

                   Console.WriteLine("Сумма должна быть не больше баланса!");

                   Console.WriteLine("Сумма={0},

                          Ваш текущий баланс={1}", sum,balance());

                    break;

             default:

                   Console.WriteLine("Неизвестная операция!");

                  break;

          }

     }

}//Account1

Сравнивая этот класс с классом Account, можно видеть, что число полей сократилось с пяти до двух, упростились основные методы getMoney и putMoney. Но, в качестве платы, у класса появился дополнительный метод balance (), многократно вызываемый, и у метода Mes теперь появились два аргумента. Какой класс лучше? Однозначно сказать нельзя, все зависит от контекста, от приоритетов, заданных при создании конкретной системы.

Приведу процедуру класса Testing, тестирующую работу с классами Account и Account1;

public void TestAccounts ()

{

     Account myAccount = new Account();

     myAccount.putMoney(6000);

     myAccount.getMoney(2500);

     myAccount.putMoney(1000);

     myAccount.getMoney(4000);

     myAccount.getMoney(1000);

     //Аналогичная работа с классом Account1

     Console.WriteLine("Новый класс и новый счет!");

     Accountl myAccount1 = new Account1();

     myAccount1.putMoney(6000);

     myAccount1.getMoney(2500);

     myAccount1.putMoney(1000);

     myAccount1.getMoney(4000);

     myAccount1.getMoney(1000);

}

На рис. 9.1 показаны результаты работы этой процедуры.

Рис. 9.1. Тестирование классов Account и Account1

Функции с побочным эффектом

Функция называется функцией с побочным эффектом, если помимо результата, вычисляемого функцией и возвращаемого ей в операторе return, она имеет выходные аргументы с ключевыми словами ref и out. В языках C/C++ функции с побочным эффектом применяются сплошь и рядом. Хороший стиль ОО-программирования не рекомендует использование таких функций. Выражения, использующие функции с побочным эффектом, могут потерять свои прекрасные свойства, присущие им в математике. Если f(а) — функция с побочным эффектом, то a+f(а) может быть не равно f(а)+а, так что теряется коммутативность операции сложения.

Примером такой функции является функция f, приведенная выше. Вот тест, демонстрирующий потерю коммутативности сложения при работе с этой функцией-.