Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Модуль для создания списка ссылок из html страницы [D7, WinXP]


Страницы:   1 2

Krolm ©   (2008-08-05 18:22:00) 

Прошу оценить модуль, который отвечает за создание списка ссылок из html страницы. Хотелось бы услышать рекомендации в плане оптимизации, грамотности кода и расширения функционала.
Сорц не помещается в сообщении, так что прошу брать здесь:
http://www.procoding.ru/downloads/HTMLLink.pas


Palladin   (2008-08-05 19:30:00) [1]

+ и тем более TList


Krolm   (2008-08-05 19:30:00) [2]

Про то что компилятор не создаст копии если не модифицировать не знал. Спасибо за информацию.


Palladin   (2008-08-05 19:29:00) [3]


> А сравнение делал array of string и TStringList.Код на массиве
> работал заметно быстрее.

А вот это уже другое, потому что TStringList это куда более сложный класс нежели array of


Palladin   (2008-08-05 19:28:00) [4]


> Если передать как string (не через var) тогда в процедуру
> поступит копия памяти.

Нет, ты не прав. При любом раскладе, при передаче String, всегдапередается ссылка, бо переменная s:String - это указатель, другое дело если в процедуре/методе куда передана парметром переменная String произойдет попытка изменения этого параметра, только тогда создастся копия всех данных

например
Procedure (s:String);
Begin
 ShowMessage(s);
End;

здесь никода не создастя копия данных s

Procedure (s:String);
Begin
 ...
 ShowMessage(s); // до этой точки не будет копии данных
 s:=Caption; // а вот здесь компилятор сгенерирует код по дублированию строки и назначит новому дубликату значение Caption
End;


префикс Const в параметрах лишь защита программиста от самого себя для предупреждения подобных ситуаций


Krolm   (2008-08-05 19:28:00) [5]

А сравнение делал array of string и TStringList.
Код на массиве работал заметно быстрее.
На счет объектов вы правы. Мне кажется в моем случае TObjectList по идее действительно должен быть быстрее.


Krolm   (2008-08-05 19:23:00) [6]

Pchar использовал потому что html может быть и по 500Кбайт. Если передать как string (не через var) тогда в процедуру поступит копия памяти. Это и долго и ресурсоемко.


Palladin   (2008-08-05 19:23:00) [7]


> Я прав?

нет, в твоем случае, ты хранишь экземпляры объектов, кои по своей сущности, есть просто напросто указателина структуру в памяти (запомни это отличие объектов классов от экземпляров object и record), TList и TObjectList именно этим и занимаются, хранением указателей


Palladin   (2008-08-05 19:20:00) [8]

а еще точнее
THTMLLinkArray = class
private
  LinksInside:TObjectList;
...
  Function lcGetCount:Integer;
  Function lcGetItem(p_nIndex:Integer):THTMLLink;
public
  constructor Create;
  destructor Destroy; override;
  procedure Add( Consttext,address:string;properties:TPropertiesList);
  procedure ParseNAdd(sp:pchar); // не совсем понятно зачем именно PChar
  function GetFromText( Consttext:string):string;

 Property Count:Integer Read lcGetCount;
 Property Items[nIndex:Integer]:THTMLLink Read lcGetItem; Default;

end;


Krolm   (2008-08-05 19:19:00) [9]

Да я вот как-то тест проводил, сравнивал элементы, загнанные в TList и представленные как array
Массив работает на порядок быстрее, потому что экзепляры располагаются в памяти упорядоченно друг за другом, в то время как TList во-первых создает больше полей в памяти, а во вторых это список указателей из-за чего работа медленнее.

Я прав?


Palladin   (2008-08-05 19:17:00) [10]

+ возьми за привычку вводить префикс Const для переменных String и структур типа Record в параметрах методов
++ в идеале интерфейс THTMLLinksList должен выглядеть так
THTMLLinkArray = class
private
   LinksInside:TObjectList;
...
   Function lcGetCount:Integer;
   Function lcGetItem(p_nIndex:Integer):THTMLLink;
public
   constructor Create;
   destructor Destroy; override;
   procedure Add(text,address:string;properties:TPropertiesList);
   procedure ParseNAdd(sp:pchar);
   function GetFromText(text:string):string;

  Property Count:Integer Read lcGetCount;
  Property Items[nIndex:Integer]:THTMLLink Read lcGetItem; Default;

end;


Palladin   (2008-08-05 19:13:00) [11]

Еще замечание. Во первых переименовать THTMLLinkArray в THTMLLinksList
и использовать не LinksInside:array of THTMLLink;, а LinksList:TList или, что еще более удобней, TObjectList. Работать куда удобней и код в этих классах куда оптимальней.


Krolm   (2008-08-05 19:04:00) [12]

Задача стоит напрограммировать грамотно. Помимо ссылок, я разрабатываю классы для других элементов html. Хочется сделать все грамотно. На данный момент есть большой проект, где распарсивание происходит скриптово. В результате большой и ресурсоемкй код. Хочется все разложить по полочкам - чтобы загнал страницу, и получилось ее DOM дерево с элементами в виде соответствующих экземпляров классов, у каждого элемента свои поля и свои динамические свойства.


Medbe}I{onok XML   (2008-08-05 18:59:00) [13]

если по дизайну так вообще не понятно зачем там классы потребовались.
модуль с одной паблик функцией с листом для результата или callback параметром длдя универсальности.

в общем действительно похоже на программирование ради процесса программирования


Krolm   (2008-08-05 18:58:00) [14]

Спасибо за замечания. Действительно, стоящие.


Palladin   (2008-08-05 18:54:00) [15]


> Medbe}I{onok XML ©   (05.08.08 18:26) [1]

ну как академическая задача - сабж прекрасен )


> Krolm ©   (05.08.08 18:36) [3]

1. смущает форматирование секции interface
2. класс THTMLlinks
очень рекомендую не отдавать в public сами переменные... вообще по идее public секция не должна содержать полей класса, только properties для доступа к ним, контролируя уровен read read/write
3. очень под вопросом производительность процедур
procedure RemoveSpaces(var s:string);
procedure RemoveQuotes(var s:string);

:) ну это так, не очень по существу, работают и работают... просто можно было сделать куда оптимальней
4. класс TPropertiesList красивше оформить методы Get,Index,Value в свойства, если что им позже можно будет присвоить модификатор Write

пока все... :)


Medbe}I{onok XML   (2008-08-05 18:53:00) [16]

среди сразу видимых залипух :

StrPosD и StrPosB

плюс нигде не видно обработки ссылок в апперкейсе


Medbe}I{onok XML   (2008-08-05 18:40:00) [17]

Ваше сообщение не в тему.

ты просил коментов, ты их получил.


Krolm   (2008-08-05 18:38:00) [18]

>закин на ящик timurrv на сервере mail.ru
Ушло.


Krolm   (2008-08-05 18:36:00) [19]

Функция распарсивания около 40 строчек. Ваше сообщение не в тему.

И потом в Delphi нет модуля, который реализует регулярные выражения. Сторонние решения использовать не хочу.


Palladin   (2008-08-05 18:31:00) [20]

закин на ящик timurrv на сервере mail.ru


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо