Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1366649723
Rouse_
2013-04-22 20:55
2013.10.06
Нужен третейский судья :)


2-1358414836
O'ShinW
2013-01-17 13:27
2013.10.06
Моргает ListView.(D7)


2-1358341960
McLotos
2013-01-16 17:12
2013.10.06
Разбросать результат SQL-запроса по переменным


15-1366662603
Юрий
2013-04-23 00:30
2013.10.06
С днем рождения ! 23 апреля 2013 вторник


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





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