Re[25]: Welcome to C# 9.0
От: AlexRK  
Дата: 16.09.20 19:42
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

ARK>>Было бы четкое разделение


НС>В чем профит?


Снижение когнитивной нагрузки. Видишь рекорд — все, ты сразу знаешь, что наломать с ним дров нельзя. Индус Вася не сможет туда завтра добавить мутабельное поле и у тебя где-то в глубине не сломается хеш-таблица, как в примере выше. Меньше обращаешь внимания на это.
Re[26]: Welcome to C# 9.0
От: Ночной Смотрящий Россия  
Дата: 16.09.20 19:49
Оценка:
Здравствуйте, AlexRK, Вы писали:

ARK>Снижение когнитивной нагрузки. Видишь рекорд — все, ты сразу знаешь, что наломать с ним дров нельзя.


Какой то сомнительный профит.

ARK> Индус Вася не сможет туда завтра добавить мутабельное поле и у тебя где-то в глубине не сломается хеш-таблица, как в примере выше. Меньше обращаешь внимания на это.


Если у тебя индусы-васи могут куда то чего то бездумно в твой код добавить — у тебя большие проблемы вне зависимости от свойств рекордов.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[27]: Welcome to C# 9.0
От: AlexRK  
Дата: 16.09.20 20:00
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

ARK>>Снижение когнитивной нагрузки. Видишь рекорд — все, ты сразу знаешь, что наломать с ним дров нельзя.

НС>Какой то сомнительный профит.

А какой профит от того, что мутабельность оставили?

ARK>> Индус Вася не сможет туда завтра добавить мутабельное поле и у тебя где-то в глубине не сломается хеш-таблица, как в примере выше. Меньше обращаешь внимания на это.

НС>Если у тебя индусы-васи могут куда то чего то бездумно в твой код добавить — у тебя большие проблемы вне зависимости от свойств рекордов.

Тогда и readonly поля не нужны. Ведь можно использовать обычные. Просто не пиши туда ничего лишнего.
Re[20]: Welcome to C# 9.0
От: Sinclair Россия https://github.com/evilguest/
Дата: 17.09.20 00:41
Оценка:
Здравствуйте, AlexRK, Вы писали:

ARK>Ога?

Now we're talking.
То есть вы самостоятельно добавили set, и внезапно рекорд перестал себя вести так, как ведёт, я всё правильно понял?
А то, что язык и компилятор подталкивают вас писать public record MyRecord(int Value, bool Danger) — этого недостаточно?
Так-то мы знаем, что и string — нифига не immutable.

ARK>Не понимаю, нахрена делать мутабельность? Вот что это кому дает?

Например, это позволяет мне вносить в рекорды состояние, не влияющее на эквивалентность.
public Manager {
 get 
 { 
  if (_manager == null)
  {
    _manager = DB.Instance.Managers.GetManagerById()
  }
  return _manager;
 }
}

Полный запрет изменяемости обрубил бы эту возможность.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[21]: ??=
От: Qbit86 Кипр
Дата: 17.09.20 01:05
Оценка: 37 (1)
Здравствуйте, Sinclair, Вы писали:

S>
S>public Manager {
S> get 
S> { 
S>  if (_manager == null)
S>  {
S>    _manager = DB.Instance.Managers.GetManagerById()
S>  }
S>  return _manager;
S> }
S>}
S>


C# 8.0 позволяет это записать в одну строчку:
public Manager Manager => _manager ??= DB.Instance.Managers.GetManagerById();
Глаза у меня добрые, но рубашка — смирительная!
Re[3]: Про рекорды
От: Sinclair Россия https://github.com/evilguest/
Дата: 17.09.20 05:06
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Serginio1, Вы писали:


S>>Про рекорды


IT>Что-то я не вижу, деконструктор они туда прикрутили?

Ага. Подозреваю, что можно несколько упростить код Linq.Expressions.Deconstruct.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[22]: ??=
От: Sinclair Россия https://github.com/evilguest/
Дата: 17.09.20 05:43
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>C# 8.0 позволяет это записать в одну строчку:

Q>
Q>public Manager Manager => _manager ??= DB.Instance.Managers.GetManagerById();
Q>

Спасибо, я ещё не привык
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[23]: ??=
От: Sinclair Россия https://github.com/evilguest/
Дата: 17.09.20 06:18
Оценка:
Здравствуйте, Sinclair, Вы писали:
S>Спасибо, я ещё не привык
Копец, как это вслух-то читать?
Для ?! есть название — интерробанг.
А ??= как читать? Не произносить же кажный раз "null-coalescing assignment operator"...

manager what-what-assign from deebee dot instance dot managers dot get manager by id

?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[24]: Elvis assignment
От: Qbit86 Кипр
Дата: 17.09.20 06:23
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Копец, как это вслух-то читать?

S>Не произносить же кажный раз "null-coalescing assignment operator"...

Я бы читал: «Элвис-присваивание».
Глаза у меня добрые, но рубашка — смирительная!
Re[23]: ??
От: Qbit86 Кипр
Дата: 17.09.20 06:47
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Спасибо, я ещё не привык ;)


Я тоже к такому не привык, потому что ограничен версией C# 7.3 :)

На старых версиях это обычно записывают через «??»:
public Manager Manager => _manager ?? (_manager = DB.Instance.Managers.GetManagerById());
Глаза у меня добрые, но рубашка — смирительная!
Re[24]: Welcome to C# 9.0
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 17.09.20 06:55
Оценка:
Здравствуйте, AlexRK, Вы писали:

ARK>Здравствуйте, Serginio1, Вы писали:


S>> А вот кому то она возможно и будет нужна.


ARK>Вот этого я и не могу понять. Если такая возможность нужна — почему просто не взять обычный класс? Для генерации всяких вспомогательных методов вводить в язык фичи необязательно.


ARK>Было бы четкое разделение — вот потенциально изменяемый класс, вот гарантированно неизменяемый рекорд.

Не добавляй мутабельные поля вот и все.

S>>И он будет плеваться из-за того, что такой возможности нет.


ARK>Почему тогда, скажем, анонимные классы мутабельными не сделали? Может кто-то плюется, что их нельзя поменять.

Анонимные классы без рефлексии в методах не поиспользуешь. Особого смысла нет.
и солнце б утром не вставало, когда бы не было меня
Re[25]: Welcome to C# 9.0
От: artelk  
Дата: 17.09.20 07:20
Оценка: +2
Здравствуйте, Serginio1, Вы писали:

ARK>>Было бы четкое разделение — вот потенциально изменяемый класс, вот гарантированно неизменяемый рекорд.

S> Не добавляй мутабельные поля вот и все.
Если ты и автор и пользователь рекорда, то да.
Но представь такой случай: ты используешь рекорд Foo, определенный в некоторой библиотеке. Чтобы узнать, изменяемы ли его поля или нет, тебе нужно лезть в сорцы этой библиотеки, т.к. по public contract этого не видно. Даже если в текущей версии библиотеки он неизменяем, ничто не мешает в следующей ее версии сделать некоторые поля рекорда изменяемыми. А все потому, что (не)изменяемость рекорда это деталь его реализации, никак не выраженная в его контракте.
Re[28]: Welcome to C# 9.0
От: Ночной Смотрящий Россия  
Дата: 17.09.20 07:25
Оценка: +1
Здравствуйте, AlexRK, Вы писали:

ARK>>>Снижение когнитивной нагрузки. Видишь рекорд — все, ты сразу знаешь, что наломать с ним дров нельзя.

НС>>Какой то сомнительный профит.
ARK>А какой профит от того, что мутабельность оставили?

В том что сахар будет доступен и там, где дизайн изначально мутабельный. К примеру, не все десериализаторы умеют десериализовать в конструктор, к примеру тот же ConfigurationBinder.

ARK>>> Индус Вася не сможет туда завтра добавить мутабельное поле и у тебя где-то в глубине не сломается хеш-таблица, как в примере выше. Меньше обращаешь внимания на это.

НС>>Если у тебя индусы-васи могут куда то чего то бездумно в твой код добавить — у тебя большие проблемы вне зависимости от свойств рекордов.
ARK>Тогда и readonly поля не нужны. Ведь можно использовать обычные. Просто не пиши туда ничего лишнего.

Доказательство по аналогии? Еще раз — если ты не напишешь явно, что свойство мутабельное — компилятор тебе его поменять не даст. Ровно тоже делают и readonly. Ты же предлагаешь вообще все поля безусловно сделать readonly чтобы индусы вдруг его не поменяли.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[25]: Welcome to C# 9.0
От: Ночной Смотрящий Россия  
Дата: 17.09.20 07:28
Оценка: +1 :)
Здравствуйте, Serginio1, Вы писали:

ARK>>Почему тогда, скажем, анонимные классы мутабельными не сделали? Может кто-то плюется, что их нельзя поменять.

S> Анонимные классы без рефлексии в методах не поиспользуешь.

Вот это новость.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[26]: Welcome to C# 9.0
От: Ночной Смотрящий Россия  
Дата: 17.09.20 07:28
Оценка:
Здравствуйте, artelk, Вы писали:

A>Но представь такой случай: ты используешь рекорд Foo, определенный в некоторой библиотеке. Чтобы узнать, изменяемы ли его поля или нет, тебе нужно лезть в сорцы этой библиотеки, т.к. по public contract этого не видно. Даже если в текущей версии библиотеки он неизменяем, ничто не мешает в следующей ее версии сделать некоторые поля рекорда изменяемыми.


И при чем тут рекорды? Ровно то же ты можешь получить и с классами.

A> А все потому, что (не)изменяемость рекорда это деталь его реализации,


Нет. Это деталь его публичного контракта.

A> никак не выраженная в его контракте.


Здрасте, приехали. Наличие set вместо init это контракт и есть.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[26]: Welcome to C# 9.0
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 17.09.20 07:50
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, Serginio1, Вы писали:


ARK>>>Почему тогда, скажем, анонимные классы мутабельными не сделали? Может кто-то плюется, что их нельзя поменять.

S>> Анонимные классы без рефлексии в методах не поиспользуешь.

НС>Вот это новость.

Имелось ввиду при передачи объекта анонимного класса в параметрах.
Поэтому и нет особой нужды в мутабельности
и солнце б утром не вставало, когда бы не было меня
Re[21]: Welcome to C# 9.0
От: AlexRK  
Дата: 17.09.20 08:20
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>То есть вы самостоятельно добавили set, и внезапно рекорд перестал себя вести так, как ведёт, я всё правильно понял?


Индус Вася добавил set в общий рекорд для того, чтобы ему в своем кусочке кода было удобнее.
Смотрит — вроде все работает.

Да, да, я знаю, что такого быть не может, и что вся функциональность, внешняя и внутренняя, всегда на 100% покрыта всеми возможными тестами.

S>А то, что язык и компилятор подталкивают вас писать public record MyRecord(int Value, bool Danger) — этого недостаточно?

S>Например, это позволяет мне вносить в рекорды состояние, не влияющее на эквивалентность.
S>Полный запрет изменяемости обрубил бы эту возможность.

В тех полутора местах, где такое нужно, можно просто использовать обычный класс.
Re[22]: ??=
От: AlexRK  
Дата: 17.09.20 08:21
Оценка: -3
Здравствуйте, Qbit86, Вы писали:

Q>??=


Re[29]: Welcome to C# 9.0
От: AlexRK  
Дата: 17.09.20 08:25
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

ARK>>А какой профит от того, что мутабельность оставили?

НС>В том что сахар будет доступен и там, где дизайн изначально мутабельный. К примеру, не все десериализаторы умеют десериализовать в конструктор, к примеру тот же ConfigurationBinder.

Чем плох обычный класс в таком месте?

ARK>>Тогда и readonly поля не нужны. Ведь можно использовать обычные. Просто не пиши туда ничего лишнего.

НС>Доказательство по аналогии? Еще раз — если ты не напишешь явно, что свойство мутабельное — компилятор тебе его поменять не даст. Ровно тоже делают и readonly. Ты же предлагаешь вообще все поля безусловно сделать readonly чтобы индусы вдруг его не поменяли.

readonly поле — это гарантия на уровне поля.
record мог бы быть гарантией на уровне композитного объекта с именованным доступом.

А что щас сделали, хрен знает.
Re[30]: Welcome to C# 9.0
От: Ночной Смотрящий Россия  
Дата: 17.09.20 09:29
Оценка:
Здравствуйте, AlexRK, Вы писали:

НС>>В том что сахар будет доступен и там, где дизайн изначально мутабельный. К примеру, не все десериализаторы умеют десериализовать в конструктор, к примеру тот же ConfigurationBinder.

ARK>Чем плох обычный класс в таком месте?

Тем же, чем и в любом другом месте, в котором планируется использовать рекорды.

НС>>Доказательство по аналогии? Еще раз — если ты не напишешь явно, что свойство мутабельное — компилятор тебе его поменять не даст. Ровно тоже делают и readonly. Ты же предлагаешь вообще все поля безусловно сделать readonly чтобы индусы вдруг его не поменяли.

ARK>readonly поле — это гарантия на уровне поля.
ARK>record мог бы быть гарантией на уровне композитного объекта с именованным доступом.

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

ARK>А что щас сделали, хрен знает.


Сделали удобный инструмент, позволяющий не писать кучу бойлерплейта в ряде ситуаций.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.