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

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

04.01.2017, 10:51. Показов 4768. Ответов 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
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.01.2017, 12:26
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от hoggy Посмотреть сообщение
не въехал в суть проблемы)
Ну хочется же пользоваться гарантией запуска деструктора при выходе из области. Тогда уже в нём и вызвать delete для спрятанного указателя. Это к тому что в конце каждого блока удалять руками - грусть.
Цитата Сообщение от hoggy Посмотреть сообщение
почему ругаемый то?
Считается, что есть проблемы с контролем времени жизни. По гуглу полно. Я тоже не особо понимаю.

Добавлено через 10 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
Ну хочется же пользоваться гарантией запуска деструктора при выходе из области. Тогда уже в нём и вызвать delete для спрятанного указателя. Это к тому что в конце каждого блока удалять руками - грусть.
нашёл тот код. Там вообще не о том.
Там перегружены () и [] у базы хранящей указатели. Для каждого типа она одна. Нужно пересмотреть на предмет того, можно ли без них обойтись. Так что поторопился я может быть.
Но всё равно интересно:
Какие свойства присущие экземпляру класса, дают синглтону право на жизнь?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.01.2017, 12:27
Цитата Сообщение от IGPIGP Посмотреть сообщение
Ну хочется же пользоваться гарантией запуска деструктора при выходе из области.
ну и в чем проблема то?
все классические модели сингелтонов спокойно деструктяццо)
Цитата Сообщение от IGPIGP Посмотреть сообщение
Считается, что есть проблемы с контролем времени жизни.
какая может быть проблема
с контролем времени жизни у статического объекта?
он живет до конца программы.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.01.2017, 12:31
Цитата Сообщение от hoggy Посмотреть сообщение
ну и в чем проблема то?
все классические модели сингелтонов спокойно деструктяццо)
деструктор не для синглтона запускается. Деструктор для каждого указателя запускается. А в деструкторе вызывается база - синглтон для управления памятью.

Не по теме:

Впрочем, в предыдущем посте я написал, что по памяти вспомнил неверною


Ну вот например:
https://habrahabr.ru/post/118368/
тут речь не о собственно синглтоне, а о шаблоне синглтон.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.01.2017, 12:54
Цитата Сообщение от IGPIGP Посмотреть сообщение
https://habrahabr.ru/post/118368/
это же бред сивой кобылы!

C++
1
2
3
4
5
6
template<typename T>
T& single()
{
    static T t;
    return t;
}
автор статьи утверждает:

Функция single возвращала нам заветный синглтон. Однако данный подход имеет изъян: в этом случае мы не контролируем время жизни объекта и он может удалиться в тот момент, когда мы хотим этим объектом воспользоваться.
дальше не читал.
автору нужно подучить с++,
а не умничать на хабре.
2
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
08.01.2017, 13:35
Цитата Сообщение от hoggy Посмотреть сообщение
вам стоит понять "истинную" природу сингелтона
Я понимаю Синглтон нужен когда надо иметь в системе не более 1 объекта определенного типа. Такова его задумка

Цитата Сообщение от hoggy Посмотреть сообщение
и понимаем: что функционально всё ровно тоже самое
Да, но не всегда такой вариант устроит. Иногда объект нужно передавать в другой метод и нужен именно get()

Цитата Сообщение от hoggy Посмотреть сообщение
то бишь тупо пачка свободных функций в каком нибудь неймспейсе
И переменные которые прикидываются полями класса )

Цитата Сообщение от hoggy Посмотреть сообщение
и у вас вообще не будет ни класса, ни объекта
А это уже не так гибко В случае с объектом можно использовать несколько реализаций для одного и того же кода, который не заметит подмены. А с функциями так не делается... Я хотел сказать, что вызов статических методов подразумевает указание конкретного типа, что создает зависимости, а классический синглтон это глобальная переменная, только и всего

Цитата Сообщение от hoggy Посмотреть сообщение
количество людей в команде
никак не влияет на нужность/ненужность используемых паттернов.
Тут пожалуй поддержу
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.01.2017, 13:42
Цитата Сообщение от sys_beginner Посмотреть сообщение
Я хотел сказать, что вызов статических методов подразумевает указание конкретного типа, что создает зависимости
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
#include <iostream>
 
 
struct singelton1
{
    static singelton1& get() { static singelton1 s; return s; }
    void work(){ std::cout <<"singelton1\n"; }
};
 
struct singelton2
{
    static singelton2& get() { static singelton2 s; return s; }
    void work(){ std::cout <<"singelton2\n"; }
};
 
void example(auto& obj)
{
    obj.work();
}
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    example( singelton1::get() );
    example( singelton2::get() );
}
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
08.01.2017, 13:59
hoggy,
Я плохо знаю С++, но насколько понимаю, функция void example(auto& obj); будет создана компилятором дважды, под каждый тип аргумента - отдельная(или я ошибаюсь?). Если прав, то уже не эффективно. В таком случае лучше передать указатель на базовый тип(например, интерфейс) и не заставлять компилятор генерировать две функции.

Ещё хочу отметить, что в таком примере отсутствует базовый тип(а он напрашивается), особенно если мы пишем библиотеку для сторонних пользователей. А когда он есть, достаточно обойтись указателем на него

Если продумывать более детально, может ещё можно выявить проблемы

Добавлено через 3 минуты
Цитата Сообщение от sys_beginner Посмотреть сообщение
Если продумывать более детально, может ещё можно выявить проблемы
Ещё проблему нашел. При отсутствии конкретного типа может возникнуть такая проблема:
Представим что есть два объекта car и rocket. у обоих есть метод run(), а некий метод вроде example принимает auto параметр, а в теле вызывается run. Если вместо машины передать ракету случайно, то начнется ядерная война, а мы всего то хотели включить машину... И компилятор об этом не сообщит, с его точки зрения все в порядке
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.01.2017, 14:06
Цитата Сообщение от sys_beginner Посмотреть сообщение
будет создана компилятором дважды, под каждый тип аргумента - отдельная(или я ошибаюсь?).
с высокой степенью вероятности, компилятор сделает inline,
и в итоговом бинаре вообще не будет никакой функции example

Цитата Сообщение от sys_beginner Посмотреть сообщение
Если прав, то уже не эффективно.
статический полиморфизм в общем случае более эффективен,
нежели динамический.

Цитата Сообщение от sys_beginner Посмотреть сообщение
Ещё хочу отметить, что в таком примере отсутствует базовый тип(а он напрашивается)
лично мне ни разу в жизни не понадобился.
и ни разу не понадобилось передавать сингелтоновый объект через аргументы функций.

Добавлено через 5 минут
Цитата Сообщение от sys_beginner Посмотреть сообщение
Если вместо машины передать ракету случайно, то начнется ядерная война
всё это легко разруливается времени компиляции.

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
#include <iostream>
 
 
struct rocket
{
    enum { eROCKET_CONTRACT };
    
    static rocket& get() { static rocket s; return s; }
    void run(){ std::cout <<"rocket\n"; }
};
 
struct car
{
    enum { eCAR_CONTRACT };
    
    static car& get() { static car s; return s; }
    void run(){ std::cout <<"car\n"; }
};
 
void example(auto& obj)
{
    using type 
        = typename std::remove_reference<decltype(obj)>::type;
    
    auto check = type::eCAR_CONTRACT;
    (void)check;
    
    obj.run();
}
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    // ok
    example( car::get() );  
    
    // error: ‘eCAR_CONTRACT’ is not a member of ‘type {aka rocket}’
    example( rocket::get() );
}
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.01.2017, 14:15
Цитата Сообщение от hoggy Посмотреть сообщение
дальше не читал.
Вот надуманный но реализуемый пример. Можно спорить, а почему не создать такой объект инстанциировав вызов функции глобально. Но сделать это можно и локально:
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
#include <iostream>
using namespace std;
void foo();
template<typename T>
T &get_single(){
static T t;
return t;
}
 
class Singl_is_me
{
    int a;
    Singl_is_me(){a=123;};
    Singl_is_me(const Singl_is_me& rhs){a=rhs.a;};
    Singl_is_me& operator=(const Singl_is_me& rhs){if(this!=&rhs){a=rhs.a;} return *this;};
public:
friend void foo();
friend Singl_is_me& get_single<Singl_is_me>();
~Singl_is_me(){cout<<"I am dead";};
};
 
void foo()
{
Singl_is_me a=get_single<Singl_is_me>();
}
 
int main(int argc, char* argv[])
{
foo();
cout<<endl;
system("pause");
return 0;
}
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
08.01.2017, 14:24
Цитата Сообщение от hoggy Посмотреть сообщение
с высокой степенью вероятности, компилятор сделает inline
Может быть, а может и нет

Цитата Сообщение от hoggy Посмотреть сообщение
статический полиморфизм в общем случае более эффективен, нежели динамический
Не знаток компиляторов, да и это скорее уже зависит от реализации компилятора, которая насколько понимаю может быть не задана стандартом. На уровне компиляторов помоему это UB.

Цитата Сообщение от hoggy Посмотреть сообщение
лично мне ни разу в жизни не понадобился.
Ну может понадобится... Базовый тип зачастую нужен для описания объекта/ов которые использует код, что бы было от чего отталкиваться при нескольких реализаций одного базового типа(интерфейса). Плюс для того, что бы избежать ситуации которую я привел в пример с машинами и ракетами. Это очень даже может понадобится, согласитесь

Цитата Сообщение от hoggy Посмотреть сообщение
и ни разу не понадобилось передавать сингелтоновый объект через аргументы функций.
Понимаю. Это зачастую и не нужно, потому что синглтон доступен глобально А это всем известная проблема

Цитата Сообщение от hoggy Посмотреть сообщение
всё это легко разруливается времени компиляции.
Да, но ваш пример не такой уж и тривиальный. Вариант рабочий, но больше похож на велосипед, которыми обычно страдают на Си имитируя недоООП другим макаром
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.01.2017, 14:49
Цитата Сообщение от IGPIGP Посмотреть сообщение
Вот надуманный но реализуемый пример.
не очевидно к чему это.

Цитата Сообщение от sys_beginner Посмотреть сообщение
Не знаток компиляторов, да и это скорее уже зависит от реализации компилятора, которая насколько понимаю может быть не задана стандартом. На уровне компиляторов помоему это UB.
какое ещё нафиг UB?
вы вообще о чем?

Цитата Сообщение от sys_beginner Посмотреть сообщение
Базовый тип зачастую нужен
да я как бы в курсе зачем он нужен,
и что такое "программирование в терминах интерфейсов"

вот нафига это нужно сингелтонам - вот это уже не очевидно.
на практике ни разу не сталкивался с такой потребностью.

Цитата Сообщение от sys_beginner Посмотреть сообщение
Плюс для того, что бы избежать ситуации которую я привел в пример с машинами и ракетами. Это очень даже может понадобится, согласитесь
конечно не соглашусь.
я вам, кстати, код привёл,
который прекрасно эту ситуацию разруливает в статике.
динамика нафиг не нужна там,
где прекрасно можно обойтись статикой.

Цитата Сообщение от sys_beginner Посмотреть сообщение
А это всем известная проблема
не может быть проблемой быть ситуация,
с которой не приходится сталкиваться на практике.

Цитата Сообщение от sys_beginner Посмотреть сообщение
Да, но ваш пример не такой уж и тривиальный.
что ж вы там такого нетривиального нашли?

Цитата Сообщение от sys_beginner Посмотреть сообщение
обычно страдают на Си
и давно в сишку шаблоны завезли?
вообще то это - классика жанра.
типично с++ паттерн. называется "контракт времени компиляции".

например, можно зафрендить любые типы классов,
которые поддерживают тот или иной контракт.
и при этом ключевое слово friend уже использовать не понадобится.
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.01.2017, 15:19
Цитата Сообщение от hoggy Посмотреть сообщение
не очевидно к чему это.
это ваше право.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
08.01.2017, 15:19
Цитата Сообщение от hoggy Посмотреть сообщение
какое ещё нафиг UB? вы вообще о чем?
Я имел ввиду, что реализация компиляторов, насколько я знаю, может быть произвольной и не всегда с уверенностью можно утверждать что под капотом сделано именно так

Цитата Сообщение от hoggy Посмотреть сообщение
вот нафига это нужно сингелтонам - вот это уже не очевидно.
Скорее хотел сказать, что синглтон использовать нежелательно Лучше dependency injection, и передавать куда что нужно, а если требуется один экземпляр тогда обертки вроде service locator очень даже спасают. В итоге получаем гибкость и один объект если это требуется

Цитата Сообщение от hoggy Посмотреть сообщение
не может быть проблемой быть ситуация, с которой не приходится сталкиваться на практике.
Тут все зависит что именно вы программируете... В зависимости от задачи и дальнейших потребностей синглтон может сильно навредить.

Цитата Сообщение от hoggy Посмотреть сообщение
типично с++ паттерн. называется "контракт времени компиляции".
Спасибо, не знал как называется Но мне лично проще поставить указатель на базовый тип, это выглядит более общепринято и без использования языкозависимых фич(раз уж мы говорим об ООП).
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.01.2017, 15:39
Цитата Сообщение от sys_beginner Посмотреть сообщение
Я имел ввиду, что реализация компиляторов
нет никакого UB.

Цитата Сообщение от sys_beginner Посмотреть сообщение
Лучше dependency injection
иногда бывают ситуации, когда он необходим.
и тогда просто нет выбора.
но во всех остальных случаях его использование
смахивает на ооп-головного мозга.

Цитата Сообщение от sys_beginner Посмотреть сообщение
В зависимости от задачи и дальнейших потребностей синглтон может сильно навредить.
приведите пример.

Цитата Сообщение от sys_beginner Посмотреть сообщение
без использования языкозависимых фич
это - плохой знак. это говорит о том,
что вы не используете всю мощь,
и выразительность своего языка программирования.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
08.01.2017, 17:30
Цитата Сообщение от hoggy Посмотреть сообщение
приведите пример.
Например, при работе с базой данных очень часто используется синглтон. Вроде бы удобно ведь так? Одного соединения в большинстве случаев бывает достаточно. Берем объект соединения и вызываем нужные методы для запросов.
Предположим что разработчик придерживается стандартного SQL и база у нас MySQL. Спустя некоторое время выясняется, что нужно обеспечить поддержку иной SQL базы, взаимодействовать с уже готовой базой по тем же правилам что и в случае MySQL(допустим, в зависимости от выбора пользователя нужно залезть в определенную базу). В случае DI, можно будет просто передать адаптер который больше подходит для запроса пользователя. А в случае синглтона придется серьезно рефакторить код
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
08.01.2017, 19:12
Я что-то краем уха помню, как некто говорил, что синглетон отличается от статических методов/модулей тем, что его (как объект) можно во-первых, инициализировать лениво - то есть, если он не потребовался в данном сеансе работы, то и не будет создаваться объект с выделением памяти, а еще его как объект можно сериализовать и передать куда-нибудь вдаль... Но в моих наколенных поделках эти преимущества оказались недостаточными, поэтому я костылил все еще хуже - на статических полях/методах.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
08.01.2017, 19:15  [ТС]
Цитата Сообщение от _Ivana Посмотреть сообщение
Я что-то краем уха помню, как некто говорил, что синглетон отличается от статических методов/модулей тем, что его (как объект) можно во-первых, инициализировать лениво
вы ошибаетесь )) как уже было сказано ранее - вы опять привязываетесь к реализации, когда синглтон это абстракция гарантирующая один объект одного типа)
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
08.01.2017, 19:16
Написать верхушку, которую сделать синглтоном, от неё унаследовать первоначальную SQL и новую требуемую.
Это несерьёзно.

Товарищи, скажите мне вот что, есть ли в контексте паттернов термин масштабируемости?
В контексте параллельного программирования есть.
В контексте паттернов такой термин есть или нет?

Если в контексте паттернов такого термина нет, то любой здешний сыр-бор выглядит и будет выглядеть, как кашу готовить открытием форточки на потолке козы.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
08.01.2017, 19:23
rikimaru2013, возможно ошибаюсь, я не знаток синглетонов, паттернов и вообще ООП. Но я веду речь о том, что если синглетон рассматривать как объект (ака экземпляр класса) - то какие преимущества он может иметь как объект перед другими способами добиться той же абстракции и функциональности.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
08.01.2017, 19:24
Цитата Сообщение от _Ivana Посмотреть сообщение
другими способами добиться той же абстракции и функциональности
Это какими же?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.01.2017, 19:24

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru