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

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

Код: 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
Наркоманизация namespaces.
    #38246585
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выкинуть и забыть
...
Рейтинг: 0 / 0
Наркоманизация namespaces.
    #38246691
scymaks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

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

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

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

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

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

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

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

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

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


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

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


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

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

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


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