Lenta kotirovok

Some blogs or websites linked from this site may contain objectionable or uncensored content, www.mainru.com is not affiliated with these websites and makes no representations or warranties as to their content.

пятница, 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

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

Поделится

Котировки

Идея