Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / как переделать на синглтон / 25 сообщений из 28, страница 1 из 2
02.01.2018, 18:19
    #39578746
СинийТон
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
Есть библиотечка, а в ней классик.
Как его переделать на синглтон, чтобы не менять код в других модулях?
...
Рейтинг: 0 / 0
02.01.2018, 18:32
    #39578750
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
СинийТонЕсть библиотечка, а в ней классик.
Как его переделать на синглтон
function -> class function
procedure -> class procedure
var -> class var

, чтобы не менять код в других модулях?Никак. Код менять придется.
...
Рейтинг: 0 / 0
02.01.2018, 18:41
    #39578752
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
Попробуйте внятно объяснить, что у Вас есть, почему Вас это не устраивает и, что Вы хотите изменить?
...
Рейтинг: 0 / 0
02.01.2018, 18:54
    #39578754
СинийТон
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
rgreat, так можно, да, но люди привыкли к Сreate-Free.

Ещё есть доп-условия:
- не менять ранее написанный код использования,
- не создавать раньше первого реального Сreate,
- Сreate может быть из нескольких потоков,
- если можно, то сделать реальный Free, если сейчас этот объект не нужен (хотелка)

по-факту даже не синглтон получается, а как-то так ...

Что-то туплю, чую простое решение, но туплю.
...
Рейтинг: 0 / 0
02.01.2018, 18:59
    #39578756
СинийТон
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
_Vasilisk_, внятно объяснить это наверное завтра, может отосплюсь, а то тяжело синапсам так сразу в бой )
...
Рейтинг: 0 / 0
02.01.2018, 19:49
    #39578762
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
СинийТонrgreat, так можно, да, но люди привыкли к Сreate-Free.
Вы так говорите как будто это что-то хорошее.

Ещё есть доп-условия:
- не менять ранее написанный код использования,
В чем тогда смысл синглтона, и что вы вообще подразумеваете под этим термином?

- не создавать раньше первого реального Сreate,
Разве бывают некие-то "не реальные" Create?

- Сreate может быть из нескольких потоков,
Ок, но при чем тут синглтон?

- если можно, то сделать реальный Free, если сейчас этот объект не нужен (хотелка)
по-факту даже не синглтон получается, а как-то так ...
Может вам не синглтон а контейнер нужен?

Что-то туплю, чую простое решение, но туплю.Как-то да. TList<T> или TDictionary<T> маячат на горизонте.
...
Рейтинг: 0 / 0
02.01.2018, 19:52
    #39578763
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
СинийТонЕщё есть доп-условия:
- не менять ранее написанный код использования,
- не создавать раньше первого реального Сreate,
- если можно, то сделать реальный Free, если сейчас этот объект не нужен (хотелка)
1. Исходный класс переименовываем и прячем в Implementation
2. Объявляем интерфейс с тем же именем и методами, что раньше были у класса
3. Объявляем, что наш класс реализует этот интерфейс
4. Объявляем у интерфейса метод Free и делаем пустым его реализацию
5. Объявляем функцию CreateMyObject в таком духе
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var
  GSingleton: IMyIntf;

function CreateMyObject: IMyIntf;
begin
  if GSingleton = nil then begin
    GSingleton := TMyObj.Create;
    Result := GSingleton;
    GSingleton._Release;  // Освобождаем счетчик ссылок
  end else
    Result := GSingleton;
end;


6. В деструкторе не забываем обнулить ссылку
Код: pascal
1.
2.
3.
4.
5.
destructor TMyObj.Destroy;
begin
  Pointer(GSingleton) = nil;
  inherited Destroy;
end;


СинийТон- Сreate может быть из нескольких потоков,Не забываем про синхронизацию доступа как к самому GSingleton, так и к его полям

Таким образом, все задачи, кроме
СинийТонно люди привыкли к Сreateрешены. Вместо Сreate придется таки писать CreateMyObject
...
Рейтинг: 0 / 0
02.01.2018, 20:05
    #39578769
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
Чтобы все удовлетворяло вашим условиям и нигде не менять код Используйте паттерн адаптер
Вы сможете повторить все методы вашего класса + добавить новые (Free когда объект реально (по мнению разработчика, а не системы) не нужен). Внутри адаптера реализуйте ваш класс в виде синглтона.
Платой за это будет дублирование всех public методов и свойств
...
Рейтинг: 0 / 0
03.01.2018, 10:26
    #39578869
СинийТон
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
Спасибо за замечания-предложения!

- Сreate может быть из нескольких потоков,Ок, но при чем тут синглтон?- Думаю что в момент создания первого-единого экземпляра из одного потока, нужно как-то будет подождать второму-третьему потоку завершения создания объекта в первом? Не знаю какую тут проще-нужно конструкцию синхронизации использовать?


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


- А если по аналогии с 4. Объявляем у интерфейса метод Free и делаем пустым его реализациюподменить конструктор на:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
TTest = class
  class function Create:TTest;
end;

class function TTest.Create: TTest;
begin
 // inc(fRef);
 // if single then
 Result := inherited Create;
end;

Так сработает или это совсем грязно?
...
Рейтинг: 0 / 0
03.01.2018, 12:45
    #39578912
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
нужно, как в соседней ветке, для начала разобраться с тз: нужен один инстанс класса (синглтон) или много инстансов? потом думать как тз реализовать.
...
Рейтинг: 0 / 0
03.01.2018, 15:07
    #39578975
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
СинийТонДа, адаптер , как-бы оно, но его и хочется сделать синглтономЗачем? В адаптере нет никаких полей. Зачем он синглтоном
СинийТонТак сработает или это совсем грязно?Для конструктора сработает. Для Free как метода класса - нет
...
Рейтинг: 0 / 0
04.01.2018, 11:29
    #39579253
СинийТон
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
makhaon, да, тз:

Реализовать класс который
- поддерживает многопоточное использование;
- создаст только один инстанс на время использования;
- когда все ссылки на инстанс будут освобождены, освободит и этот {один} инстанс;
...
Рейтинг: 0 / 0
04.01.2018, 11:39
    #39579256
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
СинийТон,

судя по тз, единственный инстанс во время работы должен постоянно создаваться и разрушаться?
...
Рейтинг: 0 / 0
04.01.2018, 13:27
    #39579323
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
СинийТонmakhaon, да, тз:

Реализовать класс который
- поддерживает многопоточное использование;
- создаст только один инстанс на время использования;
- когда все ссылки на инстанс будут освобождены, освободит и этот {один} инстанс;

У вас во время создания инстанса происходит долгая инициализация? Или класс должен быть statefull между разными потоками? Или по коду должен быть один экземпляр общий для всех? (Например настройки приложения)
Какой смысл перевода на синглтон? Просто работа ради работы или есть действительное обоснование?
...
Рейтинг: 0 / 0
04.01.2018, 14:34
    #39579366
СинийТон
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
makhaonединственный инстанс во время работы должен постоянно создаваться и разрушаться?да, но там всплески активности раз в час или несколько часов, а использующие на самом деле не сразу зовут фри, а с некоторой задержкой.

У вас во время создания инстанса происходит долгая инициализация?
Или класс должен быть statefull между разными потоками?
Или по коду должен быть один экземпляр общий для всех? (Например настройки приложения)- Иногда, - да, - да
Какой смысл перевода на синглтон? Просто работа ради работы или есть действительное обоснование? Первоначально не думалось про многопоточное использование (и такой псевдо синглтон получался сам собой). Теперь ещё и оптимизации какой-то захотелось и разобраться для себя интересно.
...
Рейтинг: 0 / 0
05.01.2018, 08:52
    #39579547
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
СинийТонrgreat, так можно, да, но люди привыкли к Сreate-Free.Откуда только такие дегенераты берутся, гнать таких надо. "Программист" и "привык" это всё - крах карьеры.

модуль по сути и есть синглтон, не надо всякую фигню изобретать без острой необходимости.
...
Рейтинг: 0 / 0
05.01.2018, 11:43
    #39579589
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
СинийТон,

костылевато, конечно, довольно сильно. ну да ладно.

Create/Free переопределить, вести в них счетчик (если многопоточка - то через InterlockedIncrement/TInterlocked.Increment). Счетчик и сам инстанс сделать классовыми переменными. В Create если счетчик = 0, создаём единственный внутренний инстанс, иначе ничего не деаем. Во Free пока счетчик больше 0, ничего не делаем. Когда становится равным нулю, разрушаем единственный инстанс. Все методы и свойства делаем через классовый методы к внутреннему реальному инстансу.
...
Рейтинг: 0 / 0
05.01.2018, 13:31
    #39579660
СинийТон
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
makhaon, оно то всё так, но с многопоточкой есть нюансы.

Когда одновременно два потока зайдут в Create кто-то из них должен будет создать инстанс, а кто-то подождать результата его работы.

И при обычных условия внутри Create у нас уже есть новый инстанс, нужно, как я понимаю, переопределить NewInstance.
Буду смотреть в отладчике как там и что, раньше с таким не сталкивался. Если у кого есть примерчик с краткими пояснениями, то не откажусь.
...
Рейтинг: 0 / 0
05.01.2018, 13:51
    #39579674
СинийТон
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
kealon(Ruslan), ?

Есть мой функционал в dll. Для удобства его использования сделал обёртку.

Ребята используют как-то так:
Код: pascal
1.
2.
3.
4.
5.
6.
w :=TWrapper.Create;
try
  w.Run();
finally
  w.Free;
end;

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

Что в этом неэстетического, что Вас огорчило?
...
Рейтинг: 0 / 0
05.01.2018, 14:06
    #39579688
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
СинийТон,

Так пусть w :=TWrapper.Create; создается хоть 100500 экземпляров... Он как адаптер обернет ваш скрытый синглтон, который будет в единственном экземпляре.
Не надо городить переопределения NewInstance FreeInstance.
Сделали Адаптер и забыли... Единственное что при появлении метода в вашем классе, его надо пробросить и в адаптер. Но это решается комментариями к классу
...
Рейтинг: 0 / 0
05.01.2018, 14:42
    #39579715
СинийТон
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
X-CiteТак пусть w :=TWrapper.Create; создается хоть 100500 экземпляров...да, новогодний перфекционизм рассеялся - скрипач синглтон не нужен )).
...
Рейтинг: 0 / 0
05.01.2018, 19:14
    #39579854
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
авторКогда одновременно два потока зайдут в Create кто-то из них должен будет создать инстанс, а кто-то подождать результата его работы.

Один поток создаст инстанс потому, что счётчик будет = 0. Второй поток должен, как я понимаю, InterlockedIncrement'ом придержаться. И ему уже вернётся счетчик = 1. Отдельную проверку счетчику не делать, проверять результат InterlockedIncrement'а.
...
Рейтинг: 0 / 0
05.01.2018, 19:17
    #39579856
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
Если совсем не получится - то по-старинке, критической секцией, одной на конструктор и деструктор. Тогда и счетчик можно не лочить.
...
Рейтинг: 0 / 0
05.01.2018, 19:30
    #39579864
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
также можно посмотреть в сторону InterlockedCompareExchange и InterlockedAdd.
...
Рейтинг: 0 / 0
05.01.2018, 20:16
    #39579887
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как переделать на синглтон
СинийТонkealon(Ruslan), ?

Есть мой функционал в dll. Для удобства его использования сделал обёртку.

Ребята используют как-то так:
Код: pascal
1.
2.
3.
4.
5.
6.
w :=TWrapper.Create;
try
  w.Run();
finally
  w.Free;
end;

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

Что в этом неэстетического, что Вас огорчило?меня это нисколько не огорчает, пока будут такие деятели у меня будет работа и зп

чем
Код: pascal
1.
???_Run();

сложнее для понимания?
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / как переделать на синглтон / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]