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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Dependency Injection, маловато инфы в рунете 
:(
    Опции темы
Леопольд
Дата 13.8.2010, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 10
Всего: 13



Цитата(SABROG @  13.8.2010,  19:52 Найти цитируемый пост)
К счатью работа в этом направлении ведется и с новым стандартом мы получим полноценный набор атомарных методов. 
Когда ещё это будет...


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mes
Дата 13.8.2010, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(SABROG @  13.8.2010,  18:52 Найти цитируемый пост)
На данном этапе этот язык совершенно не подготовлен к конкурентному программированию

 smile smile


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


pattern`щик
****


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

Репутация: 49
Всего: 110



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

Цитата(SABROG @  13.8.2010,  19:52 Найти цитируемый пост)
Следом идет другая проблема - когерентность кеша. У каждого ядра/процессора своя копия данных памяти в кеше и когда один поток меняет данные (устанавливает указатель, инициализирует члены класса), то нужно об этом сообщать другим потокам, иначе у них останутся "старые" данные.

в с++0х есть способы борьбы.

Цитата(SABROG @  13.8.2010,  19:52 Найти цитируемый пост)
Стандартных механизмов сделать это в C++ нет.

угу.

Цитата(SABROG @  13.8.2010,  19:52 Найти цитируемый пост)
На данном этапе этот язык совершенно не подготовлен к конкурентному программированию.

угу.
смотрите Go
Цитата(SABROG @  13.8.2010,  19:52 Найти цитируемый пост)
К счатью работа в этом направлении ведется и с новым стандартом мы получим полноценный набор атомарных методов.

угу. а вы только краски сгущаете. не забывайте о том, в каких годах, и для какого оборудования разрабатывался с++.

Это сообщение отредактировал(а) boostcoder - 14.8.2010, 00:27
PM WWW   Вверх
SABROG
Дата 14.8.2010, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

Репутация: 4
Всего: 91



Цитата(boostcoder @  14.8.2010,  00:25 Найти цитируемый пост)
вы, похоже, пытаетесь всех загрузить?  smile 

Нет, просто объяснил свою позицию насчет синглтонов. Думаете мне хотелось вдаваться в детали проблемы? Это всего лишь ответы на ваши вопросы.

Цитата(boostcoder @  14.8.2010,  00:25 Найти цитируемый пост)
т.к. сложность на реализацию "правильного", переплевывает все адекватные времячасовые расходы.

Я думаю это тот случай, когда достаточно один раз сделать правильно и использовать в последующих проектах.

Цитата(boostcoder @  14.8.2010,  00:25 Найти цитируемый пост)
в с++0х есть способы борьбы.

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

Цитата(boostcoder @  14.8.2010,  00:25 Найти цитируемый пост)
угу. а вы только краски сгущаете. не забывайте о том, в каких годах, и для какого оборудования разрабатывался с++.

Самое смешное в том, что за последние 20 лет вышло такое количество разных языков программирования, где многих недостатков C++ просто нет. Когда у меня на компьютере по нескольку раз в неделю обновляется виртуальная машина Java я вижу насколько быстро этот язык развивается. Я не вижну какой-то активности по этому поводу со стороны разработчиков C++. А они вообще есть? Есть люди, которые пишут инструкцию (стандарт), а есть те, кто на основе неё пишет компилятор (ms, gcc, intel), и каждый делает это по своему разумению, да так, что производительность, устойчивость, переносимость программ с одним и тем же исходным кодом - разная.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Леопольд
Дата 14.8.2010, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 10
Всего: 13



Цитата(SABROG @  14.8.2010,  08:24 Найти цитируемый пост)
Когда у меня на компьютере по нескольку раз в неделю обновляется виртуальная машина Java я вижу насколько быстро этот язык развивается.
Может это они баги правят.... smile


Это сообщение отредактировал(а) Леопольд - 14.8.2010, 09:08


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
SABROG
Дата 14.8.2010, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

Репутация: 4
Всего: 91



Почитал, что предложил JackYF, вроде тоже вариант не плохой. Как насчет такой реализации?

Код

class ISettings;
class ISettings
{
public:
    typedef QSharedPointer<ISettings> Ptr;
    ...
    virtual bool load() = 0;
    virtual bool save() = 0;
    virtual QVariant value(const QString& name) = 0;
};

class Settings : public ISettings
{
public:
    ...
    virtual bool load()
    {
        QFile file("settings.ini");
        ...
    }
    
    virtual QVariant value(const QString& name)
    {
        return data[name].value();
    }
};

class IDownloadManager
{
public:
    typedef QSharedPointer<IDownloadManager> Ptr;
    ...
    virtual bool connectToServer(const QString& host, const QString& port) = 0;
}

class DownloadManager : IDownloadManager
{
    ...
public:
    explicit DownloadManager(ISettings::Ptr settings) : m_settings(settings)
    {
    }

    ISettings::Ptr settings() const {return m_settings;}

    virtual bool connectToServer(const QString& host, const QString& port)
    {
        ...
    }

    void foo()
    {
        ...
        connectToServer(settings()->value("host").toString(), 
                        settings()->value("port").toString());
    }

private:
    ISettings::Ptr m_settings;
};

int main(int argc, char* argv[])
{
    ISettings::Ptr settings = ISettings::Ptr(new Settings);
    IDownloadManager::Ptr downloadManager 
                = IDownloadManager::Ptr(new DownloadManager(settings));
    ...
    return 0;
}



Конечно банальная передача указателя через конструктор, в дальнейшем пойдет через метод settings() по цепочке во внутренние объекты.
Плюсы в том, что умный указатель следит за жизнью объекта, его валидность почти всегда можно проверить. Класс ISettings позволяет разбить зависимость между двумя классами таким образом, что классы можно будет тестировать по отдельности не говоря о том, что можно подсовывать разные реализации этих настроек, например если они отличаются методом хранения (файл, база данных, сеть).

Это сообщение отредактировал(а) SABROG - 14.8.2010, 14:47


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
boostcoder
Дата 14.8.2010, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



ИМХО, операторы new в main() лишние. и смартпоинтер в этом случае не нужен.
PM WWW   Вверх
SABROG
Дата 14.8.2010, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

Репутация: 4
Всего: 91



Цитата(boostcoder @  14.8.2010,  14:38 Найти цитируемый пост)
ИМХО, операторы new в main() лишние. и смартпоинтер в этом случае не нужен. 

Как бы предполагается, что эта реализация может работать не только в main(), но и в каком нибудь MainWindow. Без new смарт поинтеры вроде как работать не могут. Все-таки удалять в деструкторе локальную переменную через delete - чревато.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
boostcoder
Дата 14.8.2010, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(SABROG @  14.8.2010,  14:41 Найти цитируемый пост)
Без new смарт поинтеры вроде как работать не могут. Все-таки удалять в деструкторе локальную переменную через delete - чревато.

смешно.
я лишь хотел сказать, что невижу необходимости, создавать эти объекты при помощи new. они легко могут быть автоматическими переменными, даже членами класса.

Это сообщение отредактировал(а) boostcoder - 14.8.2010, 15:25
PM WWW   Вверх
SABROG
Дата 14.8.2010, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

Репутация: 4
Всего: 91



Цитата(boostcoder @  14.8.2010,  15:09 Найти цитируемый пост)
они легко могут быть автоматическими переменными

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


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
boostcoder
Дата 14.8.2010, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(SABROG @  14.8.2010,  15:31 Найти цитируемый пост)
Ситуации разные бывают

да. но вашим кодом, вы обязываете пользователя использовать new.
PM WWW   Вверх
SABROG
Дата 14.8.2010, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

Репутация: 4
Всего: 91



Цитата(boostcoder @  14.8.2010,  15:54 Найти цитируемый пост)
да. но вашим кодом, вы обязываете пользователя использовать new.


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


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
SABROG
Дата 16.8.2010, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

Репутация: 4
Всего: 91



В общем как обычно, с этими интерфейсами больше проблем.

Код

class IDownloadManager
{
public:
    typedef QSharedPointer<IDownloadManager> Ptr;
    virtual ~IDownloadManager() {}
};
...
class DownloadManager : public QObject, public IDownloadManager
{
    Q_OBJECT
public:
    explicit DownloadManager(QObject *parent = 0);

signals:

public slots:

};


Далее в коде нужно передавать указатель типа QObject во внутренние классы Qt. И тут возникает проблема downcast'инга от класса интерфейса да DownloadManager'a. В общем каждая собачка - зверушка, но не каждая зверушка - собачка. Наследовать интерфейсы от QObject'a тоже как-то не хочется, как-то это не легковесно.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 17.8.2010, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(SABROG @  16.8.2010,  16:42 Найти цитируемый пост)
 передавать указатель типа QObject во внутренние классы Qt

Цитата(SABROG @  16.8.2010,  16:42 Найти цитируемый пост)
от класса интерфейса 

все зависит от того, что должен выражать интерфейс.. 




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


Hacker
****


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

Репутация: 4
Всего: 91



Цитата(mes @  17.8.2010,  09:58 Найти цитируемый пост)
все зависит от того, что должен выражать интерфейс.. 

Да я и сам не знаю smile Хотелось реализовать вариант dependency injection в противовес одиночке. Пока получаю один геморрой. Уже неделю не могу начать писать хоть что-то, всё архитектуру придумываю и каждый раз её приходиться заново переписывать.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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