Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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;

здесь никода не создастя копия данных 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.069 c
15-1216296863
Украинец
2008-07-17 16:14
2008.09.14
Выбор телевизора


2-1217967486
krem
2008-08-06 00:18
2008.09.14
Memo


2-1217542034
demon
2008-08-01 02:07
2008.09.14
Как убрать кнопку на панели задач?


11-1193111866
Ajax
2007-10-23 07:57
2008.09.14
KOL + Turbo Delphi


3-1205476733
Evgeny V
2008-03-14 09:38
2008.09.14
ADO и параметры





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский