@dlangru

Страница 175 из 719
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
static this() это аналог синглтона будет? или в чем разница его и ... ?
А у тебя многотредовое приложение или какое?

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() который будет возвращать в класс свободное рабочее подключение.

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

qwerty
19.05.2017
16:19:19
по rvalue быстро передаются

на самом деле не только это

не надо держать ничего лишнего, а каждый класс по умолчанию наследуется от object

по умолчанию объект структуры алоцируется в стеке

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
получается, что так

В чем выигрыш или профит структур перед классами?
http://stackoverflow.com/questions/10965577/usage-preference-between-a-struct-and-a-class-in-d-language ответ по теме

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
Const позволяет меняться значению выше его передачи в список аргументов функции, immutable вообще не меняется, хоть в ПЗУ прошивай
Только что перечитал доку в десятый раз и вдумчиво. Получается const это просто для того, чтобы подсказать компилятору, чтобы он ругался если внутри функции значение переменной поменяется. Верно? Т.е. в остальном смысла нет.

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
короче это сугубо для программиста?
тут всё для программиста. если готов этим манкировать переходи смело на brainfuck )

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
Иногда можно делать, чтобы показать пользователю шаблона чего в него передавать вообще

Страница 175 из 719