Re[8]: и ещё про рекорды..
От: MadHuman Россия  
Дата: 16.09.20 16:03
Оценка:
Здравствуйте, Sinclair, Вы писали:

MH>>Рекорды это дальнейшее развитие идеи туплов, когда вместо позиционной идентификации элементов переходят на именованную.

S>Имхо, это всё же другая идея, хоть и похожая на туплы.
наверно я не четко сформулировал мысль, попробую по другому — рекорды это другой (или ещё один) способ создания композиционного типа данных. туплы — композиция за счет позиций элементов, рекорды — композиция за счет назначения элементу имени.
Такой взгляд на них безусловно существует, особенно в ФП. Другой вопрос, что выбрали за базу в C# и почему местами отошли от этой базовой идеи такого вида композирования.


S>На всякий случай напомню, что в туплах с именованной идентификацией всё в порядке.

да, но со следующими оговорками, она там больше для удобства и присутствует в рамках скоупа.
при передаче такого тупла за рамки скоупа — теряется, и в самом объекте на уровне типов не присутствует, то есть за скоупом тупл останется туплом.
да и внутри скоупа тоже.


S>Сейчас у нас есть понятная логика — никакие два разноимённых рекорда не являются одинаковыми, независимо от того, являются ли их типы отнаследованными друг от друга или случайно совпадающими.

S>Это позволяет писать более-менее надёжный код.
S>Потому что иначе у нас возникают всякие потенциальные грабли, типа

S>
S>public record Person(name);
S>public record Student: Person; // тут мы ничего не добавляем
S>public record Teacher: Person; // и тут мы ничего не добавляем

S>public static bool IsSame(Person p1, Person p2)
S>{
S>  return p1.Equals(p2);
S>}

S>var s = new Student("John");
S>var t = new Teacher("John");

S>Console.WriteLine(IsSame(t, s)); // false
S>

S>В структурно-эквивалентном мире p, s, и t — неразличимы, т.к. у них одинаковая структура.
это смотря как интерпертировать тип рекорда, если как — неявный (или явный) мембер Type рекорда, то структура хоть и одинаковая — значения за счет разного типа будут разные.
всё норм, граблей нет.
повторюсь — в явно типизированных рекордах, я согласен что считать их разными это ок (именно за счет поля Type).


S>Повторю вопрос: чем возврат анонимного рекорда будет лучше возврата анонимного класса?

S>Рекорды лучше классов в том, что они позволяют писать меньше бойлерплейта для их описания. В анонимных классах бойлерплейта нету вовсе, поэтому мы ничего не сэкономим.
S>С точки зрения взаимодействия с остальным кодом, рекорды нам ничего не дадут. Вот мы написали
S>
S>var list = from p in db.People select new {p.Name, p.Age};
S>

S>list у нас теперь IQueryable<Something>.
S>Чем вам поможет то, что Something является анонимным рекордом, а не анонимным классом?
например тем, что получив аналогичный рекорд от другого квери/джсона/функции, я могу их просто естественным образом сравнивать.
если явно задефайненные рекорды разных типов можно считать разными (т.к. есть информация что тип то разный), то в анонимном рекорде — нет, нет информации что они представляют разные сущности.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.