Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.10.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
Юрий Зотов ©   (2013-04-24 13:59) [160]

> DevilDevil ©   (24.04.13 10:11) [135]

S1 := TMySingleton.Create;
S2 := TMySingleton.Create;

Итак, код сработал: S1 и S2 - это ссылки на один и тот же объект. Далее.

S1.Free;

Объект уничтожен и теперь любое обращение к нему (хоть через S1, хоть через S2) выдаст AV. Что и должно быть.

А Вы ожидали чудес? Ожидали, что обращение к уже уничтоженному объекту через переменную с другим именем будет каким-то волшебным образом работать без AV ?

Не будет.

> Если честно, я так и не понял цимус такого класса-синглетона

Если честно, то Вы не понимаете цимус синглтона ВООБЩЕ, а не только ТАКОГО синглтона. Синглтоны используются тогда, когда в программе не нужны несколько одновременно существующих объектов одного и того же класса. Например, это часто бывают какие-то фабрики. В IDE Delphi тоже есть синглтоны - инспектор объектов, палитра выравнивания и т.п.

Синглтон не обязательно оформлять именно как синглтон - часто бывает вполне достаточно того, что программист сам знает, что объект вот этого класса ему создавать не нужно (главная форма, например). Но если мы пишем какую-то библиотеку, где используется синглтон и хотим застраховать ее пользователя (то есть, прикладного программиста) от ошибок, то синглтон мы должны оформить именно как синглтон.

Вот такой цимус.


 
Компромисс1 ©   (2013-04-24 14:04) [161]

Юрий Зотов ©   (24.04.13 13:59) [160]

ИМХО Вы требуете от пользователя знания реализации Вашего TMySingleton для нормального использования.
Я бы либо не позволил создавать S2 := TMySingleton.Create совсем, либо изменил название метода на какой-нибудь getInstance. Create все-таки четко указывает, что создается новый объект.


 
_oxffff   (2013-04-24 14:06) [162]


> А Вы ожидали чудес? Ожидали, что обращение к уже уничтоженному
> объекту через переменную с другим именем будет каким-то
> волшебным образом работать без AV ?
>
> Не будет.


Чудеса будут в XE4 под мобильные компиляторы.

Раздел
The Free and DisposeOf methods under ARC

http://docwiki.embarcadero.com/RADStudio/XE4/en/Automatic_Reference_Counting_in_Delphi_Mobile_Compilers


 
euru ©   (2013-04-24 14:07) [163]

А как такой вариант:

unit Unit1;

interface

type
  ISingleton = interface
  end;

function Singleton: ISingleton;

implementation

type
  TSingleton = class(ISingleton)
  end;

var SingletoneInstance: TSingletone;

function Singletone: ISingletone;
begin
  if SingletoneInstance = nil then
    SingletoneInstance = TSingletone.Create;
  Result := SingletoneInstance;
end;

finalization
  if SingletoneInstance <> nil then
    SingletoneInstance.Free;
end.


 
DevilDevil ©   (2013-04-24 14:34) [164]

> Юрий Зотов ©   (24.04.13 13:59) [160]

это я к тому, что вообще не понятно, по кой фиг иметь возможность вызывать конструкторы по несколько раз для одного и того же объекта
а раз уж кому-то это понадобилось - то логично заложить адекватную реакцию на соответствующий Free, чего Вы не сделали. Реализуется это подсчётом ссылок. Но опять таки не понятно зачем


 
DevilDevil ©   (2013-04-24 14:40) [165]

Удалено модератором


 
DevilDevil ©   (2013-04-24 14:47) [166]

> Юрий Зотов ©   (24.04.13 13:59) [160]

и ещё момент

type
TMySingleton = class(TSingleton)
   Name: string;

   constructor Create;
end;

constructor TMySingleton.Create;
begin
 inherited;
 Name := "Default value";
end;

...
var
S1, S2: TMySingleton;
begin
S1 := TMySingleton.Create;

S1.Name := "задаём какое-то имя";
Writeln("Имя = ", S1.Name); // "задаём какое-то имя"

S2 := TMySingleton.Create;

Writeln("Имя = ", S1.Name); // "Default value"
end;


Как бы Вы не перехватили NewInstance - код конструктора всёравно вызовется


 
Компромисс1 ©   (2013-04-24 14:56) [167]

Удалено модератором


 
Ega23 ©   (2013-04-24 14:59) [168]

Удалено модератором


 
DevilDevil ©   (2013-04-24 14:59) [169]

Удалено модератором


 
Компромисс1 ©   (2013-04-24 15:04) [170]

DevilDevil ©   (24.04.13 14:59) [169]

Так я ж написал, в чем минусы define по сравнению с дополнительным модулем. Теперь твоя очередь найти минусы в дополнительном модуле. Само наличие дополнительного модуля минусом не является, потому как не всеми он используется.


 
DevilDevil ©   (2013-04-24 15:05) [171]

Удалено модератором


 
Компромисс1 ©   (2013-04-24 15:09) [172]

Удалено модератором


 
DevilDevil ©   (2013-04-24 15:14) [173]

> Так я ж написал, в чем минусы define по сравнению с дополнительным
> модулем


в моей жизни НИ РАЗУ не было, чтобы два дифайна пересеклись, ни разу
имена дифайнов специально выбирают такими, чтобы они были говорящими и уникальными

по поводу множества дифайнов - они наверное были в конфиге и подключались в хедере по {$include/$i}
тоже совершенно стандартный подход
что здесь может быть неприятно и почему это минус - я не понял

По поводу модуля с переменной - особого минуса нет
Но я считаю плохим тоном создавать модуль для 3х строк кода: переменной, конструктора и деструктора
Уж лучше нормально объявить переменную в рамках своего проекта и использовать
Выражаясь твоим языком - давайте для каждой переменной свой модуль заводить


 
_oxffff   (2013-04-24 15:15) [174]

Кокаинум.....


 
DevilDevil ©   (2013-04-24 15:16) [175]

Удалено модератором
Примечание: Читаем правила пожалуйста в течение недели


 
Компромисс1 ©   (2013-04-24 15:18) [176]

Удалено модератором


 
Компромисс1 ©   (2013-04-24 15:20) [177]

Удалено модератором


 
_oxffff   (2013-04-24 15:20) [178]

Удалено модератором


 
Компромисс1 ©   (2013-04-24 15:23) [179]


> Но я считаю плохим тоном создавать модуль для 3х строк кода:
>  переменной, конструктора и деструктора


Кстати, я уже писал, но повторюсь. Я считаю, что в данном случае синглтон вообще не нужен. Пусть клиенты используют библиотеку как хотят. Объявлять за них переменные с инициализированными объектами - плохая идея. Ведь никто же не заводит 2 переменные ("doubleton" :-), даже если это самое типичное использование какого-то класса.


 
DevilDevil ©   (2013-04-24 15:23) [180]

> Компромисс1 ©   (24.04.13 15:18) [176]

для того чтобы меня переубедить - достаточно предложить альтернативу лучше
"лучше" - значит эффективней в конкретной ситуации
эффективность = сумма плюсов и минусов помноженных на вектор приоритетов

к примеру Аббат Пиккола предложил обратный дифайн
и это действительно разумная альтернатива


 
_oxffff   (2013-04-24 15:24) [181]

Удалено модератором


 
Компромисс1 ©   (2013-04-24 15:26) [182]

_oxffff   (24.04.13 15:24) [181]

Он оставил двоякое впечатление :) Я так и не понял, кто из нас с DevilDevil гопник. Наверное, оба :)

ЗЫ. Что-то я перестаю соответствовать своему нику, надо помягче быть :)


 
DevilDevil ©   (2013-04-24 15:29) [183]

Удалено модератором


 
Ega23 ©   (2013-04-24 15:31) [184]

Удалено модератором


 
_oxffff   (2013-04-24 15:32) [185]


> euru ©   (24.04.13 14:07) [163]


TStuff=class abstract
private type
 TStuffImpl=class(TStuff)

  end;

private class var Instance:TStuff;

public
class function getInstance:TStuff;static;
end;

class function getInstance:TStuff;
begin
if not assigned(Instance) then Instance:=TStuffImpl.create;
result:=Instance;
end;

Использование TStuff.getInstance()

Что касаемо создания класса TStuff помеченного как абстракт, то
не знаю как XE3 и XE4 можно ли его создавать.
Раньше было можно, но это явно баг.


 
Ega23 ©   (2013-04-24 15:34) [186]

Удалено модератором


 
Ega23 ©   (2013-04-24 15:35) [187]


> Раньше было можно, но это явно баг.


Вроде бы warning был в этом случае.


 
_oxffff   (2013-04-24 15:39) [188]


> Ega23 ©   (24.04.13 15:35) [187]
>
> > Раньше было можно, но это явно баг.
>
>
> Вроде бы warning был в этом случае.


Спасибо нужно глянуть.
Но по идее это явно ошибка.
Либо они не хотели делать динамическую проверку при создании через class of, если  трактовать как ошибку.


 
DevilDevil ©   (2013-04-24 15:40) [189]

Удалено модератором


 
DevilDevil ©   (2013-04-24 15:46) [190]

Удалено модератором


 
Аббат Пиккола   (2013-04-24 15:47) [191]

Не знаю, рассматривалось ли такое решение.
Добавить метод класса, поставляющий этот самый синглетон.
Не функцию, а именно метод класса. Отдельный конструктор.
Возможно ли такое решение?
Допустим у меня есть TFoo.GetSingleton, возвращающий указатель на создаваемый этим методом при первом вызове глобальный и уникальный объект.
Допустим я создал класс-наследник TFoo2 = class(TFoo).
Вызов TFoo2.GetSingleton вернет указатель на объект класса TFoo2.
Или я неправ?
Если неправ, конструктор можно сделать виртуальным и перекрывать.
Но так или иначе это можно реализовать.


 
Marser ©   (2013-04-24 15:49) [192]

Удалено модератором


 
Компромисс1 ©   (2013-04-24 15:50) [193]

DevilDevil ©   (24.04.13 15:40) [189]


> Задача - иметь 2 разных режима работы библиотеки
> Первый режим универсальный, второй режим - синглетон конкретного
> типа с конкретным именем
> Найди решение лучше, чем использовать дифайны


Я как сенсорный иррационал считаю, что тут не нужен никакой define. Если уж так хочется кроме универсального режима (который позволяет иметь "синглетон конкретного типа с конкретным именем"), иметь еще и "синглетон конкретного типа с конкретным именем", то этот "синглетон конкретного типа с конкретным именем" может быть объявлен в отдельном модуле. И если ты как интуит потребуешь доказательство, что такой подход где-то применяется, то я сообщаю, что многие библиотеки поставляются с примерами и шаблонами приложений/модулей. Часто даже в мануале к библиотеке написано - берите базовое приложение X и изменяйте его по своим нуждам


 
Аббат Пиккола   (2013-04-24 15:52) [194]

Удалено модератором


 
DevilDevil ©   (2013-04-24 15:53) [195]

> Компромисс1 ©   (24.04.13 15:50) [193]

доказательства - это для сенсориков :)
мы интуиты редко их делаем :) (без шуток, такая особенность психики)

в универсальном режиме (первый) нет синглетона
в частном режиме (второй) есть синглетон


 
Компромисс1 ©   (2013-04-24 16:02) [196]

DevilDevil ©   (24.04.13 15:53) [195]

Ты меня в конец запутал. Как я могу быть одновременно сенсориком и иррационалом? Я обожаю иррациональные доказательства? :)

Marser ©   (24.04.13 15:49) [192]

Да, после того, как я узнал, что доказательства не принимаются, согласен с бессмысленностью дискуссий.


 
_oxffff   (2013-04-24 16:02) [197]

Если ты хочешь выбирать разные режимы сборки своего приложения в compile time, то естественно define.
Если ты хочешь выбирать разные режимы в run-time, то реализуй соответствующий подход(например один из паттернов).

Синглетон то здесь причем?


 
Аббат Пиккола   (2013-04-24 16:02) [198]

Чем-то мне это все напоминает спор о том, должен ли Бог быть един или ему можно признать сотоварищей.

Единый Бог это синглетон. Неинициализированный пока.

Таким образом Розыч предлагает именно единого неинициализированного (несуществующего без надобности) Бога. Если такая сущность понадобится, ее можно будет инициализировать функцией Foo. Перавя же молитва оживит единого Бога.

Еретики же предлагают то, что уже не раз осуждалось - язычество. Они усматривают возможность полиморфизма у Бога, готовы плодить сущности без надобности, которые бы подменили в конечном итоге Единого Бога неизвестно кем. Есть даже те, кто предлагает запретить инициализацию Единого Бога и даже само упоминание о нем при помощи дьявольской выдумки - дифайна.

Раз уж спор пошел богословский, предлагаю обсудить конкретную богословскую тему в самом общем философском ключе:

МОЖЕТ ЛИ СИНГЛЕТОН ОБЛАДАТЬ ПОЛИМОРФИЗМОМ ?


 
Ega23 ©   (2013-04-24 16:04) [199]

Удалено модератором


 
_oxffff   (2013-04-24 16:05) [200]

Удалено модератором



Страницы: 1 2 3 4 5 6 7 вся ветка

Форум: "Прочее";
Текущий архив: 2013.10.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.81 MB
Время: 0.031 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 пятница


6-1269649035
defen
2010-03-27 03:17
2013.10.06
демодуляция сигнала с GMSK модуляцией


2-1358276402
Pcrepair
2013-01-15 23:00
2013.10.06
Непонятное использование String в коде программы


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





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