Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Наркоманизация namespaces. / 16 сообщений из 16, страница 1 из 1
02.05.2013, 13:16
    #38246559
scymaks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наркоманизация namespaces.
Добрый день! Так сказать паттернизированный мозг сегодня выдал вот такой код.

Бывают ли какие-либо методики подобного плана, или это нужно просто забыть и вообще больше так никогда не писать?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
#include <iostream>

namespace FirstEnvironment {
    const int f(const int x) {
        return x + x;
    }
}

namespace SecondEnvironment {
    const int f(const int x) {
        return x * x;
    }
}

namespace Environment {
    const int (*f)(const int x);

    void useFirstEnvironment() {
        Environment::f = FirstEnvironment::f;
    }

    void useSecondEnvironment() {
        Environment::f = SecondEnvironment::f;
    }
}

int main(int argc, char * argv[]) {
    Environment::useFirstEnvironment();

    std::cout << Environment::f(10) << std::endl; // 20


    Environment::useSecondEnvironment();

    std::cout << Environment::f(10) << std::endl; // 100


    return 0;
}
...
Рейтинг: 0 / 0
02.05.2013, 13:46
    #38246585
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наркоманизация namespaces.
Выкинуть и забыть
...
Рейтинг: 0 / 0
02.05.2013, 16:50
    #38246691
scymaks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наркоманизация namespaces.
Anatoly Moskovsky,

Ясно)
...
Рейтинг: 0 / 0
05.05.2013, 17:53
    #38248231
Sash_xp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наркоманизация namespaces.
Забавная техника - можно в рантайме переключать поведение задешево, не загромождая код тучей всяких if. В общем случае для этого не обязательно использовать namespace, обычно просто присваивают указатель функции. Ну и понятно, что имена функций не обязательно должны совпадать.
Я такого рода технику обычно использую при реализации автоматов, когда в зависимости от ввода переключатся функция action (простейший пример - парсер файлов).
...
Рейтинг: 0 / 0
05.05.2013, 18:18
    #38248245
Наркоманизация namespaces.
Sash_xpЗабавная техника - можно в рантайме переключать поведение задешево, не загромождая код тучей всяких if. В общем случае для этого не обязательно использовать namespace, обычно просто присваивают указатель функции. Ну и понятно, что имена функций не обязательно должны совпадать.
Я такого рода технику обычно использую при реализации автоматов, когда в зависимости от ввода переключатся функция action (простейший пример - парсер файлов).
Чем это лучше чем полиморфизм или std::function<>?
...
Рейтинг: 0 / 0
05.05.2013, 18:42
    #38248249
Sash_xp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наркоманизация namespaces.
полиморфизм или std::function?Чем это лучше чем полиморфизм или std::function<>?

std::function<> - замена указателям на функции, и это лучше, чем использовать указатели, при условии что доступен компилятор C++11.
С помощью полиморфизма можно, конечно, тот же трюк сделать - но более накладно - ненужные объекты создавать и т.п. Но опять же зависит от задачи. Бывает, что и полиморфизм удобнее.
...
Рейтинг: 0 / 0
07.05.2013, 08:44
    #38249835
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наркоманизация namespaces.
scymaks,

Ничего интересного.
Тот же указатель на функцию, он же полиморфный вызов, только все ещё замаскировано namespace.
...
Рейтинг: 0 / 0
07.05.2013, 18:51
    #38250832
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наркоманизация namespaces.
А наркоманизированный паттернизированный мозг разве был против того же поведенческого паттерна "Стратегия"?
...
Рейтинг: 0 / 0
08.05.2013, 11:12
    #38251410
scymaks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наркоманизация namespaces.
NekZ,

Так это же и есть реализация паттерна стратегия.
...
Рейтинг: 0 / 0
08.05.2013, 11:17
    #38251421
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наркоманизация namespaces.
scymaksТак это же и есть реализация паттерна стратегия.
Реализация "стратегии" не предусматривает доступа из клиентского кода через глобальные переменные к внутренностям библиотеки.
...
Рейтинг: 0 / 0
08.05.2013, 12:22
    #38251570
Эрик Гамма
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наркоманизация namespaces.
В стратегии я бы объявил поле с типом класса поведения алгоритма, плюс сеттер для изменения в рантайме
...
Рейтинг: 0 / 0
09.05.2013, 05:42
    #38252509
scymaks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наркоманизация namespaces.
Anatoly Moskovsky,

Так а кто заставляет-то лезть через глобальные переменные? Изайте Environment и всё.
...
Рейтинг: 0 / 0
09.05.2013, 10:31
    #38252551
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наркоманизация namespaces.
scymaks,

Вот ни капли это не стратегия.
Во-первых: использование процедурного подхода (ака указатели на функции) в коде C++, пытающимся инкапсулировать поведение, (как минимум!) подозрительно, в то время когда указатели на коллабельные объекты бороздят просторы адресного пространства.
Во-вторых: стратегия может содержать несколько перегружаемых поведенческих методов. Сопровождать ваш код в таком случае будет очень сложно.
В третьих: а что если понадобится хранить в экземпляре стратегии какие-либо данные? В вашем случае глобальными переменными это не решить.

P.S. А как же чудеса полиморфизма?
...
Рейтинг: 0 / 0
09.05.2013, 10:41
    #38252554
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наркоманизация namespaces.
scymaksТак а кто заставляет-то лезть через глобальные переменные? Изайте Environment и всё.
Вы про потоки, про рекурсию слышали?
Одна функция ставит одно значение в глобальной переменной, другая - другое, и обе думают что они единственные кто меняет значение.
...
Рейтинг: 0 / 0
09.05.2013, 13:45
    #38252630
scymaks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наркоманизация namespaces.
Anatoly Moskovsky,

Вот я где-то написал о том, что это можно использовать в многопоточной среде?

Ну ни слова же об этом сказанно не было.


Вот ни капли это не стратегия.
Во-первых: использование процедурного подхода (ака указатели на функции) в коде C++, пытающимся инкапсулировать поведение, (как минимум!) подозрительно, в то время когда указатели на коллабельные объекты бороздят просторы адресного пространства.
Во-вторых: стратегия может содержать несколько перегружаемых поведенческих методов. Сопровождать ваш код в таком случае будет очень сложно.
В третьих: а что если понадобится хранить в экземпляре стратегии какие-либо данные? В вашем случае глобальными переменными это не решить.

P.S. А как же чудеса полиморфизма?


Ну вот опять. Ну вы начинаете ее рассматривать с точки зрения экспертного подхода.

Я лишь привел идею, не более того.
...
Рейтинг: 0 / 0
09.05.2013, 13:58
    #38252640
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наркоманизация namespaces.
scymaksВот я где-то написал о том, что это можно использовать в многопоточной среде?

А я где то написал что эта проблема есть только в многопоточной среде?
Та же самая проблема есть почти в любой программе, в которой больше одной функции.
Именно поэтому у глобальных переменных есть четко ограниченная область применения, где без них нельзя обойтись.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Наркоманизация namespaces. / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]