Программирование - это просто
Advertisement
Главная arrow Биржевые роботы arrow Создаем биржевого робота уроки, статьи, идеи arrow Проводим рефакторинг и дальнейшую отладку TPASSMomentum (Delphi 7: отладчик,  private, protect)
19.04.2024 г.
Главное меню
Главная
Интернет магазин
Программные продукты
Биржевые роботы
Искусственный интеллект
Математика и информатика
1С:Предприятие
Уроки C#
Уроки Delphi
Уроки программирования
Web-программирование
Дизайн и графика
Компьютер для блондинок
Исходники
Статьи
Платный раздел
Рассказы про компьютеры
Хитрости и секреты
Системный подход
Размышления
Наука для чайников
Друзья сайта
Excel-это не сложно
Все о финансах
.
Проводим рефакторинг и дальнейшую отладку TPASSMomentum (Delphi 7: отладчик,  private, protect) Печать E-mail
Автор megabax   
10.08.2009 г.
New Page 1

Проводим рефакторинг и дальнейшую отладку класса TPASSMomentum (Delphi 7: отладчик,  private, protected, поиск)

Все статьи по данной теме.

Сегодня мы займемся переписыванием кода модуля PASSIndicators. Начнем с класса TPASSIndicator. Вот как он у нас объявлен:

  TPASSIndicator=Class(TPASSAbstractDataSource)
  private
    FParameters:TPASSParameters; // значения параметров индикатора.
    FPriceSource:TPASSPriceSource; // источник котировок.
    procedure SetPriceSource(APriceSource:TPassPriceSource);
    procedure UpdateParameters; virtual; abstract;
  public
    constructor Create;
    property PriceSource:TPASSPriceSource read FPriceSource write SetPriceSource;
    procedure SetParameterByName(AParameterName:string; AParameterValue:Variant); virtual;
    function GetParameterByName(AParameterName:string):Variant; virtual;
    function GetResultByFieldName(AFieldName:string):double;  virtual; abstract;
    function GetResultByFieldNameAndIndex(FieldName:string; Index:LongInt):double;  virtual; abstract;
    function GetResultByFieldNum(AFieldName:integer):double; virtual; abstract;
    function GetResultByFieldNumAndIndex(FieldName:Integer; Index:LongInt):double; virtual; abstract;
    procedure First; virtual; abstract;
    procedure Last; virtual; abstract;
    function Next:boolean; virtual; abstract;
    function Prev:boolean; virtual; abstract;
    function GetIndicatorName:string; virtual; abstract;
    Destructor Destroy; virtual;
  end;

А мы сделаем объявление таким (изменения выделены красным цветом):

 

  TPASSIndicator=Class(TPASSAbstractDataSource)
  protected
    FParameters:TPASSParameters; // значения параметров индикатора.
    FPriceSource:TPASSPriceSource; // источник котировок.
    procedure SetPriceSource(APriceSource:TPassPriceSource);
    procedure UpdateParameters; virtual; abstract;
    procedure AfterConstruction; override;
  public
    constructor Create;
    property PriceSource:TPASSPriceSource read FPriceSource write SetPriceSource;
    procedure SetParameterByName(AParameterName:string; AParameterValue:Variant); virtual;
    function GetParameterByName(AParameterName:string):Variant; virtual;
    function GetResultByFieldName(AFieldName:string):double;  virtual; abstract;
    function GetResultByFieldNameAndIndex(FieldName:string; Index:LongInt):double;  virtual; abstract;
    function GetResultByFieldNum(AFieldName:integer):double; virtual; abstract;
    function GetResultByFieldNumAndIndex(FieldName:Integer; Index:LongInt):double; virtual; abstract;
    procedure First; virtual; abstract;
    procedure Last; virtual; abstract;
    function Next:boolean; virtual; abstract;
    function Prev:boolean; virtual; abstract;
    function GetIndicatorName:string; virtual; abstract;
    Destructor Destroy; virtual;
  end;

А теперь реализуем сам AfterConstruction

procedure TPASSIndicator.AfterConstruction;
begin
   UpdateParameters;
end;    

После этого мы можем удалить метод AfterConstruction из TPASSMomentum. Удалим из него так же и определение полей FParameters и FPriceSource - они уже определены в TPASSIndicator.

Теперь запускаем программу и вылавливаем еще один "баг" - у нас ругается на строку

lbResult.Caption:= intToStr(FIndicator.GetParameterByName('Value'));

Все верно, это ошибка. Вместо нее следует записать

lbResult.Caption:= FloatToStr(FIndicator.GetResultByFieldName('Value'));

Иными словами, для вычисления результата индикатора нам нужно пользоваться не функцией GetParameterByName, а функцией GetResultByFieldName.

После исправления опять запускаем программу и получаем новое сообщение об ошибке:

Отладку класса TPASSMomentum (Delphi 7: отладчик,  private, protected, поиск)

Данное сообщение достаточно информативно, и мы, не пользуясь отладчиком вполне можем найти, где ошибка. Должны быть, мы где то указали 'PriceFieldType' dvtcnj PriceFieldType. Иными словами, обращаемся к полю "PriceFieldType", которого у нас действительно нет, вместо того, что бы обратимся к полю, имя которого у нас хранится в переменной PriceFieldType.

Для поиска просто воспользуемся поиском. Входим в пункт меню "Search" --> "Find"*

Отладку класса TPASSMomentum (Delphi 7: отладчик,  private, protected, поиск)

Находим и исправляем эту строку*:

Отладку класса TPASSMomentum (Delphi 7: отладчик,  private, protected, поиск)

Пишем вместо неправильной строки правильную:

Pbeg:=FPriceSource.GetDataByFieldNameAndIndex(FPriceFieldType,FPriceSource.CurrentItemIndex-FDT);
 

Запускаем программу, тестируем снова. На этот раз она выдает какой то результат:

Отладку класса TPASSMomentum (Delphi 7: отладчик,  private, protected, поиск)

Правда, тестирование на этом не кончается. Теперь нам нужно проверить, а правильный ли результат выдала программа. Но этим мы займемся на следующем уроке.

 


Скриншоты, помеченные знаком * , являются цитатами и иллюстрациями  в соответствии со ст. 1274 ГК РФ программного продукта "Delphi", авторское право на который принадлежит "Borland Software Corporation".

 

Последнее обновление ( 27.07.2013 г. )
 
« След.   Пред. »
 
© 2024 Программирование - это просто
Joomla! - свободное программное обеспечение, распространяемое по лицензии GNU/GPL.
Русская локализация © 2005-2008 Joom.Ru - Русский Дом Joomla!
Design by Mamboteam.com | Powered by Mambobanner.de
Я принимаю Яндекс.Деньги