Форум: "Начинающим";
Текущий архив: 2008.09.14;
Скачать: [xml.tar.bz2];
ВнизМодуль для создания списка ссылок из 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;
здесь никода не создастя копия данных sProcedure (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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.045 c