Разработка классов - Типичный рабочий процесс

Формулировка класса

В этом примере обсуждается, как подойти к проекту и реализации класса. Цель этого класса состоит в том, чтобы представлять привычную концепцию (банковский счет). Однако к большинству проектов классов можно применить тот же подход.

Чтобы спроектировать класс, который представляет банковский счет, сначала определите элементы данных и операции, которые формируют вашу абстракцию банковского счета. Для примера банковский счет имеет:

  • Номер счета

  • Остаток на счете

  • Статус (открытый, закрытый и т.д.)

Необходимо выполнить определенные операции на банковском счете:

  • Создание объекта для каждого банковского счета

  • Депозитные деньги

  • Снять деньги

  • Сгенерируйте оператор

  • Сохраните и загрузите BankAccount объект

Если остаток слишком мал, и вы пытаетесь вывести деньги, банковский счет транслирует уведомление. Когда это событие происходит, банковский счет передает уведомление другим сущностям, которые предназначены для прослушивания этих уведомлений. В этом примере упрощенная версия программы менеджера счетов выполняет эту задачу.

В этом примере программа менеджера счетов определяет статус всех банковских счетов. Эта программа контролирует сальдо счета и присваивает одно из трех значений:

  • open - Сальдо счета положительное

  • overdrawn - Остаток на счете перерисован, но на $200 или менее.

  • closed - Остаток на счете перерисован более чем на $200.

Эти функции определяют требования BankAccount и AccountManager классы. Включать только те функциональные возможности, которые необходимы для достижения ваших конкретных целей. Поддержка специальных типов счетов путем подклассирования BankAccount и добавление более специфических функций к подклассам. Расширение AccountManager по мере необходимости для поддержки новых типов счетов.

Определение компонентов класса

Классы хранят данные в свойствах, реализуют операции с методами и поддерживают уведомления с событиями и прослушивателями. Вот как BankAccount и AccountManager классы определяют эти компоненты.

Данные классов

Класс определяет эти свойства для хранения номера счета, сальдо счета и статуса счета:

  • AccountNumber - Свойство для хранения номера, идентифицирующего конкретную учетную запись. MATLAB® присваивает значение этому свойству при создании образца класса. Только BankAccount методы класса могут задать это свойство. The SetAccess атрибут private.

  • AccountBalance - Свойство для хранения текущего остатка на счете. Классовая операция внесения и вывода денег присваивает стоимость этой собственности. Только BankAccount методы класса могут задать это свойство. The SetAccess атрибут private.

  • AccountStatus - The BankAccount класс задает значение по умолчанию для этого свойства. The AccountManager методы классов изменяют это значение всякий раз, когда значение AccountBalance падает ниже 0. The Access атрибут указывает, что только AccountManager и BankAccount классы имеют доступ к этому свойству.

  • AccountListener - Хранение для InsufficentFunds прослушиватель событий. Сохранение BankAccount объект не сохраняет это свойство, поскольку при загрузке объекта необходимо заново создать прослушиватель.

Классовые операции

Эти методы реализуют операции, определенные в формулировке класса:

  • BankAccount - Принимает номер счета и начальный остаток для создания объекта, представляющего счет.

  • deposit - Обновляет AccountBalance свойство, когда транзакция депозита происходит

  • withdraw - Обновляет AccountBalance свойство, когда операция вывода происходит

  • getStatement - Отображает информацию о счете

  • loadobj - Воссоздает прослушиватель менеджера учетных записей при загрузке объекта из MAT-файла.

События класса

Программа менеджера счетов изменяет статус банковских счетов с отрицательными сальдо. Чтобы реализовать это действие, BankAccount класс инициирует событие, когда вывод приводит к отрицательному сальдо. Поэтому срабатывание InsufficientsFunds событие происходит из withdraw способ.

Чтобы задать событие, задайте имя в events блок. Инициируйте событие вызовом notify метод класса handle. Потому что InsufficientsFunds не является предопределенным событием, его можно назвать любым char вектор и запустить его с любым действием.

BankAccount Реализация класса

Важно убедиться, что с любым объектом BankAccount связан только один набор данных класс. Вы не хотите, чтобы независимые копии объекта, который мог бы иметь, для примера, другие значения для сальдо счета. Поэтому реализуйте BankAccount класс как класс handle. Все копии данного указателя объекта ссылаться на одни и те же данные.

BankAccount Обобщение классов

Класс BankAccountОбсуждение
classdef BankAccount < handle

Класс Handle, поскольку должна быть только одна копия любого образца BankAccount.Компарион классов Handle и Value

   properties (Access = ?AccountManager)
        AccountStatus = 'open'
   end

AccountStatus содержит статус счета, определяемый текущим сальдо. Доступ ограничен BankAccount и AccountManager классы. Доступ для членов класса

   properties (SetAccess = private)
      AccountNumber
      AccountBalance
   end
   properties (Transient)
      AccountListener
   end

AccountStatus доступ к свойствам по AccountManager методы классов.

AccountNumber и AccountBalance свойства имеют доступ к частному набору.

AccountListener property является переходным, поэтому указатель прослушивателя не сохранен.

См. «Задание атрибутов свойств».

   events
      InsufficientFunds
   end

Класс определяет событие, вызываемое InsufficentFunds. withdraw метод запускает событие, когда сальдо счета становится отрицательным.

Информацию о событиях и слушателях см. в разделе События.

   methods

Блок обычных методов. Синтаксис см. в разделе «Определение методов и функций классов».

      function BA = BankAccount(AccountNumber,InitialBalance)
         BA.AccountNumber = AccountNumber;
         BA.AccountBalance = InitialBalance;
         BA.AccountListener = AccountManager.addAccount(BA);
      end

Конструктор инициализирует значения свойств с помощью входных параметров.

AccountManager.addAccount является статическим методом AccountManager класс. Создаёт прослушиватель для InsufficientFunds событие и хранит указатель на прослушиватель в AccountListener свойство.

      function deposit(BA,amt)
         BA.AccountBalance = BA.AccountBalance + amt;
         if BA.AccountBalance > 0
            BA.AccountStatus = 'open';
         end
      end

deposit настраивает значение AccountBalance свойство.

Если AccountStatus является closed и последующий депозит приносит AccountBalance в положительную область значений, затем AccountStatus сбрасывается на open.

      function withdraw(BA,amt)
         if (strcmp(BA.AccountStatus,'closed')&& ...
            BA.AccountBalance < 0)
            disp(['Account ',num2str(BA.AccountNumber),...
               ' has been closed.'])
            return
         end
         newbal = BA.AccountBalance - amt;
         BA.AccountBalance = newbal;
         if newbal < 0
            notify(BA,'InsufficientFunds')
         end
      end

Обновления AccountBalance свойство. Если значение счета отрицательно в результате вывода средств, notify триггеры InsufficentFunds событие.

Дополнительные сведения о прослушивателях см. в разделах События и Синтаксис Прослушивателей.

      function getStatement(BA)
         disp('-------------------------')
         disp(['Account: ',num2str(BA.AccountNumber)])
         ab = sprintf('%0.2f',BA.AccountBalance);
         disp(['CurrentBalance: ',ab])
         disp(['Account Status: ',BA.AccountStatus])
         disp('-------------------------')
      end

Отображение выбранной информации об учетной записи.

   end
   methods (Static)

Конец обычных методов блок.

Начало статических методов блок. См. Статические методы

      function obj = loadobj(s)
         if isstruct(s)
            accNum = s.AccountNumber;
            initBal = s.AccountBalance;
            obj = BankAccount(accNum,initBal);
         else
            obj.AccountListener = AccountManager.addAccount(s);
         end
      end

loadobj метод:

  • Если операция загрузки не удалась, создайте объект из struct.

  • Воссоздаёт прослушиватель с помощью только что созданного BankAccount объект как источник.

Для получения дополнительной информации о сохранении и загрузке объектов см. Раздел «Сохранение и загрузка процесса для объектов»

   end
end

Конец статических методов блок

Конец classdef

 Разверните для кода класса

Формулировка AccountManager Класс

Цель AccountManager класс предназначен для предоставления услуг учетным записям. Для BankAccount класс, AccountManager класс прослушивает вывод средств, который заставляет баланс опуститься в отрицательную область значений. Когда BankAccount объект запускает InsufficientsFunds событие, AccountManager сбрасывает состояние учетной записи.

The AccountManager класс не хранит никаких данных, поэтому ему не нужны свойства. The BankAccount объект хранит указатель на объект прослушивателя.

The AccountManager выполняет две операции:

  • Присвоение статуса каждому счету в результате вывода средств

  • Добавляет счет в систему путем контроля сальдо счетов.

Классовые компоненты

The AccountManager класс реализует два метода:

  • assignStatus - Метод, который присваивает статус BankAccount объект. Служит в качестве обратного коллбэка прослушивателя.

  • addAccount - Метод, который создает InsufficientFunds прослушиватель.

Реализация AccountManager Класс

The AccountManager класс реализует оба метода как статические, потому что нет необходимости в AccountManager объект. Эти методы работают с BankAccount объекты.

The AccountManager не предназначен для создания экземпляров. Разделение функциональности AccountManager класс из BankAccount класс обеспечивает большую гибкость и расширяемость. Для примера, это позволяет вам:

  • Расширение AccountManager класс для поддержки других типов учетных записей при сохранении простых и специализированных классов индивидуальных учетных записей.

  • Изменение критериев статуса счета без влияния на совместимость сохраненных и загруженных BankAccount объекты.

  • Разрабатывайте Account суперкласс, который выявляет общее для всех счетов, не требуя от каждого подкласса реализации функциональности управления счетами

AccountManager Обобщение классов

Класс AccountManagerОбсуждение
classdef AccountManager

Этот класс определяет InsufficentFunds прослушиватель событий и коллбэк слушателя.

   methods (Static)

Не нужно создавать образец этого класса, поэтому заданные методы являются статическими. См. «Статические методы».

   function assignStatus(BA)
      if BA.AccountBalance < 0
         if BA.AccountBalance < -200
            BA.AccountStatus = 'closed';
         else
            BA.AccountStatus = 'overdrawn';
         end
      end
   end

The assignStatus метод является коллбэком для InsufficentFunds прослушиватель событий. Он определяет значение BankAccount AccountStatus объекта свойство, основанное на значении AccountBalance свойство.

The BankAccount конструктор классов вызывает AccountManager addAccount метод для создания и хранения этого прослушивателя.

   function lh = addAccount(BA)
      lh = addlistener(BA, 'InsufficientFunds', ...
         @(src, ~)AccountManager.assignStatus(src));
   end

addAccount создаёт прослушиватель для InsufficentFunds событие, которое BankAccount класс задает.

См. Управление жизненным циклом приемника

   end
end

end операторы для methods и для classdef.

 Разверните для кода класса

Использование объектов BankAccount

The BankAccount класс, хотя и слишком простой, демонстрирует, как ведут себя классы MATLAB. Для примера создайте BankAccount объект с номером счета и начальным депозитом в размере 500 долларов:

BA = BankAccount(1234567,500)
BA = 

  BankAccount with properties:

      AccountNumber: 1234567
     AccountBalance: 500
    AccountListener: [1x1 event.listener]

Используйте getStatement метод проверки состояния:

getStatement(BA)
-------------------------
Account: 1234567
CurrentBalance: 500.00
Account Status: open
-------------------------

Выполните вывод средств в размере 600 долларов США, что приведет к отрицательному остатку на счете:

withdraw(BA,600)
getStatement(BA)
-------------------------
Account: 1234567
CurrentBalance: -100.00
Account Status: overdrawn
-------------------------

Вывод $600 привел к InsufficientsFunds событие. Текущие критерии, заданные классом AccountManager, приводят к статусу overdrawn.

Сделать еще один вывод в размере $200:

withdraw(BA,200)
getStatement(BA)
-------------------------
Account: 1234567
CurrentBalance: -300.00
Account Status: closed
-------------------------

Теперь AccountStatus задано значение closed по прослушивателю и дальнейшим попыткам сделать вывод блокируются без запуска события:

withdraw(BA,100)
Account 1234567 has been closed.

Если на AccountBalance возвращается к положительному значению депозитом, затем AccountStatus возвращается в открытый режим и вывод средств снова разрешается:

deposit(BA,700)
getStatement(BA)
-------------------------
Account: 1234567
CurrentBalance: 400.00
Account Status: open
-------------------------