Daniel
именно поэтому я думаю, что отдельные константные поля в структурах не нужны
Daniel
и поэтому я думаю, что константный возврат не нужен
саша
инкрементирую последний 2 коммента Подольского
саша
а вот константные указатели нужны
Roman
вот собственно почему нужны иммутабельные поля https://github.com/romshark/Go-2-Proposal---Immutability/pull/3#discussion_r214764431
Daniel
я почитал бегло, и понял, что я не спорить хочу, а обсудить :)
Daniel
так вот
Александр
/start@daysandbox_bot
Daniel
мне кажется, что моификатор const должен относиться к созданию сущности (инициализации и передаче параметров), а не к хранению
Daniel
хочешь константное поле - инициализируй его константным выражением, и оно будет константное
Daniel
хочешь константный возврат - возвращай константное выражение
Roman
мне кажется, что моификатор const должен относиться к созданию сущности (инициализации и передаче параметров), а не к хранению
const защищает от мутаций. Если мы знаем что UniqueObject.Identifier не должен меняться в течении всей жизни объекта - мы хотим предовтратить возможные скрытые мутации этого поля в контексте пакета и приватных методов без const полей херово будет, это я вам точно говорю
Daniel
ну вот это вопрос открытый
Roman
ну вот это вопрос открытый
я к тому, что если представить себе относительно большой пакет, над которым работает community, то незаметная мутация приватных полей - может прокотить в каком-нибудь pull request'е, потому-что reviewer'ы всего-лишь люди и могут ошибиться однако если поле const, тогда никто, никогда, нигде не сможет его перезаписать случайно, в этом смысл, полная безопасность
.
Вообще, как имутабельность реализована в расте?
Roman
Ну это такая себе проблема.
такая или секая - неважно, это проблема. Так раз мы уже заговорили об иммутабельности, почему тогда не реализовать иммутабельные поля? Я лично вижу только плюсы к безопасности. Вас никто не заставляет делать их иммутабельными, но если таки вы хотите написать безопасный код - у вас есть на то возможность.
саша
Вообще, как имутабельность реализована в расте?
Очень удобно. Объявляешь переменную, а она уже иммутабельная, ничего дополнительного писать не надо.
Daniel
да вот нет
Daniel
с++ - очень плохой пример для подражания
.
Ну да, во время компиляции проверяется
А с мутабельными переменными также? То есть для всех переменных проверяется можно ли их менять на этапе компиляции?
.
Так а что мешает сделать также в Го?
.
Зачем все эти ужасы с конст везде?
Roman
Так а что мешает сделать также в Го?
обратная совместимость, всё по умолчанию иммутабельным не сделаешь, надо язык менять ломая весь существующий код
.
Так зачем все по умолчанию делать имутабельным
.
Оставляем как есть
саша
Зачем все эти ужасы с конст везде?
Ну так компилятору же надо как-то дать информацию о том, что мутабельно, а что нет
Dorian
как есть?
Ложкой
.
Ну так компилятору же надо как-то дать информацию о том, что мутабельно, а что нет
Ну будет у нас ключевое слово для имутабельных переменных
.
Как в Расте для мутабельных
саша
Так зачем все по умолчанию делать имутабельным
Да незачем, так можно делать только изначально при создании языка.
Dorian
Что-то в последнее время тут стало много споров и меньше полезной инфы к сожалению
.
Оставим Конст, окей
.
Зачем все эти конст в параметрах функций?
Dorian
Чтобы никто не изменил то, что вы передали
Daniel
Зачем все эти конст в параметрах функций?
чтобы без const оно продолжало работать как работает сейчас
Dorian
Хотя я видимо из контекста вырвал, простите
саша
Это ж основная фича
Только там конст должен быть модификатором указателя. В любом случае данные переданные не по указателю ты не изменишь.
саша
А если изменишь, то не страшно.
Daniel
да разве
Daniel
а вот я по значению слайс передал
Daniel
или структуру с указателем внутри
Daniel
Что ты несёшь...
ну - он не сам, он отцов цитирует
Алексей
а вот Pawel пришёл, как я и предвидел
Daniel
и это правда, вообще-то
саша
Что ты несёшь...
Этот вопрос мне хочется задать тебе в ответ на каждое твое сообщение.
Daniel
и это правда, вообще-то
вернее - правда про источник и вранье про go
Roman
Только там конст должен быть модификатором указателя. В любом случае данные переданные не по указателю ты не изменишь.
какие недостатки повлечёт за собой рассмотрение const *Object как иммутабельный указатель на иммутабельный объект?
Daniel
никаких
Daniel
коллеги, ну нет необходимости на кажлую провокацию вестись
Daniel
а вот насчет ООП это правда. хер ведь усвоишь, в какое состояние приходит твой объект при вызове метода, и в каком состоянии он находился перед ним. идея была в том, что нам и не надо будет это усваивать. но - не выстрелило
Roman
никаких
хммм, чёт я как бывалый C++'щик не совсем уверен
Алексей
Ну как бы это вполне классический бэк, когда бОльшая часть общих данных лежит в базе и вся забота по синхронизации ложиться на СУБД и транзакции
Daniel
вернее - высрелило и в цель, и в ногу
Co(n)stantine👨‍🔬
Roman
из плюсов в го, чего так?)
попиши web API на C++, поймёшь
Co(n)stantine👨‍🔬
😄
Roman
кому нибудь приходит в голову в каких ситуациях может быть полезным хранение иммутабельного указателя на мутабельный объект?
саша
кому нибудь приходит в голову в каких ситуациях может быть полезным хранение иммутабельного указателя на мутабельный объект?
Мне приходят в голову примеры с векторами, деревьями, графами и прочими структурами, которые полностью заменять не надо, но надо изменять в процессе.
саша
Но векторов в го нет, ибо они не ложатся на гошную модель работы с памятью.
саша
С графами и деревьями думаю то же самое.
Roman
1. immut * to mut Object: const * Object 2. mut * to immut Object: * const Object 3. immut * to immut Object: const * const Object честно говоря не хочется в Go внедрять подобные конструкции
саша
Но векторов в го нет, ибо они не ложатся на гошную модель работы с памятью.
И тут я вспоминаю почему GC в принципе плохо ложится на императивное программирование.
Roman
func C1(o const *Object) { o.Mutate() o = nil // Compile-time error } func C2(o *const Object) { o.Mutate() // Compile-time error o = nil } func C3(o const *const Object) { o.Mutate() // Compile-time error o = nil // Compile-time error }
Roman
короче я пока-что опишу это с 3 вариациями, но помечу как спорный момент и над ним ещё предспоит вывести решение
Pawel
из плюсов в го, чего так?)
И правда - чего? Конпиляет полчаса, сообщения об ошибках конпиляции на 10к экранов, сверх сложный, сверх запутанный... самое оно