|
|
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
Есть библиотечка, а в ней классик. Как его переделать на синглтон, чтобы не менять код в других модулях? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2018, 18:19 |
|
||
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
СинийТонЕсть библиотечка, а в ней классик. Как его переделать на синглтон function -> class function procedure -> class procedure var -> class var , чтобы не менять код в других модулях?Никак. Код менять придется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2018, 18:32 |
|
||
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
Попробуйте внятно объяснить, что у Вас есть, почему Вас это не устраивает и, что Вы хотите изменить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2018, 18:41 |
|
||
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
rgreat, так можно, да, но люди привыкли к Сreate-Free. Ещё есть доп-условия: - не менять ранее написанный код использования, - не создавать раньше первого реального Сreate, - Сreate может быть из нескольких потоков, - если можно, то сделать реальный Free, если сейчас этот объект не нужен (хотелка) по-факту даже не синглтон получается, а как-то так ... Что-то туплю, чую простое решение, но туплю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2018, 18:54 |
|
||
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, внятно объяснить это наверное завтра, может отосплюсь, а то тяжело синапсам так сразу в бой ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2018, 18:59 |
|
||
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
СинийТонrgreat, так можно, да, но люди привыкли к Сreate-Free. Вы так говорите как будто это что-то хорошее. Ещё есть доп-условия: - не менять ранее написанный код использования, В чем тогда смысл синглтона, и что вы вообще подразумеваете под этим термином? - не создавать раньше первого реального Сreate, Разве бывают некие-то "не реальные" Create? - Сreate может быть из нескольких потоков, Ок, но при чем тут синглтон? - если можно, то сделать реальный Free, если сейчас этот объект не нужен (хотелка) по-факту даже не синглтон получается, а как-то так ... Может вам не синглтон а контейнер нужен? Что-то туплю, чую простое решение, но туплю.Как-то да. TList<T> или TDictionary<T> маячат на горизонте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2018, 19:49 |
|
||
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
СинийТонЕщё есть доп-условия: - не менять ранее написанный код использования, - не создавать раньше первого реального Сreate, - если можно, то сделать реальный Free, если сейчас этот объект не нужен (хотелка) 1. Исходный класс переименовываем и прячем в Implementation 2. Объявляем интерфейс с тем же именем и методами, что раньше были у класса 3. Объявляем, что наш класс реализует этот интерфейс 4. Объявляем у интерфейса метод Free и делаем пустым его реализацию 5. Объявляем функцию CreateMyObject в таком духе Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 6. В деструкторе не забываем обнулить ссылку Код: pascal 1. 2. 3. 4. 5. СинийТон- Сreate может быть из нескольких потоков,Не забываем про синхронизацию доступа как к самому GSingleton, так и к его полям Таким образом, все задачи, кроме СинийТонно люди привыкли к Сreateрешены. Вместо Сreate придется таки писать CreateMyObject ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2018, 19:52 |
|
||
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
Чтобы все удовлетворяло вашим условиям и нигде не менять код Используйте паттерн адаптер Вы сможете повторить все методы вашего класса + добавить новые (Free когда объект реально (по мнению разработчика, а не системы) не нужен). Внутри адаптера реализуйте ваш класс в виде синглтона. Платой за это будет дублирование всех public методов и свойств ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2018, 20:05 |
|
||
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
Спасибо за замечания-предложения! - Сreate может быть из нескольких потоков,Ок, но при чем тут синглтон?- Думаю что в момент создания первого-единого экземпляра из одного потока, нужно как-то будет подождать второму-третьему потоку завершения создания объекта в первом? Не знаю какую тут проще-нужно конструкцию синхронизации использовать? - Да, адаптер , как-бы оно, но его и хочется сделать синглтоном (не создавать на каждый Create). - А если по аналогии с 4. Объявляем у интерфейса метод Free и делаем пустым его реализациюподменить конструктор на: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Так сработает или это совсем грязно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 10:26 |
|
||
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
нужно, как в соседней ветке, для начала разобраться с тз: нужен один инстанс класса (синглтон) или много инстансов? потом думать как тз реализовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 12:45 |
|
||
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
СинийТонДа, адаптер , как-бы оно, но его и хочется сделать синглтономЗачем? В адаптере нет никаких полей. Зачем он синглтоном СинийТонТак сработает или это совсем грязно?Для конструктора сработает. Для Free как метода класса - нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 15:07 |
|
||
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
makhaon, да, тз: Реализовать класс который - поддерживает многопоточное использование; - создаст только один инстанс на время использования; - когда все ссылки на инстанс будут освобождены, освободит и этот {один} инстанс; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2018, 11:29 |
|
||
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
СинийТон, судя по тз, единственный инстанс во время работы должен постоянно создаваться и разрушаться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2018, 11:39 |
|
||
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
СинийТонmakhaon, да, тз: Реализовать класс который - поддерживает многопоточное использование; - создаст только один инстанс на время использования; - когда все ссылки на инстанс будут освобождены, освободит и этот {один} инстанс; У вас во время создания инстанса происходит долгая инициализация? Или класс должен быть statefull между разными потоками? Или по коду должен быть один экземпляр общий для всех? (Например настройки приложения) Какой смысл перевода на синглтон? Просто работа ради работы или есть действительное обоснование? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2018, 13:27 |
|
||
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
makhaonединственный инстанс во время работы должен постоянно создаваться и разрушаться?да, но там всплески активности раз в час или несколько часов, а использующие на самом деле не сразу зовут фри, а с некоторой задержкой. У вас во время создания инстанса происходит долгая инициализация? Или класс должен быть statefull между разными потоками? Или по коду должен быть один экземпляр общий для всех? (Например настройки приложения)- Иногда, - да, - да Какой смысл перевода на синглтон? Просто работа ради работы или есть действительное обоснование? Первоначально не думалось про многопоточное использование (и такой псевдо синглтон получался сам собой). Теперь ещё и оптимизации какой-то захотелось и разобраться для себя интересно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2018, 14:34 |
|
||
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
СинийТонrgreat, так можно, да, но люди привыкли к Сreate-Free.Откуда только такие дегенераты берутся, гнать таких надо. "Программист" и "привык" это всё - крах карьеры. модуль по сути и есть синглтон, не надо всякую фигню изобретать без острой необходимости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2018, 08:52 |
|
||
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
СинийТон, костылевато, конечно, довольно сильно. ну да ладно. Create/Free переопределить, вести в них счетчик (если многопоточка - то через InterlockedIncrement/TInterlocked.Increment). Счетчик и сам инстанс сделать классовыми переменными. В Create если счетчик = 0, создаём единственный внутренний инстанс, иначе ничего не деаем. Во Free пока счетчик больше 0, ничего не делаем. Когда становится равным нулю, разрушаем единственный инстанс. Все методы и свойства делаем через классовый методы к внутреннему реальному инстансу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2018, 11:43 |
|
||
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
makhaon, оно то всё так, но с многопоточкой есть нюансы. Когда одновременно два потока зайдут в Create кто-то из них должен будет создать инстанс, а кто-то подождать результата его работы. И при обычных условия внутри Create у нас уже есть новый инстанс, нужно, как я понимаю, переопределить NewInstance. Буду смотреть в отладчике как там и что, раньше с таким не сталкивался. Если у кого есть примерчик с краткими пояснениями, то не откажусь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2018, 13:31 |
|
||
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), ? Есть мой функционал в dll. Для удобства его использования сделал обёртку. Ребята используют как-то так: Код: pascal 1. 2. 3. 4. 5. 6. Хочу-нужно изменить внутреннюю реализацию, по возможности, не напрягая коллег. Что в этом неэстетического, что Вас огорчило? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2018, 13:51 |
|
||
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
СинийТон, Так пусть w :=TWrapper.Create; создается хоть 100500 экземпляров... Он как адаптер обернет ваш скрытый синглтон, который будет в единственном экземпляре. Не надо городить переопределения NewInstance FreeInstance. Сделали Адаптер и забыли... Единственное что при появлении метода в вашем классе, его надо пробросить и в адаптер. Но это решается комментариями к классу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2018, 14:06 |
|
||
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
X-CiteТак пусть w :=TWrapper.Create; создается хоть 100500 экземпляров...да, новогодний перфекционизм рассеялся - скрипач синглтон не нужен )). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2018, 14:42 |
|
||
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
авторКогда одновременно два потока зайдут в Create кто-то из них должен будет создать инстанс, а кто-то подождать результата его работы. Один поток создаст инстанс потому, что счётчик будет = 0. Второй поток должен, как я понимаю, InterlockedIncrement'ом придержаться. И ему уже вернётся счетчик = 1. Отдельную проверку счетчику не делать, проверять результат InterlockedIncrement'а. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2018, 19:14 |
|
||
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
Если совсем не получится - то по-старинке, критической секцией, одной на конструктор и деструктор. Тогда и счетчик можно не лочить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2018, 19:17 |
|
||
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
также можно посмотреть в сторону InterlockedCompareExchange и InterlockedAdd. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2018, 19:30 |
|
||
|
как переделать на синглтон
|
|||
|---|---|---|---|
|
#18+
СинийТонkealon(Ruslan), ? Есть мой функционал в dll. Для удобства его использования сделал обёртку. Ребята используют как-то так: Код: pascal 1. 2. 3. 4. 5. 6. Хочу-нужно изменить внутреннюю реализацию, по возможности, не напрягая коллег. Что в этом неэстетического, что Вас огорчило?меня это нисколько не огорчает, пока будут такие деятели у меня будет работа и зп чем Код: pascal 1. сложнее для понимания? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2018, 20:16 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39578762&tid=2041363]: |
0ms |
get settings: |
11ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
212ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
90ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 597ms |

| 0 / 0 |
