Сново Синглтон, но уже с точки зрения проктирования
От: Аноним  
Дата: 05.10.06 12:44
Оценка:
Интересует философский вопрос. Должен ли знать клиент что он работает с глобальным объектом или это должно быть скрыто от клиента? Если например клиент пишет MyObj=new TMyObj и ему каждый раз возвращается один и тот же объект. Будет ли это синглетон или нет?
Re: Сново Синглтон, но уже с точки зрения проктирования
От: Lloyd Россия  
Дата: 05.10.06 12:58
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Интересует философский вопрос. Должен ли знать клиент что он работает с глобальным объектом или это должно быть скрыто от клиента? Если например клиент пишет MyObj=new TMyObj и ему каждый раз возвращается один и тот же объект. Будет ли это синглетон или нет?


Если экземпляр класса всегда один, то да, это синглетон.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Сново Синглтон, но уже с точки зрения проктирования
От: Аноним  
Дата: 05.10.06 13:08
Оценка:
L>Если экземпляр класса всегда один, то да, это синглетон.

ВОт есть определение
1) The intent of the Singleton pattern as defined in Design Patterns is to "ensure a class has only one instance, and provide a global point of access to it"
2) The Singleton pattern ensures that a class only has one instance and provides a global point of access to it from a well-known access point.

Смущает выделенный текст. Получается что при использовании конструкции MyObj=new TMyObj() клиент не знает что он обращается к глобальному объекту. Получается размытость синглетона. Так ли это?
Re[2]: Сново Синглтон, но уже с точки зрения проктирования
От: Аноним  
Дата: 05.10.06 13:10
Оценка:
Здравствуйте, Lloyd, Вы писали:


Если например клиент пишет MyObj = new TMyObj и ему каждый раз возвращается один и тот же объект.



Это нехорошо. Если new, то предполагается новый обьект. Лучше явно указывать, что используется синглтон, например, получать обьект через метод getSingleton()
Re[3]: Сново Синглтон, но уже с точки зрения проктирования
От: Аноним  
Дата: 05.10.06 13:18
Оценка:
А>Это нехорошо. Если new, то предполагается новый обьект. Лучше явно указывать, что используется синглтон, например, получать обьект через метод getSingleton()
А чем не хорошо? Для клиенсткого кода это вообще прозрачно. Ну создал он объект, потом работает с ним. А на самом деле это синглетон
Re: Сново Синглтон, но уже с точки зрения проктирования
От: Anry Spitsov Россия www.spitsov.ru
Дата: 05.10.06 14:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Интересует философский вопрос. Должен ли знать клиент что он работает с глобальным объектом или это должно быть скрыто от клиента? Если например клиент пишет MyObj=new TMyObj и ему каждый раз возвращается один и тот же объект. Будет ли это синглетон или нет?

Лучше заставить клиента для получения объекта вызывать что-то типа GetInstance. Тогда клиент точно будет знать, что работает с синглетон Через new уж как-то слишком запутано выглядит, да и создает иллюзию, что объект каждый раз создается.
Re[3]: Сново Синглтон, но уже с точки зрения проктирования
От: desco США http://v2matveev.blogspot.com
Дата: 05.10.06 15:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Lloyd, Вы писали:



А>

А>Если например клиент пишет MyObj = new TMyObj и ему каждый раз возвращается один и тот же объект.



А>Это нехорошо. Если new, то предполагается новый обьект. Лучше явно указывать, что используется синглтон, например, получать обьект через метод getSingleton()


если для создания используется new, то, ИМХО, акцент для клиента делается не на том, что он работает с одним экземпляром класса, а скорее — что несколько обьектов разделяют какое-то общее состояние, то есть это не синглтон, а Monostate.

Singleton And Monostate (pdf)
http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif
Re[3]: Сново Синглтон, но уже с точки зрения проктирования
От: AlLucky Беларусь Qulix Systems
Дата: 05.10.06 17:03
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, Lloyd, Вы писали:



А>

А>Если например клиент пишет MyObj = new TMyObj и ему каждый раз возвращается один и тот же объект.



А>Это нехорошо. Если new, то предполагается новый обьект. Лучше явно указывать, что используется синглтон, например, получать обьект через метод getSingleton()


Это почему же нехорошо?
По Вашему получается и SqlConnection, работающий через пулинг тоже нехорошо
Имхо, в некоторых задачах, да и просто в целях расширяемости — вполне нормально решение. Если, конечно, его удастся реализовать.
... << RSDN@Home 1.2.0 alpha rev. 648>>
Aleksandr Sly
Re[3]: Сново Синглтон, но уже с точки зрения проктирования
От: KolanT  
Дата: 05.10.06 19:11
Оценка:
А>Это нехорошо. Если new, то предполагается новый обьект. Лучше явно указывать, что используется синглтон, например, получать обьект через метод getSingleton()


Не getSingleton(), а GetInstance. Синглетон служит для доступа к экземпляру другого класса.
Re[4]: Сново Синглтон, но уже с точки зрения проктирования
От: Аноним  
Дата: 06.10.06 05:27
Оценка:
D>если для создания используется new, то, ИМХО, акцент для клиента делается не на том, что он работает с одним экземпляром класса, а скорее — что несколько обьектов разделяют какое-то общее состояние, то есть это не синглтон, а Monostate.

D>Singleton And Monostate (pdf)


Ссылка битая
Re[4]: Сново Синглтон, но уже с точки зрения проктирования
От: Аноним  
Дата: 06.10.06 05:28
Оценка:
KT>Не getSingleton(), а GetInstance. Синглетон служит для доступа к экземпляру другого класса.

Какого другого? Он в GetInstance возвращает экземпляр собственного класса
Re[2]: Сново Синглтон, но уже с точки зрения проктирования
От: Аноним  
Дата: 06.10.06 05:29
Оценка:
AS>Лучше заставить клиента для получения объекта вызывать что-то типа GetInstance. Тогда клиент точно будет знать, что работает с синглетон Через new уж как-то слишком запутано выглядит, да и создает иллюзию, что объект каждый раз создается.

Так в этом же и вопрос. Должен знать клиент что он использует один единственный экземпляр или нет. И зачем ему это знать?
Re[4]: Сново Синглтон, но уже с точки зрения проктирования
От: DemAS http://demas.me
Дата: 06.10.06 07:05
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>А чем не хорошо? Для клиенсткого кода это вообще прозрачно. Ну создал он объект, потом работает с ним. А на самом деле это синглетон


Тем, что класс может сохранять свое состояние в переменных классах.
Когда человек говорит new — он ожидает, что получит свежий инициализированный экземпляр объекта, "незамусоренный" предыдущей работой с ним.
... << RSDN@Home 1.2.0 alpha rev. 653>>
Re[5]: Сново Синглтон, но уже с точки зрения проктирования
От: desco США http://v2matveev.blogspot.com
Дата: 06.10.06 07:11
Оценка:
Здравствуйте, Аноним, Вы писали:

D>>если для создания используется new, то, ИМХО, акцент для клиента делается не на том, что он работает с одним экземпляром класса, а скорее — что несколько обьектов разделяют какое-то общее состояние, то есть это не синглтон, а Monostate.


D>>Singleton And Monostate (pdf)


А>Ссылка битая


странно, еще вчера была живая
тогда то же самое здесь
http://www.linkedin.com/img/webpromo/btn_profile_bluetxt_80x15.gif
Re[5]: Сново Синглтон, но уже с точки зрения проктирования
От: Аноним  
Дата: 06.10.06 08:11
Оценка:
DAS> Тем, что класс может сохранять свое состояние в переменных классах.
Ну и что? Вот человек написал new и получил ссылку на синглетон. Потом выставляет свойства, например путь к БД. А этот путь глобальный. И следующий пользователь получет его через new
Re[6]: Сново Синглтон, но уже с точки зрения проктирования
От: Аноним  
Дата: 06.10.06 08:14
Оценка:
Скачал. Вот один из недостатков синглетона

Non-transparent. Users of a singleton know that they are using a singleton because
they must invoke the Instance method.

Если я буду использовать new, то будет более прозрачно...
Re[3]: Сново Синглтон, но уже с точки зрения проктирования
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 06.10.06 09:31
Оценка: +1
Здравствуйте, <Аноним>, Вы писали:

А>Так в этом же и вопрос. Должен знать клиент что он использует один единственный экземпляр или нет. И зачем ему это знать?


Так клиенту же от этого ни горячо, ни холодно. Но если вы хотите, чтобы не было зависимости клиент-класс синглтона, то можно попробовать что-то типа Dependency Injection (пример на C#):

// Интерфейс какого-то абстрактного сервиса.
interface IService
{
    // Неважно какое действие.
    void Execute();
}

// Реализация интерфейса IService в, такскть, сервере.
class Service : IService
{
    // Тот самый единственный экземпляр.
    private static Service instance = new Service();
    
    public static Service Instance
    { 
        get { return instance; }
    }
    
    private Service()
    {
    }
}

// Интерфейс клиента. Я не знаю, как там у вас это реализовано, но давайте уж
// допустим какую-то плагинную архитектуру. Если плагин реализует
// IRequiresService, то это значит, что ему для работы требуется ссылка на
// экземпляр класса, реализующего IService. А уж что это будет его - синглтон ли или
// новый экземпляр - его совершенно не интересует.
interface IRequiresService
{
    IService Service
    { get; set; }
}

// Какой-то абстракнтный клиент.
class Client : IPlugin, IRequiresService
{
    // Реализация IRequiresService и IPlugin
    
    void Run()
    {
        Service.Execute();
    }
}

// Класс приложения.
class Application
{
    // Инициализация приложения.
    public void InitializeApplication()
    {
        // Тут, к примеру, обходим все сборки в папке \Plugins и загружаем все 
        // плагины, которые подвернутся под руку.
        foreach(...)
        {
            IPlugin plugin = CreatePluginInstance(...);
            
            // А вот тут-то и устанавливаем, если требуется, ссылку на экземпляр класса, реализующего
            // IService... 
            if(plugin is IRequiresService)
                // ...В данном случае это синглтон, но никто не помешает впоследствии заменить
                // эту строку на (plugin as IRequiresService).Service = new Service()
                (plugin as IRequiresService).Service = Service.Instance;
        } // foreach
    }
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
HgLab: Mercurial Server and Repository Management for Windows
Re[6]: Сново Синглтон, но уже с точки зрения проктирования
От: DemAS http://demas.me
Дата: 06.10.06 09:34
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Ну и что? Вот человек написал new и получил ссылку на синглетон. Потом выставляет свойства, например путь к БД. А этот путь глобальный. И следующий пользователь получет его через new


В моем сообщении ключевая фраза была вторая, а не та, которую ты процитировал

Представь, что в клссе есть переменная, которая в процессе работы накапливает какую-то сумму и которая интересует пользователя.
Когда пользователь пишет new он ожидает, что переменные класса будут инициализированы и даже не подумает о том, что данную переменную нужно вручную обнулить. А подсовывая ему синглтон, ты даешь ему класс, хранящий свое предыдущее состояние, в котором эта переменная может быть далека от нулевого значения.
... << RSDN@Home 1.2.0 alpha rev. 653>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.