Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.10.06;
Скачать: CL | DM;

Вниз

Нужен третейский судья :)   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.71 MB
Время: 0.025 c
15-1367129093
Neuro System
2013-04-28 10:04
2013.10.06
Помогите решить академические задачи


15-1366925402
Юрий
2013-04-26 01:30
2013.10.06
С днем рождения ! 26 апреля 2013 пятница


4-1267109067
davinchi
2010-02-25 17:44
2013.10.06
Отслеживание обращений к файловой системе?


6-1269679629
syserg
2010-03-27 11:47
2013.10.06
Получить список имен файлов на сайте


15-1366559274
UseSynergy
2013-04-21 19:47
2013.10.06
Ищу программистов для стартапа