Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.14;
Скачать: CL | DM;

Вниз

Модуль для создания списка ссылок из html страницы   Найти похожие ветки 

 
Krolm ©   (2008-08-05 18:22) [0]

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


 
Medbe}I{onok XML ©   (2008-08-05 18:26) [1]

Сорц не помещается в сообщении

это бывает.
когда автор про регулярные выражения ничего не слышал.


 
Palladin ©   (2008-08-05 18:31) [2]

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


 
Krolm ©   (2008-08-05 18:36) [3]

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

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


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

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


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

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

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


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

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

StrPosD и StrPosB

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


 
Palladin ©   (2008-08-05 18:54) [7]


> 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

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


 
Krolm ©   (2008-08-05 18:58) [8]

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


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

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

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


 
Krolm ©   (2008-08-05 19:04) [10]

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


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

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


 
Palladin ©   (2008-08-05 19:17) [12]

+ возьми за привычку вводить префикс 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;


 
Krolm ©   (2008-08-05 19:19) [13]

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

Я прав?


 
Palladin ©   (2008-08-05 19:20) [14]

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

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

end;


 
Palladin ©   (2008-08-05 19:23) [15]


> Я прав?

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


 
Krolm ©   (2008-08-05 19:23) [16]

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


 
Krolm ©   (2008-08-05 19:28) [17]

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


 
Palladin ©   (2008-08-05 19:28) [18]


> Если передать как 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 в параметрах лишь защита программиста от самого себя для предупреждения подобных ситуаций


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


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

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


 
Krolm ©   (2008-08-05 19:30) [20]

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


 
Palladin ©   (2008-08-05 19:30) [21]

+ и тем более TList



Страницы: 1 вся ветка

Текущий архив: 2008.09.14;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.017 c
15-1216058333
GrayFace
2008-07-14 21:58
2008.09.14
Система контроля версий кода для VS2005 для удаленной работы


15-1216888228
Denis__
2008-07-24 12:30
2008.09.14
логика?


2-1217634273
demon
2008-08-02 03:44
2008.09.14
Конвертация bmp из ресурсов и иконку


2-1217390260
apic
2008-07-30 07:57
2008.09.14
сокрытие файлов и папок


15-1216587501
programmer90
2008-07-21 00:58
2008.09.14
Опять проблемы с кодировкой.