Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> так ли плох синглтон 
:(
    Опции темы
azesmcar
Дата 6.8.2009, 08:23 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Любитель @  6.8.2009,  07:10 Найти цитируемый пост)
Ну вот взять тот же логгер. Допустим у нас есть реальный Logger, с записью куда-нибудь и отсылкой нотификейшенов на e-mail и есть FakeLogger - для тестов. Работаем с логгером мы только через ILogger. Синглетон в чистом виде - явно не пойдёт. Нужна какая-то фабрика логгеров. Она же управляет временем жизни. И вообще созданием подобных объектов должны управлять DI-фреймворки smile Синглетон - это костыль. Но зачастую приемлемый. Всему своё место и место каждой вещи под солнцем smile 

По моему тут больше подойдет препроцессор #ifdef _DEBUG. Зачем нагружать программу фабрикой логеров для тестирования?
PM   Вверх
chaos
Дата 6.8.2009, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



Цитата(azesmcar @ 6.8.2009,  05:23)
Цитата(Любитель @  6.8.2009,  07:10 Найти цитируемый пост)
Ну вот взять тот же логгер. Допустим у нас есть реальный Logger, с записью куда-нибудь и отсылкой нотификейшенов на e-mail и есть FakeLogger - для тестов. Работаем с логгером мы только через ILogger. Синглетон в чистом виде - явно не пойдёт. Нужна какая-то фабрика логгеров. Она же управляет временем жизни. И вообще созданием подобных объектов должны управлять DI-фреймворки smile Синглетон - это костыль. Но зачастую приемлемый. Всему своё место и место каждой вещи под солнцем smile 

По моему тут больше подойдет препроцессор #ifdef _DEBUG. Зачем нагружать программу фабрикой логеров для тестирования?

как вариант логгер который пишет plain text, логгер который пишит в xml формате или логгер который шлет все на мыло или еще куда

Добавлено через 4 минуты и 40 секунд
Цитата(Любитель @ 6.8.2009,  04:10)
... DI-фреймворки ...

офтоп небольшой smile 
PocoCapsule например, больше не встречал готовых реализаций DI\IoC
PM WWW   Вверх
azesmcar
Дата 6.8.2009, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(chaos @  6.8.2009,  08:32 Найти цитируемый пост)
как вариант логгер который пишет plain text, логгер который пишит в xml формате или логгер который шлет все на мыло или еще куда 

Такое я бы реализовал передав ему аргумент writer какой нибудь, создать единый интерфейс для logwriter -а, наследовать от него xmlWriter, mailWriter и plainWriter например...а дальше так
Код

Logger::Instance()->write(plainWriter(), "plain text");
Logger::Instance()->write(xmlWriter(), "<xml></xml>");
...

ну или что-то наподобие этого. В коде можно будет различать случаи, когда нужно послать на мейл или вывести в log file.
PM   Вверх
Любитель
Дата 6.8.2009, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(azesmcar @  6.8.2009,  08:23 Найти цитируемый пост)
По моему тут больше подойдет препроцессор #ifdef _DEBUG. Зачем нагружать программу фабрикой логеров для тестирования? 

Почему я не имею права запускать юнит-тесты на релизе?! Ещё и пересобирать.. Не, не хочу smile

Цитата(chaos @  6.8.2009,  08:32 Найти цитируемый пост)
PocoCapsule например, больше не встречал готовых реализаций DI\IoC 

Вопрос, как таковой, не имеет отношения к С++ (точнее так - отношениее имеет, не имеет прямой привязки), так что...

Цитата(azesmcar @  6.8.2009,  08:39 Найти цитируемый пост)
Такое я бы реализовал передав ему аргумент writer какой нибудь, создать единый интерфейс для logwriter -а, наследовать от него xmlWriter, mailWriter и plainWriter например...а дальше так

1. В твоём примере полиморфизм не сработает - ты передаёшь объект по ссылке.
2. У тебя просто writer выполняет то, что я называл логгером. smile Просто лишний уровень абстракции, но проблему создания объектов (сейчас ты их создаёшь заново при каждом вызове) это не решает.

Цитата(Lazin @  6.8.2009,  07:37 Найти цитируемый пост)
ох уж эти enterprise программисты

Да-да, мы такие smile Lazin, прости, но "с волками жить - по волчьи выть", как говорится smile 


--------------------
PM MAIL ICQ Skype   Вверх
azesmcar
Дата 6.8.2009, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Любитель @  6.8.2009,  09:31 Найти цитируемый пост)
Почему я не имею права запускать юнит-тесты на релизе?! Ещё и пересобирать.. Не, не хочу smile

Я думал речь идет о простом тестировании, но название препроцессора всегда можно изменить smile 
#ifdef UNIT_TEST или как там? Компилятор что-то там определяет точно.

Цитата(Любитель @  6.8.2009,  09:31 Найти цитируемый пост)

1. В твоём примере полиморфизм не сработает - ты передаёшь объект по ссылке.

Одна поправка, константную ссылку, но что это меняет? с чего ему не работать? Полиморфизм работает как по указателю так и по ссылке. Правда я на скорую руку написал, просто идею показать..тут больше бы подошел статический полиморфизм на мой взгляд.

Код

Logger<XMLWriter>::Instance()->write(...);
Logger<PlainWriter>::Instance()->write(...);

так например.

Цитата(Любитель @  6.8.2009,  09:31 Найти цитируемый пост)
2. У тебя просто writer выполняет то, что я называл логгером. smile Просто лишний уровень абстракции, но проблему создания объектов (сейчас ты их создаёшь заново при каждом вызове) это не решает.

Ну это я для примера написал, разумеется это не идеальный код, я саму идею имел ввиду. А кстати фабрика логеров это тоже лишний уровень абстракции.

Это сообщение отредактировал(а) azesmcar - 6.8.2009, 09:41
PM   Вверх
GoldFinch
Дата 6.8.2009, 10:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



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

Добавлено @ 10:59
azesmcar, а юнит тест это
Код

 unitTest()
{
  Unit u=new Unit();
  u.do_some();
}


Это сообщение отредактировал(а) GoldFinch - 6.8.2009, 11:00
PM MAIL ICQ   Вверх
azesmcar
Дата 6.8.2009, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(GoldFinch @  6.8.2009,  10:57 Найти цитируемый пост)
azesmcar, статический полиморфизм  - он статический, а надо, чтобы в ран-тайме можно было дать объекту логгер, обычный, продвинутый, или Null-логгер.

Кто это так решил что надо? Я писал как раз о том, чтобы сделать это во время компиляции а не в рантайме, потому как не увидел смысла оставлять это на рантайм.

Цитата(GoldFinch @  6.8.2009,  10:57 Найти цитируемый пост)
фабрика - это не уровень абстракции, а вспомогательный объект\класс, не влияющий на абстракцию того что она производит
объекты же не знают как и произвели  - просто создали, создали на фабрике или клонировали

Да, но уровень абстракции нужен для работы фабрики.

Цитата(GoldFinch @  6.8.2009,  10:57 Найти цитируемый пост)
azesmcar, а юнит тест это

Я знаю что такое юнит-тест. Что ты этим хотел сказать? Студия насколько я помню при генерации шаблона юнит тестов определяет какие-то конкретные макросы, можно использовать их или же определить свой собственный в настройках проекта в конце концов.

Это сообщение отредактировал(а) azesmcar - 6.8.2009, 11:07
PM   Вверх
mes
Дата 6.8.2009, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Earnest @  6.8.2009,  05:53 Найти цитируемый пост)
я и не имею в виду, что описанные расширения продолжают быть синглетоном. 

По контексту обсуждаемого поста это не следовало. smile
Цитата(Earnest @  6.8.2009,  05:53 Найти цитируемый пост)
И потом, каноническое описание паттернов - это что евангелие новое? 

Конечно нет, но логично предположить, что обсуждение синглетона в данной теме, исходя из поста тс, ведется именно в рамках его канонического описания smile
Цитата(Earnest @  6.8.2009,  05:53 Найти цитируемый пост)
Смысл паттернов в том, чтобы дать пример логической организации кода и побудить к творчеству. smile 

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

Это сообщение отредактировал(а) mes - 6.8.2009, 12:42


--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 6.8.2009, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Цитата(azesmcar @  6.8.2009,  10:40 Найти цитируемый пост)
Logger<XMLWriter>::Instance()->write(...);

вот тут полиморфизма вообще нет.


Это сообщение отредактировал(а) GoldFinch - 6.8.2009, 12:49
PM MAIL ICQ   Вверх
azesmcar
Дата 6.8.2009, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(GoldFinch @  6.8.2009,  12:43 Найти цитируемый пост)
вот тут полиморфизма вообще нет. 

это тебе так кажется. Это статический полиморфизм.

Это сообщение отредактировал(а) azesmcar - 6.8.2009, 12:50
PM   Вверх
GoldFinch
Дата 6.8.2009, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



fixed.

Добавлено через 33 секунды
Цитата(GoldFinch @  6.8.2009,  13:43 Найти цитируемый пост)
вот тут полиморфизма вообще нет.

было бы 
typedef ... logger_t;
...
logger_t::Instance()->write(...);

был бы полиморфизм.

хотя совсем не понятно, почему не просто 
logger_t::write(...);
(то что используется вызов метода по указателю, ->write(...); могло бы использоваться для виртуального метода, но это же не тот случай)

Добавлено через 2 минуты и 59 секунд
какбэ запись
  Logger<XMLWriter>
совершенно эквивалентна
 Logger_XMLWriter

а вот
  template<typename W> Logger<W> 
это совсем другое

PM MAIL ICQ   Вверх
azesmcar
Дата 6.8.2009, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(GoldFinch @  6.8.2009,  12:49 Найти цитируемый пост)

хотя совсем не понятно, почему не просто 
logger_t::write(...);

что такое logger_t??? Куда он пишет и как дать понять куда я хочу писать? В XML Или в Plain text?

Цитата(GoldFinch @  6.8.2009,  12:49 Найти цитируемый пост)
(то что используется вызов метода по указателю, ->write(...); могло бы использоваться для виртуального метода, но это же не тот случай) 

Каким образом вызов метода по указателю связан с виртуальным методом?
Код

#include <iostream>

struct Base
{
    virtual void f() const = 0;
};

struct A : Base
{
    virtual void f() const {
        std::cout << "A::f()" << std::endl;
    }
};

struct B : Base
{
    virtual void f() const {
        std::cout << "B::f()" << std::endl;
    }
};

void foo(const Base& r)
{
    return r.f(); //вызов виртуального метода через ТОЧКУ
}

int main()
{
   foo(A());
   foo(B());
}

Но я как раз хочу сказать что динамический полиморфизм тут совершенно не нужен (ну или я не понял зачем он нужен, может у автора есть причина). 
PM   Вверх
mes
Дата 6.8.2009, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(azesmcar @  6.8.2009,  11:53 Найти цитируемый пост)
что такое logger_t??? Куда он пишет и как дать понять куда я хочу писать? В XML Или в Plain text?

это как раз и проявление статического полиморфизма. Неважно какой тип, главное чтоб он обладал нужным интерфейсом smile

Добавлено @ 13:04
Ну а вообще мне кажется, что в Вашем споре между  GoldFinch и  azesmcar, каждый спорит о своем..
Неплохо бы прояснить в чем суть то спора smile


Это сообщение отредактировал(а) mes - 6.8.2009, 13:11


--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 6.8.2009, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



ну вообще тема про синглтоны
PM MAIL ICQ   Вверх
azesmcar
Дата 6.8.2009, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(GoldFinch @  6.8.2009,  12:49 Найти цитируемый пост)
какбэ запись
  Logger<XMLWriter>
совершенно эквивалентна
 Logger_XMLWriter

а вот
  template<typename W> Logger<W> 
это совсем другое

я не понял чем мой вариант отличался от "совсем другого"?

Цитата(mes @  6.8.2009,  13:02 Найти цитируемый пост)
Ну а вообще мне кажется, что в Вашем споре между  GoldFinch и  azesmcar, каждый спорит о своем..
Неплохо бы прояснить виобще в чем суть то спора smile

Я и сам не знаю smile

PM   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0658 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.