Re[7]: Кому нужны такие фичи?
От: Ночной Смотрящий Россия  
Дата: 04.05.22 19:01
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>По ситуации.

vaa>Начнем с того, а точно нужен класс с 40 полями?
vaa>Ну и сразу же становится ясна культура сишарп разработчика.

При чем тут культура, если список полей определяется требованиями?

vaa>вместо того чтобы написать корректный конструктор,


Покажи корректный ктор на 40 полей.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[8]: Кому нужны такие фичи?
От: vaa  
Дата: 05.05.22 01:39
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

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


vaa>>По ситуации.

vaa>>Начнем с того, а точно нужен класс с 40 полями?
vaa>>Ну и сразу же становится ясна культура сишарп разработчика.

НС>При чем тут культура, если список полей определяется требованиями?

Я имел ввиду не количество полей.
Культура в том, что инициализатор объекта позволяет задавать любые значения, в том числе некорректные,
Хотя в справочнике Албахари написано, что он используется для упрощения создания объекта. И в чем же оно?
Объективно, эта техника разумна только в случае создания анонимных типов.
Именованные классы как правило используются в нескольких методах,
и тогда нормальный конструктор позволяет избавиться от дублирования кода.

vaa>>вместо того чтобы написать корректный конструктор,


НС>Покажи корректный ктор на 40 полей.


Не я придумал это сакральное число
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Кому нужны такие фичи?
От: vaa  
Дата: 05.05.22 02:06
Оценка:
Здравствуйте, vaa, Вы писали:
Всем спасибо! Фича нужная. Но злоупотреблять я бы не стал(лично).
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[9]: Кому нужны такие фичи?
От: Ночной Смотрящий Россия  
Дата: 05.05.22 07:33
Оценка: +1
Здравствуйте, vaa, Вы писали:

vaa>Культура в том, что инициализатор объекта позволяет задавать любые значения, в том числе некорректные,


Некорректность — понятие относительное. Логику проверки корректности засовывать в DTO, к примеру — скорее всего плохая идея.

НС>>Покажи корректный ктор на 40 полей.

vaa>Не я придумал это сакральное число

Но ты заявил, что все ОК если конструктор корректный.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[6]: Кому нужны такие фичи?
От: Sharov Россия  
Дата: 05.05.22 09:16
Оценка: :)
Здравствуйте, Ночной Смотрящий, Вы писали:

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


S>>
S>>db.Persons.Select(p => {
S>>var temp = new Person();
S>>temp.Name = "Alice";
S>>temp.Age = 12; 
S>>return temp;
S>>});
S>>


НС>Скомпилировать пробовал?


Что не так? Все компилируется.
  public class PersonA
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

    public class PersonB
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

    internal class Program
    {
        #region Methods

        private static void Main(string[] args)
        {
            var list = new List<PersonA>(16);
            for (int i = 0; i < 10; i++)
            {
               list.Add(new PersonA(){Age = i,Name = i.ToString()});
            }

           IEnumerable<PersonB> q = list.Select(p =>
           {
               var temp = new PersonB();
               temp.Age = p.Age;
               temp.Name = p.Name;
               return temp;
           });

        }
Кодом людям нужно помогать!
Re[7]: Кому нужны такие фичи?
От: Ночной Смотрящий Россия  
Дата: 05.05.22 12:31
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Что не так? Все компилируется.


Название переменной db тебя не на какие мысли не навело? Например на то что там не IEnumerable, а IQueryable?
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[8]: Кому нужны такие фичи?
От: Sharov Россия  
Дата: 05.05.22 12:42
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

S>>Что не так? Все компилируется.

НС>Название переменной db тебя не на какие мысли не навело? Например на то что там не IEnumerable, а IQueryable?

И что IQueryable? Ну выполнится запрос на стороне бд и вернется результат и далее преобразуем в Person, почему не будет работать?
Кодом людям нужно помогать!
Re[9]: Кому нужны такие фичи?
От: Ночной Смотрящий Россия  
Дата: 05.05.22 12:48
Оценка: 2 (1) +2
Здравствуйте, Sharov, Вы писали:

НС>>Название переменной db тебя не на какие мысли не навело? Например на то что там не IEnumerable, а IQueryable?

S>И что IQueryable? Ну выполнится запрос на стороне бд и вернется результат и далее преобразуем в Person, почему не будет работать?

Потому что не скомпилируется.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[9]: Кому нужны такие фичи?
От: fmiracle  
Дата: 05.05.22 13:03
Оценка: 2 (1)
Здравствуйте, Sharov, Вы писали:

S>>>Что не так? Все компилируется.

НС>>Название переменной db тебя не на какие мысли не навело? Например на то что там не IEnumerable, а IQueryable?
S>И что IQueryable? Ну выполнится запрос на стороне бд и вернется результат и далее преобразуем в Person, почему не будет работать?

Нет, это ломает всю идею IQueryable. Оно должно быть expression tree — это дает возможность (хотя бы теоретическую) преобразовать запрос во что-то, исполняемое на сервере.
.Select( x => new Dto{ x.Age } )

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

а если
.Select( x => { return new Dto{ x.Age }; } )

то что там происходит в лямбде — темный лес и преобразовать его ни во что нельзя, только создание на клиенте. Но тогда это уже не IQueryable по сути своей.
Потому такой синтаксис доступен только для IEnumerable.

Попробуй у себя сделать list.AsQueryable().Select( ... ) и увидишь что больше не компилируется.
Re[10]: Кому нужны такие фичи?
От: Sharov Россия  
Дата: 05.05.22 13:08
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

S>>И что IQueryable? Ну выполнится запрос на стороне бд и вернется результат и далее преобразуем в Person, почему не будет работать?

НС>Потому что не скомпилируется.

Ага, благодарю, понял. Круто, т.е. это спец. синтаксический сахар для деревьев выражений, т.е. чтобы провайдер мог сгенерировать соотв. код.
С др. стороны -- https://www.geeksforgeeks.org/object-and-collection-initializer-in-c-sharp/ (то, как я это описал).
Т.е. в случае IQueryable компилятор вообще что ли код не будет генерировать, а это будет делать соотв. провайдер (транслятор из C# в sql, например)?
Кодом людям нужно помогать!
Re[11]: Кому нужны такие фичи?
От: Ночной Смотрящий Россия  
Дата: 05.05.22 13:09
Оценка: 2 (1) +1
Здравствуйте, Sharov, Вы писали:

S>Т.е. в случае IQueryable компилятор вообще что ли код не будет генерировать, а это будет делать соотв. провайдер (транслятор из C# в sql, например)?


Да.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[10]: Кому нужны такие фичи?
От: Sharov Россия  
Дата: 05.05.22 13:10
Оценка:
Здравствуйте, fmiracle, Вы писали:

F>Попробуй у себя сделать list.AsQueryable().Select( ... ) и увидишь что больше не компилируется.


Ага, так и сделал. Выше уже отписался по этому поводу.
Кодом людям нужно помогать!
Re[10]: Кому нужны такие фичи?
От: vaa  
Дата: 05.05.22 13:36
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

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


vaa>>Культура в том, что инициализатор объекта позволяет задавать любые значения, в том числе некорректные,


НС>Некорректность — понятие относительное. Логику проверки корректности засовывать в DTO, к примеру — скорее всего плохая идея.

внутри метода, анонимные типы для выборки из orm возможно, хотя и тут вопрос,
если у вас есть сущность person типа Person, возникает вопрос зачем вам его преобразовывать еще в какое-то DTO или анонимный тип.
Тогда это не сущность никакая, а банальный Typed DataSet.

НС>>>Покажи корректный ктор на 40 полей.

vaa>>Не я придумал это сакральное число

НС>Но ты заявил, что все ОК если конструктор корректный.


Встречный вопрос: что плохого в конструкторе с 40-50-60 полями в сравнении с инициализатором объекта, кроме случая анонимного типа?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[11]: Кому нужны такие фичи?
От: Ночной Смотрящий Россия  
Дата: 05.05.22 13:46
Оценка: +1
Здравствуйте, vaa, Вы писали:

vaa>если у вас есть сущность person типа Person, возникает вопрос зачем вам его преобразовывать еще в какое-то DTO или анонимный тип.


Непонятен вопрос. Если ты нагородил rich domain model, то ты ССЗБ, вне зависимости от наличия или отсутствия конструктора. А вот если нет, то никакой отдельной специальной сущности у нас нет.

НС>>Но ты заявил, что все ОК если конструктор корректный.

vaa>Встречный вопрос: что плохого в конструкторе с 40-50-60 полями в сравнении с инициализатором объекта, кроме случая анонимного типа?

Например то, что в каждой конкретной ситцуации может понадобится сильно меньше полей.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re: Кому нужны такие фичи?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 06.05.22 08:27
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>На днях осознал, что инициализация при создании объекта

vaa>
vaa>var person = new Person
vaa>{
vaa>    Name = "Alice",
vaa>    Age = 12
vaa>};
vaa>

vaa>ничем не лучше старого способа:
vaa>
vaa>var person = new Person();
vaa>    person.Name = "Alice";
vaa>    person.Age = 12;
vaa>

vaa>код даже короче.
vaa>Может пора провести ревизию и выкинуть ненужное из шарпов?

На самом деле в первом варианте еще и подсказочки есть на не добавленные свойства.
Ну и не вижу чем короче? person то добавлять надо. Мне эта фича нравится и использую особенно когда свойств значительно больше чем 2
и солнце б утром не вставало, когда бы не было меня
Отредактировано 06.05.2022 8:37 Serginio1 . Предыдущая версия .
Re[2]: Кому нужны такие фичи?
От: vaa  
Дата: 06.05.22 11:38
Оценка:
Здравствуйте, Serginio1, Вы писали:


S> На самом деле в первом варианте еще и подсказочки есть на не добавленные свойства.

S>Ну и не вижу чем короче? person то добавлять надо. Мне эта фича нравится и использую особенно когда свойств значительно больше чем 2
в том то и дело что только подсказки.
А должна быть гарантия:
var person = new Person("Alice");
public class  Person
{
    public string Name {get; set;}
    public int Age {get; set;}
    public Person(string name, int age = 0)
    {
        Name = string.IsNullOrEmpty(name) ? throw new Exception() : name;
        Age = age < 0 ? throw new Exception() : age;
    }
}


Считаю инициализация объекта оправдана только при создании экземпляров анонимных типов.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: Кому нужны такие фичи?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 06.05.22 16:16
Оценка:
Здравствуйте, vaa, Вы писали:

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



S>> На самом деле в первом варианте еще и подсказочки есть на не добавленные свойства.

S>>Ну и не вижу чем короче? person то добавлять надо. Мне эта фича нравится и использую особенно когда свойств значительно больше чем 2
vaa>в том то и дело что только подсказки.
vaa>А должна быть гарантия:
vaa>
vaa>var person = new Person("Alice");
vaa>public class  Person
vaa>{
vaa>    public string Name {get; set;}
vaa>    public int Age {get; set;}
vaa>    public Person(string name, int age = 0)
vaa>    {
vaa>        Name = string.IsNullOrEmpty(name) ? throw new Exception() : name;
vaa>        Age = age < 0 ? throw new Exception() : age;
vaa>    }
vaa>}
vaa>


vaa>Считаю инициализация объекта оправдана только при создании экземпляров анонимных типов.

А зачем гарантия? Зачем заполнять дефолтные значения заного?
и солнце б утром не вставало, когда бы не было меня
Re[4]: Кому нужны такие фичи?
От: vaa  
Дата: 11.05.22 14:04
Оценка:
Здравствуйте, Serginio1, Вы писали:


vaa>>Считаю инициализация объекта оправдана только при создании экземпляров анонимных типов.

S> А зачем гарантия? Зачем заполнять дефолтные значения заного?

Логика программы на что-то должна опираться?
Чем городить проверки на каждом этапе, лучше разрешить только валидные значения на входе.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[5]: Кому нужны такие фичи?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.05.22 15:23
Оценка: +1
Здравствуйте, vaa, Вы писали:
S>> А зачем гарантия? Зачем заполнять дефолтные значения заного?

vaa>Логика программы на что-то должна опираться?

vaa>Чем городить проверки на каждом этапе, лучше разрешить только валидные значения на входе.
Так дефолтные вполне себе валидные. Нужно дать только те которые отличаются от дефолтных.
Так и в разного рода оборудовании итд где огромное количество параметров.
и солнце б утром не вставало, когда бы не было меня
Отредактировано 11.05.2022 15:25 Serginio1 . Предыдущая версия .
Re[3]: Кому нужны такие фичи?
От: MadHuman Россия  
Дата: 11.05.22 16:36
Оценка:
Здравствуйте, vaa, Вы писали:

ЕА>>
ЕА>>Person SomeMethod() => new() { Name = "Alice", Age = 12 };
ЕА>>

vaa>не лучший вариант, на мой взгляд.
vaa>Я бы упростил:
vaa>
vaa> SomeMethod() : Person = { Name = "Alice", Age = 12 };
vaa>

так уже можно... в F# пишите просто на фшарпе) не мучайтесь)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.