Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826

Масштабирование системы при использовании паттерна Singleton

04.01.2017, 10:51. Показов 4531. Ответов 85
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, как доказать или опровергнуть, что архитектура теряет гибкость и расширяемость при активном использовании паттерна Singleton.
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.01.2017, 10:51
Ответы с готовыми решениями:

Насчёт шаблонного паттерна SingleTon
Есть код паттерна template<class T> class Singleton { private: static T* ptr; protected: Singleton();

Необходима альтернатива при использовании Proxy паттерна
Здравствуйте, возникла проблема, которую я так и не придумал, как рационально решить. В общем, задача состояла в том, чтобы отследить...

Реализация паттерна Singleton
Добрый день. Необходимо реализовать класс Storage, объект которого будет единственным в программе. Для достижения данной цели было выбрано...

85
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
04.01.2017, 11:44
А почему считается, что теряет? Есть же как минимум DeletableSingleton, а так же Singleton с определенной продолжительностью жизни, если речь идёт о статике. У Александреску всё об этом расписано.

Не по теме:

Жаль, что я ещё не дошёл, а то бы пояснил тут. :D

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
04.01.2017, 19:25
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
как доказать или опровергнуть, что архитектура теряет гибкость и расширяемость при активном использовании паттерна Singleton.
никак.
гибкость и расширяемость никак не зависит от факта использования паттернов.
3
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
04.01.2017, 20:22  [ТС]
hoggy, с разумного я мог объяснить:
1) что синглтон подразумевает, что имя класса от которого вызывается Foo::GetInstance тянется по всем файлам, и любые правки в header'e синглтона, в том числе его имени приведут к изменениям во многих файлах
2) так, что синглтон как правило это не полиморфные методы и использовать все прелести фразы "один интерфейс - множестве реализаций" для строки Foo::GetInstance().print(); - не особо уместно
3) ну и тот факт, что если вместо Printer::getInstance()->print(data); - мы решили перейти на SuperPuperPrinter - правки не ограничатся "в одном месте", а если правок больше чем в одном месте, то даже по Макконнеллу это называется "гавнокод"

Как я понимаю всё не верно, и я сравнивал зелёное с тёплым?

Добавлено через 4 минуты
И опять же таки - разве паттерн фабрика не делает систему гибкой к изменениям в той части системы, что покрывает данный паттерн?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
04.01.2017, 21:06
Лучший ответ Сообщение было отмечено rikimaru2013 как решение

Решение

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
1) что синглтон подразумевает, что имя класса от которого вызывается Foo::GetInstance тянется по всем файлам, и любые правки в header'e синглтона, в том числе его имени приведут к изменениям во многих файлах
это ортогонально самому паттерну.
ровно тоже самое можно сказать абсолютно про любой хедер.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
2) так, что синглтон как правило это не полиморфные методы и использовать все прелести фразы "один интерфейс - множестве реализаций" для строки Foo::GetInstance().print(); - не особо уместно
от задачи, от реализации зависит.
сингелтоны вполне себе дружат в полиморфизмом.
была бы потребность и желание.

например:

C++
1
2
3
4
5
6
7
8
9
10
11
12
void sample()
{
     // всякая фигня
 
    log.pushPrinter<customPrinter>();  //<--- локальная настройка глобального объекта
 
    log << "hello!";  //<--- используем кастомный принтер
 
    log.popPrinter(); //<--- глобальный объект в исходное состояние
 
     // всякая фигня
}
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
ну и тот факт, что если вместо Printer::getInstance()->print(data); - мы решили перейти на SuperPuperPrinter - правки не ограничатся "в одном месте", а если правок больше чем в одном месте, то даже по Макконнеллу это называется "гавнокод"
опять таки, все зависит от реализации.

C++
1
2
3
4
5
// где нибудь в мейне
Printer::getInstance().setMethod<SuperPuper>();
...
 
Printer::getInstance()->print(data); //<--- клиентский код без изменений
ну или вот, более реалистичный пример,
редирект std::cout в строку:

C++
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#pragma once
 
//------------------------------------------------------------------------------------------------------//
 
#ifndef _STRING_
    #error #include <string> first
#endif
 
#ifndef _IOSTREAM_
    #error #include <iostream> first
#endif
 
#ifndef _SSTREAM_
    #error #include <sstream> first
#endif
 
//------------------------------------------------------------------------------------------------------//
 
struct cout_redirectA
{
    ~cout_redirectA() { this->off(); }
 
    cout_redirectA(std::streambuf& new_buffer): m_old(){ this->on(new_buffer); }
    cout_redirectA(): m_old() { this->on(); }
 
    void off() 
    { 
        if(!m_old)
            return;
 
        assert(std::cout);
        std::cout.flush();
        std::cout.rdbuf(m_old); 
        m_old = nullptr;
        assert(std::cout);
        assert(!m_old);
    }
    
    void on() { this->on( *get().rdbuf() ); }
 
    void on(std::streambuf& new_buffer) 
    { 
        assert(std::cout);
        std::cout.flush();
        m_old = std::cout.rdbuf(&new_buffer); 
        assert(std::cout);
        assert(m_old);
    }
 
    static std::string captureA()
    {
        assert(std::cout);
        std::stringstream ss;
        ss << std::cout.rdbuf();
        std::cout.flush();
        assert(std::cout);
        return ss.str();
    }
private:
    std::stringstream& get()
    {
        static std::stringstream ss;
        return ss;
    }
    std::streambuf* m_old;
};
 
//------------------------------------------------------------------------------------------------------//
 
struct cout_redirectW
{
    ~cout_redirectW() { this->off(); }
 
    cout_redirectW(std::wstreambuf& new_buffer): m_old() { this->on(new_buffer); }
    cout_redirectW(): m_old() { this->on(); }
 
    void off() 
    { 
        if(!m_old)
            return;
 
        assert(std::wcout);
        std::wcout.rdbuf(m_old); 
        m_old = nullptr;
        assert(std::wcout);
        assert(!m_old);
    }
    
    void on() { this->on( *get().rdbuf() ); }
 
    void on(std::wstreambuf& new_buffer) 
    { 
        assert(std::wcout);
        std::wcout.flush();
        m_old = std::wcout.rdbuf(&new_buffer); 
        assert(std::wcout);
        assert(m_old);
    }
 
    static std::wstring captureW()
    {
        assert(std::wcout);
        std::wstringstream ss;
        ss << std::wcout.rdbuf();
        std::wcout.flush();
        assert(std::wcout);
        return ss.str();
    }
private:
    std::wstringstream& get()
    {
        static std::wstringstream ss;
        return ss;
    }
    std::wstreambuf* m_old;
};
 
//------------------------------------------------------------------------------------------------------//
 
struct cout_redirect: cout_redirectA, cout_redirectW
{
    cout_redirect()
        :cout_redirectA()
        ,cout_redirectW()
    {}
 
    cout_redirect(std::streambuf& new_buffer)
        :cout_redirectA(new_buffer)
        ,cout_redirectW()
    {}
 
    cout_redirect(std::wstreambuf& new_buffer)
        :cout_redirectA()
        ,cout_redirectW(new_buffer)
    {}
 
    operator std::string()const  { return cout_redirectA::captureA(); }
    operator std::wstring()const { return cout_redirectW::captureW(); }
    void off()
    {
        cout_redirectA::off();
        cout_redirectW::off();
    }
    void on() 
    {  
        cout_redirectA::on();
        cout_redirectW::on();
    }
    using::cout_redirectA::on;
    using::cout_redirectW::on;
};
 
//------------------------------------------------------------------------------------------------------//
 
 
TEST(CASENAME_, TNUM_(sample, 005))
{
    // --- stress-test
 
    cout_redirect redirect;
    std::wcout << L"ololo\ntrololo\n";
    std::wstring captured = redirect;
    redirect.off();
    
    std::wcout <<L"captured: '"<< captured << L"'\n";
    ASSERT_TRUE(captured == L"ololo\ntrololo\n");
 
    redirect.on();
    std::wcout << L"ololo\ntrololo\n";
    std::wstring wcaptured = redirect;
    redirect.off();
    
    std::wcout <<L"captured: '"<< wcaptured << L"'\n";
    ASSERT_TRUE(wcaptured == L"ololo\ntrololo\n");
 
    redirect.on();
    std::cout << "ololo\ntrololo\n";
    std::string captured2 = redirect;
    redirect.off();
    
    std::cout <<"captured: '"<< captured2 << "'\n";
    ASSERT_TRUE(captured2 == "ololo\ntrololo\n");
}
вообще сингелтон, как паттерн - это просто способ гарантировать,
что объект будет создан в единственном экземпляре.
собственно на этом всё.
а уж что там за механизм,
какой у него будет дизайн - это зависит от конкретной задачи.
как захотите, так и сделаете.
нужна гибкость - да пожалуйста.
никто как бы не мешает.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
И опять же таки - разве паттерн фабрика не делает систему гибкой к изменениям в той части системы, что покрывает данный паттерн?
ну не совсем.
задача фабрики - инкапсулировать от клиентов
принцип инициализации объектов-конкретной-реализации.
и таким образом реализуется идеома "закрыт для изменений, открыт для расширений".
однако говорить о каких то изменениях не вполне уместно.
потому что с точки зрения клиентов ничего не изменилось.
2
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
04.01.2017, 21:24  [ТС]
hoggy, да пожалуй, я вовсе забыл, что паттерны это уровень абстракции, и является лишь направлением в решении частой проблемы в программировании. Пользователь сам решает конкретную реализацию для его архитектуры.
0
04.01.2017, 21:36

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
TEST(CASENAME_, TNUM_(sample, 005))
А что это за макрос? Не буст ли?

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
04.01.2017, 22:31
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
я вовсе забыл, что паттерны это уровень абстракции, и является лишь направлением в решении частой проблемы в программировании. Пользователь сам решает конкретную реализацию для его архитектуры.
ага))
Цитата Сообщение от GbaLog- Посмотреть сообщение
А что это за макрос? Не буст ли?
Google Test
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
05.01.2017, 22:17
На самом деле это я спросил у rikimaru2013 и у gru74ik.
Я не хотел создавать тему. Я знаю о некотором их интересе к ООП, думал, что мой маленький барьер темы не стоит, но, оказалось, простой вопрос спровоцировал сомнения.

Вот они и решили, что всё-таки правильно темку создать.
У меня есть тема в разделе ООП Паттерны. Нужны небольшие пояснения.

====================
Что я могу сказать? Тут в большей части всё упирается в многопоточность, насколько я вижу. Кодов я этих приведённых понять сейчас не смогу, также я не особо могу понять зачем упираться в код, когда паттерн синглтон - это только-лишь вид задачи. Я представлял себе, что можно объяснить проблему недостатка синглтона на модели современных объектов мира. Так, я у Рикамару спрашивал, сможет ли он мне привести пример на модели светофор, где светофор - изначально синглтон.
Сможет ли кто-нибудь придумать такой пример на простом светофоре, где светофор описан синглтоном, но какие-то потребности (какие потребности?) и - облом, оказалось, что синглтон оказался помехой, пришлось переписывать систему.
Сначала был только один светофор, и ничто не предвещало беды.

Меня в последнее время трудно люди понимают, но, буду надеяться, что эту мысль сформулировал я достаточно ясно.
2
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
06.01.2017, 00:00
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

Цитата Сообщение от GbaLog- Посмотреть сообщение
если речь идёт о статике
В том то и дело, что статика это очень скользкая дорожка.

Цитата Сообщение от daslex Посмотреть сообщение
Сначала был только один светофор, и ничто не предвещало беды.
И когда случалась авария на этом перекрестке у этого светофора, "добрые дяди" писали в акте "на светофоре", но потом поставили еще один светофор, "добрые дяди" переписали всю историю аварий на "светофоре 1", и оставили управление светофорами одинаковое (т.е. переключаются они одновременно). // Т.е. появилось еще одно использование сингелтона, все нормально, для этого он и затевался.

Потом светофоров стало 10 и они всё еще переключаются одновременно, это жителям не понравилось, "добрые дяди" сказали, да будут дороги в нашем городе свободны и сделали кастомизацию для светофоров, по примеру hoggy, (т.е. сингелтон стал теперь у нас "недо шаблоном Состояние", но идеологически подходит).

Шли годы, город рос, светофоров стало слишком много и захотели жители сделать светофоры зависимыми друг от друга, ну там светофор для пешеходов который стоит в 50 метрах от перекрестка, который включают пешеходы руками, а последующий светофор не изменяет своё состояние и в результате на перекрестке никто не едет( на зеленом никого нет, а на красный ехать нини), тоска и боль одолевала жителей и тогда пришли они, самые настоящие костыли:
Вариант 1 : Объекты кастомизирующие светофоры сделать сингелтонами, ну пока такой перекресток 1, жить можно, если прошедшие годы в городе вас ничему не научили
Вариант 2 : Запаковать все эти кастомизации в сингелтон и построить в нём еще одно параллельное архитектурное дерево. // И иногда это даже хорошо выглядит, ведь нам не нужно в районах знать о светофорах ( предполагаемая структура : город->район->улица->перекресток) и мы можем не тянуть их через все сущности, хотя тут не все так гладко, инициализация уже будет не такой прозрачной, но это малость.
Вариант 3 : Выпилить сингелтон и создать светофоры там где они нужны и протянуть "ссылки" туда где они нужны.

Самая большая проблема сингелтонов : Нет ничего более постоянного чем временное - это невозможно понять, это нужно запомнить, либо потом будет(хорошо, хорошо, может случиться так) Будь проклят тот день когда я сел за баранку этого пылесоса

Всех с праздниками, сингелтонов маленьких всем побольше, а больших поменьше.
4
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
06.01.2017, 00:04
daslex, я боюсь написать тривиальную глупость, но не настолько чтобы этого и не сделать.
Я немного сталкивался с этим паттерном и для себя решил, что он должен решать только те задачи, которые без него не получается решить простым способом. Он похож на статический член, если говорить о видимости класса и на глобальную переменную, если говорить о области видимости программы. Вот пример, - статический член, - корень дерева. Можно обойтись? Конечно. Но тогда корень надо включить в класс который будет использовать ноды и работать через этот класс. Или передавать в конструкторе каждого нода указатель на корень как параметр. Б-р-р. И так и так сложнее, чем сделать корень статическим членом. Но простота статического члена оборачивается невозможностью создать два и более дерева с разными корнями, то есть разных дерева.
О глобальных переменных вряд ли имеет смысл говорить. Если это константа, да ещё прикрытая пространством имён, то это удобно. Иначе и пространство имён засоряется и появляются переменные, которые неизвестно кто и когда изменяет.
А снглтон вполне подходит как соблазн организовать через него взаимодействие. Создать флаг "который будут менять те кому это надо" и наблюдать "те кому это интересно", например. Тут и ломается модульность, которая требует, чтобы сигналы шли от тех, кто их порождает к тем, кому они адресованы. Без глобальных переменных то есть.
Но соблазны, это не причина придавать анафеме. У каждого есть своя голова на плечах. Это главный сиглтон. Потому как две говорят, - неустойчивое количество. Обычно их нечётное число, как говорил один Горыныч.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.01.2017, 16:50
Цитата Сообщение от Nosey Посмотреть сообщение
Потом светофоров стало 10
тему не читал. но вам не нужен сингелтон
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
06.01.2017, 17:31
hoggy, кому не нужен: мне или Nosey?
Если что, это у него мой придуманный синглтон множится.

У меня есть просто светофор, который сначала моргает двумя фарами, потом тремя, потом он уже настраивается на контингент: пешеход или водитель, - водителю моргает фарами, пешеходам информативно что-то пишет. ПО светофора потихоньку расширяется. Напрашивается вывод, что система масштабируется.

Я как-то вообще склонен думать, что если что-то завязать на синглтон, то ничего хорошего не будет, он же один - жди очереди, а вот если наоборот, то ничего плохого случиться не должно. Мне представляется, что один синглтон может выступать в роли достаточно хорошего распределителя.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
06.01.2017, 17:34
rikimaru2013,
Проблема синглтона в том что в коде проявляется зависимость от конкретного типа
Так же это фактически глобальная переменная
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.01.2017, 18:17
Цитата Сообщение от daslex Посмотреть сообщение
кому не нужен: мне или Nosey?
ему.


Цитата Сообщение от daslex Посмотреть сообщение
Я как-то вообще склонен думать, что если что-то завязать на синглтон, то ничего хорошего не будет, он же один - жди очереди, а вот если наоборот, то ничего плохого случиться не должно.
и вам.

Добавлено через 51 секунду
Цитата Сообщение от sys_beginner Посмотреть сообщение
Проблема синглтона в том что в коде проявляется зависимость от конкретного типа
это зависит от реализации.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
06.01.2017, 18:47
То, что я склонен как-то думать - это не значит, что я в чём-то определён.
То, что я склонен так думать - это следствие развития темы.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
06.01.2017, 19:04
Цитата Сообщение от hoggy Посмотреть сообщение
это зависит от реализации.
конкретный_тип::getInstance() это всегда зависимость от конкретного типа
другое дело если реализовать обертку которая один раз создает объект а при последующих вызовах его возвращает
но это уже не совсем синглтон

Добавлено через 5 минут
ещё есть вариант где то внутри фабрики конкретного типа вызывать синглтон и передавать его создаваемому объекту
если вызывать его в клиентском коде то зависимость достаточно существенная
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
06.01.2017, 19:33
Цитата Сообщение от hoggy Посмотреть сообщение
тему не читал. но вам не нужен сингелтон
Читал, но да, вам не нужен сингелтон. особенно не нужен если понятие "Вам" включает работу >10 человек.
hoggy, Если вы намекаете на ваш "редирект std::cout в строку", то ну что, отличный хеллоу ворд, чё

Цитата Сообщение от daslex Посмотреть сообщение
У меня есть просто светофор, который сначала моргает двумя фарами, потом тремя, потом он уже настраивается на контингент: пешеход или водитель, - водителю моргает фарами, пешеходам информативно что-то пишет. ПО светофора потихоньку расширяется. Напрашивается вывод, что система масштабируется.
Конечно, если сущность не надо множить, то сингелтон для этого и придуман, быть одним, и его потенциальная высокая внутренняя сложность при усиленном масштабировании никак не зависит от того сингелтон это или нет. При усиленном масштабировании затрагивающем интерфейс сингелтона, может измениться идеология использования этого интерфейса, что потребует некоторых усилий от других разработчиков для его понимания.
Но это всё пальцем по воде, если сингелтон будет один, но гарантировать в случае разработки живого проекта его единственность - никто не может.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
06.01.2017, 22:23
Цитата Сообщение от daslex Посмотреть сообщение
Я как-то вообще склонен думать, что если что-то завязать на синглтон, то ничего хорошего не будет, он же один - жди очереди,
А если главной проблемой оказывается не перекрытая возможность создать второй экземпляр? А такой объект как std::cout разве навевает грусть? Как по мне, - забавный зверёк. И на своём месте.
Правда это глобальный объект, но похоже ведь?
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
07.01.2017, 00:02
Странно звучит слово "придуман". Он как бы всегда существовал и однажды начал быть нужным.
Я с cout не понимаю. Будьте добры, внесите немного конкретики.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.01.2017, 00:02
Помогаю со студенческими работами здесь

Может ли потребоваться применение механизма событий при использовании паттерна MVVM?
Паттерн MVVM провозглашён как базовый паттерн для приложений WPF. В паттерне MVVM используется механизм команд. То есть, если...

Настройка системы при использовании SSD
Здравствуйте. Хотелось бы знать, нужно ли настраивать систему при использовании SSD.

Постоянно прохожу проверку CAPTCHA при использовании поисковой системы
Доброго времени суток. Проблема следующая: при поиске в гугле или яндексе эти поисковые системы постоянно запрашивают пройти проверку...

Collections: singleton/singletonList/singletonMap. Что значит слово singleton?
Заметил, что в классе Collections (утилитный класс) имеются методы для оборачивания элемента в set/list/map Все эти методы содержат в...

Установка "лимита" на значение решения системы ОДУ при использовании решателя ode45
Добрый день. Есть такая задачка: при решении системы дифференциальных уравнений, пусть одно из решений имеет величину, условно говоря, с 1...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru