Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.03.04;
Скачать: [xml.tar.bz2];

Вниз

Object Manager   Найти похожие ветки 

 
Piroxyline ©   (2006-12-30 20:04) [0]

Подумал-подумал, и решил сделать енто... Не слишком отлажено, но работает.
Смысл: есть менеджер объектов, который может автоматически создавать почти неограниченное их количество. В объектах может быть почти неограниченное количество свойств, у каждого из которых должно быть имя и значение. Свойства создаются автоматически при попытке записи в них (если его не было, оно создатся, если было - перезапишется). Если нет значения - свойство автоматически удаляется, если нет свойств - удаляется объект. Объект удаляется также, если у него удалить имя. У объекта есть методы на попытку чтения и на попытку записи свойств, а также на обновление. Обновление осуществляется вызовом процедуры Update у менеджера, при этом удаляются убитые объекты из массива. К объектам и их свойствам можно обращаться как по имени, так и по списку. Работает все это практически в любой версии Delphi, где поддерживается тип Variant (у меня пахала с 4 по turbo)
В-общем, судите сами - надо это или нет. В комплекте лежит пример - консольная программка для подсчета слов из файла.

http://forum.sources.ru/index.php?act=Attach&type=post&id=1396624


 
Palladin ©   (2006-12-31 04:18) [1]

Эх, парень, как думаешь, сколько людев прошли через это?
Ты пойми один из самых великих законов программирования... Чем универсальней сущность, тем меньше найдется случаев для ее применения...
Всегда... всегда... При разработке идет балансирование между количеством и качеством... И всегда всегда оказывается неоптимально использовать нечто не конкретное... Самое оптимальное использовать самописный или левописный ДБЛэйер...


 
Piroxyline ©   (2006-12-31 13:00) [2]


> Эх, парень, как думаешь, сколько людев прошли через это?

Много. Я тоже.

> Ты пойми один из самых великих законов программирования.
> .. Чем универсальней сущность, тем меньше найдется случаев
> для ее применения...
> Всегда... всегда... При разработке идет балансирование между
> количеством и качеством... И всегда всегда оказывается неоптимально
> использовать нечто не конкретное... Самое оптимальное использовать
> самописный или левописный ДБЛэйер...

В курсе. Только я реализовал то же самое, что сделано в интерпретаторе C++ в ПКМ и третьих Корсарах. Сейчас начал проект, в котором в конце концов пришел к использованию этого модуля - мне просто так удобней. Я ведь никого не заставляю им пользоваться.


 
vlad-mal ©   (2007-01-03 23:18) [3]

Оч. интересно.

Деструкторы
destructor T_ObjectManager.Destroy;
и
destructor T_Object.Destroy;

не - виртуальны. Следовательно, не будут вызваны при обращении к методу .Free экземпляров соотв. объектов.

-----------------
Кто такие "третьи Корсары"?


 
Palladin ©   (2007-01-03 23:34) [4]

Кто здесь?


 
vlad-mal ©   (2007-01-03 23:55) [5]

:)


 
Игорь Шевченко ©   (2007-01-04 13:16) [6]

Дети Ивана Кулибина


 
Piroxyline ©   (2007-01-04 15:21) [7]


> vlad-mal ©   (03.01.07 23:18) [3]

Вроде поправил (ну не разбираюсь я в этих методах :) ). Плюс сделал оччень тупое сохранение.
http://forum.sources.ru/index.php?act=Attach&type=post&id=1400838


 
MetalFan_pda   (2007-01-04 15:33) [8]

хм...подобие xml чтоль...


 
vlad-mal ©   (2007-01-04 16:50) [9]


> Вроде поправил (ну не разбираюсь я в этих методах :) ).


Ужас :)

      destructor Destroy; virtual;


Вы на ворнинги смотрите, после компиляции?


> [Warning] ObjectManager.pas(94): Method "Destroy" hides
> virtual method of base type "TObject"
>


Ваш класс  
T_Object = class
наследуется от класса TObject, в котором уже есть свой деструктор Destroy:

   destructor Destroy; virtual;

с "пустой" реализацией
destructor TObject.Destroy;
begin
end;

К котороому и происходит обращение при вызове .Free. Т.е. реально Ваш деструктор не вызывается. Вы должны или вызывать его явно (.Destroy), или (что желательно) переопределить существующий виртуальный вот так:


 T_Object = class
...
   public
     destructor Destroy; override;
...
end;

 T_ObjectManager = class
...
   public
...
     destructor Destroy; override;
 end;

Этого достаточно, чтобы при вызове .Free вызывался именно Ваш деструктор.
Кстати, посмотреть, есть ли обращение к деструктору, легко можно в отладчике. :)

Еще: работать все равно не будет :) - т.к. деструкторы написаны неправильно. :(

Как только Вы сделаете то, что я Вам рекомендовал, дектруктор выдаст Access Violation. Потому что написан он неправильно :)

...

Я для примера запустил Вашу программку с параметрами:

>  ObjectManager.pas Out.txt


и схлопотал OutOfMemory.
Подключил менеджер памяти FastMM4, все получилось, но узнал, что Ваши деструкторы не вызываются, и происходит утечка памяти. Остальное - см. выше.
Так что вот так.

--------------
Так кто такие "третьи Корсары"? :)


 
Джо ©   (2007-01-04 17:00) [10]

>
> Так кто такие "третьи Корсары"? :)

А заодно и «ПКМ».


 
TCrash   (2007-01-04 17:12) [11]

и как попасть на http://forum.sources.ru/index.php?act=Attach&type=post&id=1400838 не регистрируясь на форуме?
Хочешь создать опенсорц проект - сделай для него сайт. хотя бы на том же народе


 
saxon   (2007-01-04 17:25) [12]


> vlad-mal ©   (04.01.07 16:50) [9]
> ... К котороому и происходит обращение при вызове .Free. Т.е.
>  реально Ваш деструктор не вызывается. ...

Ой по моему тут совсем наоборот ;)


 
saxon   (2007-01-04 17:29) [13]


> saxon   (04.01.07 17:25) [12]

Извините, не так прочитал. посыпаю голову пеплом :)


 
vlad-mal ©   (2007-01-04 17:40) [14]

Если я не узнаю, что такие "третьи Корсары", (а заодно и "ПКМ"), я не усну сегодня... :)


 
Джо ©   (2007-01-04 17:45) [15]

> [14] vlad-mal ©   (04.01.07 17:40)
> Если я не узнаю, что такие "третьи Корсары", (а заодно и
> "ПКМ"), я не усну сегодня... :)

Будем бодрствовать вместе. А Кулибин пусть отдохнет :)


 
Piroxyline ©   (2007-01-07 19:36) [16]

vlad-mal, игра такая это, с открытым исходным кодом *игры*, а не движка (используется интерпретатор си).
За те исправления сори, написано на сонную голову, тоже посыпаю голову пеплом и раскаиваюсь.


 
vlad-mal ©   (2007-01-08 01:24) [17]

Ну так как насчет продолжения?
Вы деструкторы настройте, а я Вам пару идей - глядишь, что хорошее настряпаем... :)


 
Piroxyline ©   (2007-01-08 15:18) [18]

Поправил и добавил таймер: http://forum.sources.ru/index.php?act=Attach&type=post&id=1404786
С идеями плиз в аську: 283044430


 
vlad-mal ©   (2007-01-08 16:11) [19]

"Уж лучше Вы к нам" (c) - :)

Ну и что? Все равно же не работает.
Запусти свою программку WordsNum.EXE с параметрами:

WordsNum.EXE ObjectManager.pas Out.txt


- получишь Out Of Memory.

Я уже рассказывал:
Подключаешь FastMM4 - тогда отрабатывает до конца, но в деструкторе фиксируется ошибка. И утечка памяти.


 
Piroxyline ©   (2007-01-08 16:59) [20]

Ок, буду смотреть. Просто тестирую на другом проекте, там все нормально.


 
Piroxyline ©   (2007-01-09 20:44) [21]

Еще одна поправка. Теперь для уничтожения неиспользуемых объектов нужно обязательно вызывать Update у менеджера, зато все идет нормально.
http://forum.sources.ru/index.php?act=Attach&type=post&id=1406504


 
ors_archangel ©   (2007-01-09 21:05) [22]


> http://forum.sources.ru/index.php?act=Attach&type=post&id=1406504

см. TCrash [11], мне интересно, но регистрироваться в лом абы где


 
vlad-mal ©   (2007-01-09 21:09) [23]

Молодец!

Однако, со стандартным менеджером памяти WordsNum выполняется за 47 тиков, а с FastMM4 - 30. :)
(ну это так, к слову)

Еще неплохо бы сделать следующий шаг:
- изменить тип массива _Properties с
 T_PropertyList = array of T_Property;

на что-то более быстрое.
Например, на ассоциативный массив.

Тогда, например, в методах

     function GetProperty(Name: String): Variant;
     procedure SetProperty(Name: String; Value: Variant);

не придется выполнять перебор всех элементов.

Готовую реализацию можно скачать например, отсюда:

   http://fundementals.sourceforge.net/


 
vlad-mal ©   (2007-01-09 21:10) [24]


> см. TCrash [11], мне интересно, но регистрироваться в лом
> абы где

Да, кстати. Что мешает разместить где-нибудь на халявном хостинге свой сайт?


 
vlad-mal ©   (2007-01-10 05:36) [25]

Вот, если интересно, нечто похожее:
http://fdb.linesoft.org/

В реальности - простая и супершустрая СУБД.

Работает очень похоже на Ваш менеджер объектов.
.dll - ка 100 кб, и все счастье. :)


 
ORMADA ©   (2007-01-10 07:02) [26]

2 vlad-mal
если уж рассматривать ЭТО как СУБД то SQLite(sqlite.org) её (fdb) рвёт как грелку
размер длл правда 200 с копейками
зато частично SQL-92 держит а по скорости на малых и средних объёмах вообще рвёт всех....


 
vlad-mal ©   (2007-01-10 15:25) [27]


> 2 vlad-malесли уж рассматривать ЭТО как СУБД то SQLite(sqlite.
> org) её (fdb) рвёт как грелкуразмер длл правда 200 с копейкамизато
> частично SQL-92 держит а по скорости на малых и средних
> объёмах вообще рвёт всех....

1. Отнюдь. :)
2. Тем неменее, вопрос не в скорости доступа к табличкам, а в подходе к проектированию приложения.
Здесь мы рассматриваем объектный подход, а не реляционный.


 
Piroxyline ©   (2007-01-10 15:32) [28]

Так, комментирую по очереди.

> vlad-mal ©   (09.01.07 21:09) [23]

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

> vlad-mal ©   (09.01.07 21:10) [24]

Ладно, сделаю сайт на народе.

> vlad-mal ©   (10.01.07 05:36) [25]

Ну я не стремлюсь создать субд или замену уже существующему - я ж это просто для собственного удобства сделал :)

> ORMADA ©   (10.01.07 07:02) [26]

Гы. Динамические массивы под досом всех рвут :)


 
vlad-mal ©   (2007-01-10 18:06) [29]


> Еще бы знать, что такое ассоциатиный массив... Если объясните,
>  могу попробовать сделать.

Ну, иными словами, в данном случае я имел в виду структуру типа "словарь".
Т.е. словарь - это ассоциативный массив, в котором значение ключа является строкой.

Вообще, ассоциативными массивами называют неупорядоченные коллекции, в которых для доступа к значению может быть использован какой-либо ключ.

К примеру, класс TIntegerDictionary используется, когда нужно получить доступ к целому, используя в качестве ключа строку.                          

Пример использования словаря целых значений:

   Ages := TIntegerDictionary.Create; // Создаем массив Ages
   Ages["John"] := 29; // Джону 29 лет
   Ages["Mike"] := 35; // Майку 35
   if Ages.HasKey["John"] then // Если есть элемент Джон, то
     Ages.Delete("John");  // удалим его
   Ages.Free; // удаляем массив


В качестве примера использования, рассмотрим Вашу программку WordsNum.
Чуть - чуть изменим ее:

program WordsNum;

uses
 FastMM4, // По настроению... :)
 cDictionaries;
...

var
 AWords            : TIntegerDictionary; // Вместо Вашего "менеджера"
 Word              : string;
 Buf               : Char;
 f                 : TextFile;
 i, j, k           : Integer;
...
 WriteLn("Processing...");

 AWords := TIntegerDictionary.Create;  // Создаем массив

 AssignFile(f, ParamStr(1));
 Reset(f);

 Word := "";
 j := 0;

 while not Eof(f) do begin // Считываем входной файл
   Read(f, Buf);
   if (IsDelimeter(Buf)) then begin
     if (Length(Word) > 0) then begin
       Word := LowerCase(Word);
       if AWords.HasKey(Word) then // Считаем
         i := AWords[Word] + 1 // число
       else // слов
         i := 1; // ...
       AWords[Word] := i;
       Word := "";
       if i > j then j := i;
     end;
   end
   else begin
     Word := Word + Buf;
   end;
 end;

 CloseFile(f);

 AssignFile(f, ParamStr(2));
 Rewrite(f);

 for i := 0 to Pred(AWords.Count) do begin // Выводим массив
   Word := AWords.GetKeyByIndex(i); // в выходной
   WriteLn(f, Word," ", AWords[Word]);  // файл
 end;

 Word := "";
 CloseFile(f);
 AWords.Free; // Уничтожили словарь


Время выполнения - меньше одного тика на тех же исходных данный... :)

(Класс словаря был взят из упомянутого ранее пакета Fundamentals )


 
Piroxyline ©   (2007-01-10 19:30) [30]

Хм. А если взять не менеджер объектов, а один объект (по сути, тут используется как раз один объект только), то должна получится схожая картина.


 
vlad-mal ©   (2007-01-10 19:40) [31]


> Хм. А если взять не менеджер объектов, а один объект (по
> сути, тут используется как раз один объект только), то должна
> получится схожая картина.

Пардон, не понял?


 
ors_archangel ©   (2007-01-10 19:50) [32]

Piroxyline, менеджер самобытных объектов, имхо, - всегда искусственность. Лучше делать такие вещи прозрачнее. (Но кода я не видел, где www.***.narod.ru? так что не обессутьте, если не прав вот здесь)


 
Piroxyline ©   (2007-01-11 17:15) [33]


> vlad-mal ©   (10.01.07 19:40) [31]

Менеджер объектов реально используется только для динамического управления ими. А если создать один объект без менеджера, то и управлять им придется самостоятельно. Т. е. получится так:
MyObject.Create("MyObject");
...
MyObject.Properties[PropertyName] := PropertyValue;
...
MyObject.Free;

Почти как твой код, только в Properties используется не Integer, а Variant


 
vlad-mal ©   (2007-01-11 18:18) [34]


> Piroxyline ©   (11.01.07 17:15) [33]

Дык я о чем? Только о том, чтобы внутреннее устройство твоего менеджера изменить. Чтобы не тупым перебором искать (что и происходит в твоем коде).

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

:)


 
Piroxyline ©   (2007-01-12 12:47) [35]

Все равно не понял :(



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

Форум: "Основная";
Текущий архив: 2007.03.04;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.039 c
2-1171352745
начинающий2007
2007-02-13 10:45
2007.03.04
структура база


15-1170955450
vain
2007-02-08 20:24
2007.03.04
Напомните, пожалуйста.


2-1171269096
Максименко
2007-02-12 11:31
2007.03.04
Редактирование MP3 Tag-ов


2-1171016071
RASkov
2007-02-09 13:14
2007.03.04
Печать и предпредпросмотр :)


2-1171137763
Рустам
2007-02-10 23:02
2007.03.04
Как перенести приложение на другую машину





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский