Форум: "Прочее";
Текущий архив: 2013.10.06;
Скачать: [xml.tar.bz2];
ВнизНужен третейский судья :) Найти похожие ветки
← →
Romkin © (2013-04-23 13:22) [80]
> В таком случае любой класс, в котором только class functions
> и нет instance functions, можно назвать singleton. Хотя
> можно назвать и utility class, если даже создавать экземпляры
> необязательно :)
Естественно. Если что-то ведет себя как синглетон, то это синглетон и есть :)
← →
Юрий Зотов © (2013-04-23 13:37) [81]> Компромисс1
Согласен, реализация кривая - а что Вы хотите от кода, написанного наскоро за 5 минут? Вечером постараюсь сделать нормально.
Однако, несмотря ни на что, факт остается фактом - лишение программиста возможности работать с памятью напрямую ограничивает его. Например, в части работы с системным API.
> DevilDevil © (23.04.13 11:23) [62]
> а какой практический смысл перехвата NewInstance?
????????????? Мы хотим сделать синглтон, или что?
> Ибо Вы не вызываете InitInstance.
???????????? А что же там написано, если не вызов InitInstance?
> А если вызовете - то возможны утечки памяти (если в экземпляре были
> строки/варианты/интерфейсы/массивы/сложные структуры)
??????????? Однако, VCL вызывает и ничего страшного не происходит. См. модуль System.
← →
Компромисс1 © (2013-04-23 13:40) [82]
> Согласен, реализация кривая - а что Вы хотите от кода, написанного
> наскоро за 5 минут? Вечером постараюсь сделать нормально.
>
Не надо. Если Вам самому это неинтересно. Меня всё равно не переубедить )
> Однако, несмотря ни на что, факт остается фактом - лишение
> программиста возможности работать с памятью напрямую ограничивает
> его. Например, в части работы с системным API.
Согласен. Но обычно не просто так ограничивают, а предоставляют альтернативные интсрументы. Вот того же goto в Java нет и вряд ли когда-то будет. Хотя да, можно назвать лишением возможности.
← →
Pit (2013-04-23 14:21) [83]
> Вот того же goto в Java нет и вряд ли когда-то будет. Хотя
> да, можно назвать лишением возможности.
ну дык правильно. Один из немногочисленных вариантов, когда goto полезен - выход из вложенных циклов. А тут у java есть для этого спец. конструкция.
Убрали goto - избавились от минусов и плюсов его, а плюсы реализовали по-другому. Хорошее решение, что сказать то.
← →
Pit (2013-04-23 14:22) [84]Розыч!! Объясни мне, юродивому, нафига в твоих примерах в начале везде глобальная переменная ссылочного типа инициализируется nil? Они же по-умолчанию nil, неужели в какой-то дельфе это отменили?
← →
Pit (2013-04-23 14:22) [85]
> лишение программиста возможности работать с памятью напрямую
> ограничивает его
в ошибках.
← →
Inovet © (2013-04-23 14:25) [86]> [84] Pit (23.04.13 14:22)
> Они же по-умолчанию nil, неужели в какой-то дельфе это отменили?
Вдруг в какой-то версии nil перестанет быть равным 0. Шутка типа.
← →
Компромисс1 © (2013-04-23 14:27) [87]
> Розыч!! Объясни мне, юродивому, нафига в твоих примерах
> в начале везде глобальная переменная ссылочного типа инициализируется
> nil? Они же по-умолчанию nil, неужели в какой-то дельфе
> это отменили?
Это имеет смысл для визуализации того, что в секции initialization нет присвоения.
var a:Object = nil;
var b:Object;
initialization
b = foo();
← →
DevilDevil © (2013-04-23 14:31) [88]> Romkin © (23.04.13 13:11) [78]
есть нормальный класс TFoo
как ты объявишь синглетон Foo: TFoo своим методом ?
← →
DevilDevil © (2013-04-23 14:40) [89]> Юрий Зотов © (23.04.13 13:37) [81]
нет, всё-таки не понятно, зачем 2 разные функции синглетона
зачем перехватывать NewInstance
и чем это лучше простой реализации Розыча
← →
Ega23 © (2013-04-23 14:57) [90]
> и чем это лучше простой реализации Розычаfunction Foo: TFoo;
implementation
var
_Foo: TFoo;
function Foo: TFoo;
begin
if _Foo = nil then
_Foo := TFoo.Create;
Result := _Foo;
end;
finalization
_Foo.Free;
В другом юните
Foo.Free;
В лучшем случае - Invalid Pointer Operation на выходе из программы.
← →
Romkin © (2013-04-23 15:00) [91]
> есть нормальный класс TFooкак ты объявишь синглетон Foo:
> TFoo своим методом ?
Вот зачем - в голову не приходит. Синглетоны создаются специально. Ты хочешь получить именно синглетон-потомок TFoo? Это подозрительно.
← →
DevilDevil © (2013-04-23 15:02) [92]> Romkin © (23.04.13 15:00) [91]
> Вот зачем - в голову не приходит. Синглетоны создаются специально.
> Ты хочешь получить именно синглетон-потомок TFoo? Это подозрительно.
это не я хочу
это Розыч хочет
← →
DevilDevil © (2013-04-23 15:05) [93]> Ega23 © (23.04.13 14:57) [90]
ну а так лучше что ли ?
S1 := TSingleton2.Create;
S2 := TSingleton2.Create;
S2.Free;
S1.Free;
← →
Юрий Зотов © (2013-04-23 15:10) [94]> DevilDevil © (23.04.13 14:40) [89]
> зачем перехватывать NewInstance
Синглтон не должен позволять создание более одного своего экземпляра.
> и чем это лучше простой реализации Розыча
Кто помешает 100 раз вызвать конструктор и создать 100 экземпляров?
← →
Romkin © (2013-04-23 15:15) [95]
> это не я хочу это Розыч хочет
Розыч, кажется, ничего подобного не заявлял :)
Хочется потомка существующего класса как синглетон, то на мой взгляд грамотно написать синглетон (там глобальные данные, отличные от данных экземпляра должны быть) и адаптер к нему для приведения к нужному типу.
Так на мой взгляд грамотнее, поскольку отделяется логика синглетона от использования экземпляра класса.
← →
DevilDevil © (2013-04-23 15:16) [96]> Юрий Зотов © (23.04.13 15:10) [94]
> Синглтон не должен позволять создание более одного своего
> экземпляра.
тогда логичнее выкидывать Exception при конструкторе (NewInstance) если экземпляр уже существует
> Кто помешает 100 раз вызвать конструктор и создать 100 экземпляров?
ну во-первых, такая возможность у TFoo как раз и должна быть
во-вторых, как я показал в [93], Ваш метод должен выдать AccessViolation
← →
Ega23 © (2013-04-23 15:19) [97]Да достали уже, ей-Б-гу. Ну вот вас ни разу не смущает, что главная форма, фактически, работает как синглтон. Хотя - глобальная переменная. Хотя - можно насоздавать стопицот экземпляров.
Однако же
var
frmMain: TfrmMain;
И ничо, всё работает.
← →
DevilDevil © (2013-04-23 15:20) [98]> Romkin © (23.04.13 15:15) [95]
это я всё к чему говорю:
1) если класс изначально создаётся как класс в единственном экземпляре, то твой подход оправдан. TFoo - это другой случай. Когда вполне может быть много экземпляров
2) исходя из моего понимания синглетонов от какого-то класса - реализация Розыча средствами Delphi самая оптимальная
3) специфику библиотеки и почему оправдано только использование дифайна - я тоже объяснить
об чём спор то тогда ?
← →
DevilDevil © (2013-04-23 15:21) [99]> Ega23 © (23.04.13 15:19) [97]
она работает как "синглетон" только в том случае если она явно инициализируется
в типичном понимании Application.CreateForm(TfrmMain, frmMain);
← →
Rouse_ © (2013-04-23 15:22) [100]Я немного поясню что именно я хотел и откуда вообще все вылезло:
Изначально в классе предлагалась инициализщация через дефайны, причем никто не мешает создавать экземпляр класса и самому.
Мне показалось нелогичным использовать дфайны - если так уже хочется использовать глобальную точку доступа к экземпляру, которая в случае дефайна является переменной, то лучше изменить ее на синглтон.
Если бы небыло этой инициализации класса внутри самого юнита - то и спора никакого небыло бы :)
Тем более 99.9 юнитов не использует никакой инициализатор, просто реализация класса и все.
← →
DevilDevil © (2013-04-23 15:25) [101]> Rouse_ © (23.04.13 15:22) [100]
розыч, ты автор 100го сообщения
а я тебе в сотый раз говорю, что предназначение дифайна - это не замена функцииvar
_Foo: TFoo = nil;
function Foo: TFoo;
begin
if _Foo = nil then
_Foo := TFoo.Create;
Result := _Foo;
end;
Предназначение дифайна - определить частный режим работы библиотеки
Это выглядит как переменная. На самом деле это режим работы, подразумевающий определённый регламент
← →
Romkin © (2013-04-23 15:28) [102]
> 1) если класс изначально создаётся как класс в единственном
> экземпляре, то твой подход оправдан. TFoo - это другой случай.
> Когда вполне может быть много экземпляров
Вот все что я видел - методы и данные синглетона специфичны. То есть он пишется от какого-то достаточно абстрактного класса, со своими данными и методами, отличающимися от остальных потомков.
← →
Romkin © (2013-04-23 15:29) [103]
> Изначально в классе предлагалась инициализщация через дефайны,
> причем никто не мешает создавать экземпляр класса и самому.
Замените на конструктор класса.
← →
DevilDevil © (2013-04-23 15:32) [104]> Romkin © (23.04.13 15:29) [103]
см [101]
← →
Romkin © (2013-04-23 15:41) [105]
> см [101]
см. [103] :)
← →
Ega23 © (2013-04-23 15:44) [106]
> см [101]
> см. [103] :)
см. [106]
← →
Ega23 © (2013-04-23 15:44) [107]Я победил. :)
← →
DevilDevil © (2013-04-23 15:45) [108]нет я :)
← →
_oxffff (2013-04-23 15:50) [109]
> Замените на конструктор класса.
+1.
← →
_oxffff (2013-04-23 15:56) [110]
> Invalid Pointer Operation
А мужики то не в курсе.
The Delphi Language for Mobile Development
http://www.delphifeeds.com/go/s/103218
AutomaticReferenceCounting (Delphi XE4)
http://docwiki.embarcadero.com/RADStudio/XE4/en/Automatic_Reference_Counting_in_Delphi_Mobile_Compilers
Сам читаю пока не совсем понял, что насчет циклических зависимостей.
← →
Rouse_ © (2013-04-23 16:17) [111]
> Предназначение дифайна - определить частный режим работы
> библиотеки
> Это выглядит как переменная. На самом деле это режим работы,
> подразумевающий определённый регламент
Господи, и чем ему синглтон не угодил? © Почти Барон Мюнгхаузен :)
← →
antonn © (2013-04-23 16:32) [112]
> P.S. Представьте себе структуру на Java(а поскольку в java
> нет структур, то это класс), смысл в которой это набор данных.
> Я объявил как набор public полей.
>
> Мой код увидел разработчик на Java и обернул это все сеттерами
> и геттерами (напрямую работающие с каждым полем) и свел
> поля в private. Я его спросил, а зачем? Мне ответили бо
> инкапсуляция.
я частенько так на шарпе делаю если только код не "на отшибись".. как правило если вдруг потом нужно выполнить какие нибудь действия перед "назначением значения" - то все уже готово :)
← →
DevilDevil © (2013-04-23 16:34) [113]> Rouse_ © (23.04.13 16:17) [111]
Розыч, я не знаю, понимаешь ли ты или нет
Тут вопрос идеологии
Фундамент так сказать всего и вся
Камазу нужно 6 колёс
Мотоциклу с люлькой - 3
Ты же предлагаешь делать 4,5 колеса. Который и для мотоцикла не подходит, и для камаза не подходит.
дифайн - это режим работы
← →
Компромисс1 © (2013-04-23 16:37) [114]DevilDevil © (23.04.13 16:34) [113]
Область применения директив компилятора не ограничивается указанием режима работы библиотек.
← →
Ega23 © (2013-04-23 16:50) [115]
> Область применения директив компилятора не ограничивается
> указанием режима работы библиотек.
Не, ну если под библиотекой понимать отдельную сущность, типа dll - то ограничивается.
А если как набор dcu - тады ой.
← →
DevilDevil © (2013-04-23 17:11) [116]> Компромисс1 © (23.04.13 16:37) [114]
очевидно я об этом знаю :)))))
← →
DevilDevil © (2013-04-23 17:17) [117]> Ega23 © (23.04.13 16:50) [115]
а что с dcu ?
как надо - так и компилируй
нужно dcu с синглетоном - скомпилируй и отдавай
нужно dcu без синглетона - компилируй и отдавай
я не понимаю в чём тут сложность
наоборот дифайны в данном случае лучшие друзья
потому что если синглетон нафиг не спёрся, а в модуле уже объявлен как у Розыча - тут уже могут быть проблемы
p.s.
кстати у меня уже была ситуация, когда нужно было обращаться к Foo: TFoo. И в паре мест предполагалось брать этот Foo как аргумент функции. Но в процессе рефакторинга, я этот параметр добавить забыл - и функция обращалась к глобальной переменной Foo, что привело к багу, который я потом долго искал. В общем конфликт имён - зло редкое
← →
han_malign (2013-04-23 17:17) [118]
> Господи, и чем ему синглтон не угодил?
- сегодня поленился протащить видимость корневого атрибута в иерархической коллекции объектов - завтра замучаешься масштабировать...
← →
Ega23 © (2013-04-23 17:30) [119]
> я не понимаю в чём тут сложность
Сложность тут в том, что у меня, например, уже есть дефайн, с которым собраны твои dcu. И завязан он на обращение к астралу 29 февраля каждого високосного года.
← →
DevilDevil © (2013-04-23 17:42) [120]> Ega23 © (23.04.13 17:30) [119]
когда ты компилируешь pas в dcu в x86 и x64 - тебя почему-то не смущает, что на выходе получаются 2 совершенно разных dcu
когда ты компилируешь под разными версиями Delphi - ты почему то тоже не удивляешься, что на выходе получаются разные dcu
более того, разная комбинация опций компилятора делают разные dcu - и это тоже никого не парит
Но добавление одного пользовательского дифайна вводит в ступор весь форум мастеров дельфи
Мне кажется это грустно
Страницы: 1 2 3 4 5 6 7 вся ветка
Форум: "Прочее";
Текущий архив: 2013.10.06;
Скачать: [xml.tar.bz2];
Память: 0.69 MB
Время: 0.018 c