Выявление и инкапсуляция дублируемого кода

Первым шагом в исключении дублируемого кода является его выявление. Если вы найдете время чтобы напечатать листинги кода, вы, вероятно, быстро найдете дублирующиеся порции. В каждом из обработчиков событияй для переключателей мы устанавливаем свойства Visible различных компонентов на основании того, какой из переключателей был выбран в текущий момент. И в функции Execute мы делаем то же самое на основании значения переменной WhichButton. Если поагдеть и немного подумать над этим, то на ум приходит очевидное решение: почему бы не создать процедуру, проделывающую всю эту работу, и не передавать ей параметр, говоря о том, какая из кнопок выбирается? Процедура TExtraPrinDlg. SetFieldsVisible, приведенная в Листинге 9.7, делает именно это.

ЛИСТИНГ 9.7 Процедура для обслуживания нескольких кнопок

procedure TExtraPrinDlg.SetFieldsVisible (btn :

TExtraPaymentType);

begin { изменяет заголовок на lblFromPmt, если требуется } if (btn = eptOne) then

lblFromPmt.Caption := 'Платеж*' else if (btn = eptRange) then

lblFromPmt.Caption := 'От платежа*';

(устанавливает свойства Visible компонентов label и edit} lblFromPmt.Visible := not (btn = eptAll); lblToPmt.Visible := (btn = eptRange)

{ если метка не видна, то не видно и окно редактирования } edFromPmt.Visible := lblFromPmt.Visible; edToPmt.Visible := lblToPmt.Visible;: end;

Этот код делает в точности то же самое, что и код в начале первоначальной процедуры TExtraPrinDlg. Execute. Мы просто инкапсулировали его в процедуру таким образом, чтобы он мог быть вызван другими процедурами. Имея эту новую процедуру, мы вырезаем десять строк кода из фуігкции Execute, а обработчики события OnClick отдельных переключателей становятся однострочными, как показано в Листинге 9.8.

ЛИСТИНГ 9.8 Модифицированные функция Execute и процедуры событий OnClick

procedure TExtraPrinDlg.rbOnePmtClick(Sender: TObject);
begin
SetFieldsVisible (eptOne);
end;
procedure TExtraPrinDlg.rbRangePmtsClick(Sender: TObject);
begin
SetFieldsVisible (eptRange);
end;
procedure TExtraPrinDlg. rbAUPmts Click (Sender : TObject);
begin
SetFieldsVisible (eptAll);
end;

function TExtraPrinDlg.Execute : boolean; var Temp : String[15] і : Integer; begin {установка переключателей в соответствии со значением } (WhichButton)

rbOnePmt Checked := (WhichButton = eptOne) rbRangePmts Checked := (WhichButton = eptRange); rbAllPmts Checked := (WhichButton = eptAll); SetFieldsVisible (WhichButton); ( Инициализация значений поля } edFromPmt.Text := IntToStr (FromPayment); edToPmt.Text := IntToStr (ToPayment); Str (ExtraAmount 0 2 Temp), edExtraAmt.Text := Temp;

{ показ окна диалога }

if ShowModal = mrOk then begin { установка переменных, как требуется }

if (rbOnePmt.Checked) then begin WhichButton := eptOne:

FromPayment := StrToInt (edFromPmt.Text); end

else if (rbRangePmts.Checked) then begin WhichButton := eptRange;

FromPayment := StrToInt (edFromPmt.Text) ToPayment := StrToInt (edToPmt.Text); end

else { rbAllPmts.Checked) WhichButton := eptAll;

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

Программирование в среде 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