
Denis
19.05.2017
09:56:53
Тебе надо хранить список соединений (в твоём случае он длиной 1) и всем желающим давать к нему доступ через залочивание-разлочивание
это называется "пул"

Ievgenii
19.05.2017
09:58:24
Ну я бы делал не одно...
Хотябы несколько

Google

Ievgenii
19.05.2017
09:58:38
Но все зависит от ожидаемой нагрузки

Dmitry
19.05.2017
09:59:17
мне пока как проще т.к. эти вопросы я честно плохо уже понимаю...

Ievgenii
19.05.2017
10:01:07
Тогда делай одно)))

qwerty
19.05.2017
12:00:21
А у нас нет никаких интерфейсов для структур? Надо всегда писать в шаблоне проверку на наличие определенных методов?

Ievgenii
19.05.2017
12:10:45
Юзай класс

Pavel
19.05.2017
12:11:37

Dmitry
19.05.2017
12:11:54
Пока что в один тред, но возможно что будет несколько тредов

Pavel
19.05.2017
12:15:51
Ну если в один то и синглтона впринципе достаточно, а если в несколько то только пул

Dmitry
19.05.2017
12:16:35
я так и не понял принципиальную разницу синглтона и static this
вроде же оно одно и тоже делает

Pavel
19.05.2017
12:17:17
Ну грубо говоря да
Но синглтон еще сам следит за тем чтобы база была инициализирована, и делает это если она еще не.

Dmitry
19.05.2017
12:18:00
а static this это не сможет?

Google

Pavel
19.05.2017
12:18:06
А с static this тебе надо будет где-то в начале вручную базу инициализировать, и это может затеряться среди другого кода, или ты потом случайно удалишь и т.д.
Ну это же просто общая переменная. Она ничего не может контролировать, она только хранит значение в себе.
В больших программах это может стать проблемой, когда у тебя все затерялось в тысячах строк кода. Для этого и есть ООП и синглтоны - выделяешь базу в изолированную единицу-класс и в нем реализуешь нужное тебе поведение.
И тогда из какого-бы модуля из своих сотен ты не обратился к базе, этот класс сам проконтролирует что все подсоединено нормально и только в единственном экземпляре.
Пул делает то же самое - он сам в себе контролирует, что никто не взял уже используемое соединение и что в очереди еще есть свободные.

Ievgenii
19.05.2017
12:28:16
Лучше сразу делать Пул
Пусть из одного соединения, но пул
Потом меньше переделовать нужно будет

Pavel
19.05.2017
12:29:11
Вообще да, пул с одним соединением внешне почти ничем не отличается от синглтона :)
твой код в любом случае будет дергать метод ->getConnection() который будет возвращать в класс свободное рабочее подключение.

Oleg
19.05.2017
14:21:00

Ievgenii
19.05.2017
16:15:03
В чем выигрыш или профит структур перед классами?

qwerty
19.05.2017
16:19:19
по rvalue быстро передаются
на самом деле не только это
не надо держать ничего лишнего, а каждый класс по умолчанию наследуется от object
по умолчанию объект структуры алоцируется в стеке

Pavel
19.05.2017
16:22:26

qwerty
19.05.2017
16:22:53
но объекты класса тоже можно алоцировать в стеке
через scope

Pavel
19.05.2017
16:22:58
Я тестил на моей проксе, тоже хотел сначала классы использовать. Но классы работают на пару порядков медленнее чем структуры.

Google

Pavel
19.05.2017
16:23:37
Кстати аллоцировать их на стеке я не пробовал, интересная тема. В этом случае gc особо и не требуется?

qwerty
19.05.2017
16:24:51
получается, что так

Pavel
19.05.2017
16:28:23
Читал это, но советы спорные если судить о картине в целом
Reason #3: If you have a type with a lot of data members, then you're probably going to want a reference type (to avoid expensive copying),
Тут как бы намекают что reference type должен быть эффективнее при использовании, но как я убедился на опыте, на деле обычные классы аллоцируются в куче и собираются мусоркой, из-за чего работают в 100 раз медленнее.

qwerty
19.05.2017
16:30:43
согласен, сомнительный довод

Oleg
19.05.2017
16:32:06
классы и структуры идеологически разделены: классы это ООП, структуры это просто данные

Pavel
19.05.2017
16:32:53
Вообще если класс создать на стеке, думаю это самый крутой вариант. Потому что так-то классы гораздо удобнее структур.

Oleg
19.05.2017
16:33:10
классы медленней структур
любой метод в классе виртуальный, любой метод в структуре финальный

Oleg
19.05.2017
16:33:43
виртуальный метод -> поиск в таблице
имхо практически всегда можно явно определить нужен ли класс или структура

Pavel
19.05.2017
16:38:27
Вот в моем случае у socks5 протоколоа есть несколько пакетов, с помощью которых устанавливается соединение. При этом каждый пакет имеет первый байт 0x05, и должен контролировать целостность этого поля. И еще есть всего пара правил по чтению этого пакета из сокета. Было бы удобно засунуть всю эту логику в базовый класс а все пакеты отнаследовать от него. Но из-за лагов пришлось делать для каждого пакета структуру, и копипастить туда логику чтения и проверки.
Немного спасли миксины.

Oleg
19.05.2017
16:54:45
тут вопрос производительности

Pavel
19.05.2017
16:55:17
Ну вот и стоит выбор производительность vs удобство кода
С другой стороны, на каждое соединение таких пакетов создается всего 5-6 штук, это в принципе не смертельно. прокся изначально не рассчитана чтобы десятки тысяч коннектов держать.

Oleg
19.05.2017
17:04:20
про выделение памяти на стеке: scope вроде deprecated

Google

Oleg
19.05.2017
17:04:36
allocator как-нибудь для этого надо юзать теперь по стилю

qwerty
19.05.2017
17:05:03
https://wiki.dlang.org/Memory_Management#Allocating_Class_Instances_On_The_Stack
да, написано, что планируется удалить
пишут использовать scoped

Oleg
19.05.2017
17:10:25
https://dlang.org/deprecate.html#scope%20for%20allocating%20classes%20on%20the%20stack

qwerty
19.05.2017
17:11:11
да, да
и там же написано использовать scoped

Oleg
19.05.2017
17:12:09
на самом деле не совсем понял почему они из языка это в библиотеку убрали

Admin
ERROR: S client not available

Oleg
19.05.2017
17:12:20
ну пока не убрали, но хотят вроде убрать
типа слишком много на scope повешано (можно как атрибут аргумента функции, можно для guard statement, можно классы на стеке)?

qwerty
19.05.2017
17:17:27
можем стукнуть на форум)
типа
ахренели)

Denis
20.05.2017
03:33:40
Не, классы на стеке глюкавыми были
норовили копироваться

qwerty
21.05.2017
11:01:12
новый cfte движок уже в dmd или нет?

Oleg
21.05.2017
11:57:09
Как я понимаю он в мастере, если ошибаюсь поправьте

Dmitry
22.05.2017
08:49:11

Denis
22.05.2017
08:49:41
Да. И это не фигня, это очень полезно

Google

Dmitry
22.05.2017
08:50:12
к примеру?
ведь это по большей части для программиста как я понимаю делается, чтобы он не забыл и не стал что-то там менять

Александр
22.05.2017
09:08:14
тогда и private - фигня
*сарказм*

Dmitry
22.05.2017
09:09:41
я просто реальный кейс никак не могу себе представить

Александр
22.05.2017
09:10:55
когда ты пишешь const, ты подписываешь некое соглашение между тобой и компилятором
мол ты обязуешься не менять значение, а он обязуется проверять это
а если const в аргументах - это обещание функции не менять значение (если по ссылке передано)
с модификаторами доступа аналогично
хотя мне лень придумывать пример

Dmitry
22.05.2017
09:14:38
короче это сугубо для программиста?
ну и мифическая оптимизация компилятора

Александр
22.05.2017
09:14:57
да. но компилятору это даёт невероятные возможности для оптимизации
даже в C++ компилятор может нехило оптимизировать с const, а уж в D подавно

Denis
22.05.2017
09:15:22

qwerty
22.05.2017
15:03:53
делать проверку на наличие методов стоит в объявлении шаблонов?
void mod(T)(T a)
if (hasMember!(T, "len"))
{
writeln(a.len);
}
просто при наличии поля и без проверки, комплилятор все равно компилирует код

Andrey
22.05.2017
15:06:26
а смысл? ошибка компиляции будет при обращении к несуществующему методу

Oleg
22.05.2017
15:06:46
void mod(T)(T a)
if (is(typeof(a.foo(int.init, string.init)))
{
a.foo(5, "hello");
}

qwerty
22.05.2017
15:07:01
эмм

Denis
22.05.2017
15:07:35
Иногда можно делать, чтобы показать пользователю шаблона чего в него передавать вообще