Реклама

пятница, 5 ноября 2010 г.

Пишем робота Урок№5

Проводим рефакторинг и дальнейшую отладку класса 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"

Источник: http://easyprog.ru/index.php?option=com_content&task=view&id=78&Itemid=44

Не поленитесь ребята , сходите на их сайт , там много интересного