Эта миссия является ответом на очевидный вопрос: зачем в любом случае помещать заголовок процедуры в структуру данных? Общая идея заключается в том, чтобы увязать данные с кодом, который манипулирует этими данными. Что GetStringForm действительно делает (как мы увидим, когда я покажу вам реализацию процедуры) - это конвертирует несколько числовых значений, хранящихся в TPayment, в их строчные эквиваленты, и передает эти строчные эквиваленты обратно вызывающей процедуре TPayment в виде параметров. Эта задача тесно связана с данными TPayment, поэтому встраивание процедуры "внутрь" структуры данных имеет большой смысл. Нам не нужно больше раздумывать, с какой структурой данных работает GetStringForm. Она работает с TPayment. Это теперь очевидно из ее определения.

Запись TMortgage превращается в объект так же легко. И снова, задача включается в основном в том, чтобы построить процедуру, которая действует на TMortgage внутри самой TMortgage, недвусмысленно увязывая код с данными, на которые он воздействует. Вот определение нового класса:

TMortgage =

CLASS(TObject)

Periods Integer; { Число периодов в закладной}

PeriodsPerYear : Integer; { Число периодов в году } Principal : Real; { Величина основного капитала }

{ в центах }

Interest : Real; { Процентная ставка на год}

MonthlyPI : Real; { Месячный платеж в центах}

Payments : TList; (Объект List, содержащий платежи}

CONSTRUCTOR Init(StartPrincipal : Real;

Startlnterest : Real

StartPeriods : Integer;
StartPeriodsPerYear : Integer); PROCEDURE SetNewInterestRate(NewRate : Real); PROCEDURE Recalc;
FUNCTION GetPayment(PaymentNumber : Integer) : TPayment; PROCEDURE ApplyExtraPrincipal(PaymentNumber : Integer ;
Extra : Real);

PROCEDURE RangeExtraPrincipal(StartPayment,

EndPayment : Integer;
Extra : Real);
PROCEDURE MultipleExtraPrincipal(StartPayment : Integer ;
Extra : Real);
PROCEDURE RemoveExtraPrincipal(PaymentNumber Integer), PROCEDURE RemoveAllExtraPrincipal;
end;

Большинство заголовков процедур, встроенных в класс TMortgage, присутствовали также и в MortUnit. Мы всего лишь соединили их со структурой данных, которую они обслуживают. Тела самих процедур, как и ранее, определяются в разделе реализации модуля, в котором определяется класс. (Классы всегда определяются в модулях.) К этому вопросу мы также еще вернемся.

Активные данные

Люди, создавшие объектно-ориентированное программирование в 1970-х, обладали интересным взглядом на объекты, считая их "активными данными". Первые программисты в ООП рассматривали данные сырым материалом или "бессловесной материей", которую код программы обрабатывает словно повар отбивную. Но, если вы встраиваете код манипулирования данными прямо в данные, то они перестают быть пассивным куском мяса. Они превращаются в добровольного слугу. Вы можете сказать такому слуге: "Пойди причешись!" Слуга знает, как это сделать, и у него в кармане лежит гребень. Слуга, его гребень и его волосы являются частями одного и того же пакета.


⇐ Предыдущая страница| |Следующая страница ⇒

Программирование в среде Delphi



Новости за месяц

  • Декабрь
    2021
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31