Обновить
58

Пользователь

51
Подписчики
Отправить сообщение
Если вам не по душе императивное программирование, зачем вы издеваетесь над императивным языком?

Только лишь приспасабливаю язык под свои индивидуальные нужды, а заодно исследую нестандартные сценарии использования базовых конструкций.
Конечно, например, как вы забыли о существовании холодных тасков.

Но ведь это не делает человека глупее или некомпетентнее, хотя формально вы могли завалить тест по C# из-за этого вопроса… Важно понимание сути самой темы. Задача оценивающего — выяснить, насколько близко подобрался к этому экзаменуемый.
Тому ученику, который расчитал бы площадь треугольника классическим способом, я бы поставил пять. Тому, кто двумя способами, пять с плюсом…

Если бы попался человек, который умеет расчитываеть площадь треугольников интегрированием, но не знает классического, то я бы получше присмотрелся к нему и задал бы ряд уточняющих вопросов…
Вы как себе представляете исследование на тему фантазирования?

Собрали дошколят и говорят: «Дети! Мы будем проводить исследование по влиянию фантазирования на развитие вашего мышления! Теперь вы должны фантазировать строго по нашему расписанию на определённые темы на проятяжении пятнадцати лет, а попутно мы будем проводить разные-разные тесты… Для убедительности одну подгруппу мы ограничим в фантазировании, а другую будем стимулировать к этому… и т. д. и т. п.»

Или, может, сделать опросник для взрослых людей?
Как часто вы фантазированли в возрасте до пяти лет? До десяти?.. В какие игры играли? В какие кружки ходили? Сколько времени уделяли этим занятим? Какие книжки прочитали? Какие мультики посмотрели и по сколько раз? С кем дружили? Как часто гуляли?..

Или лучше возьмём близнецов, которых разлучили в детстве! Гениально! Изучим вляние среды на развитие близнецов…

Вот только даже в генетике, где всё чуть более детерменировано, чем в психическом развитии, исследования близнецов выявили ряд корреляций, оказашихся в последствии ошибочными… У Роберта Сапольского есть интересная лекция, где затронута тема исследования близнецов.

Как бы там ни было, для объективного исследования и детального прослеживания закономерностей настолько комплексных и фундаментальных явлений, как фантазирование и развитие мышления, на текущем этапе развития человечества невозможно воссоздать необходимые «чистые» условия. И вообще, хороший вопрос, возможно ли такое в принципе?..

Максимум, что сейчас нам доступно — это поиск очевиднейших корреляций, например, что набор определённых мутаций в генах серьёзно повышает риск возникновения дименции в старости или такие-то гены, ответсвенные за развитие речевых центров отличают нас от других приматов.

Вы же меня просите о невыполнимой вещи, предоставить вам ссылки на исследования, которых не существует. Современная формализованная наука только-только начинает соприкасаться с такими вещами. Другое дело — житейский опыт. Если с ребёнком достаточно заниматься, учить его, развивать, играть, стимулировать фантазию, то всё это способствует развитию его мышления! Да, не факт, что из ребёнка вырастет выдающийся учёный, но тенденции к тому, что человек будет образованный и развитый, намного больше.
Тот, кто сможет верно рассчитать интегрированием площать прямоугольного треугольника, как минимум, уже разбирается в основах интегрирования. И, уж наверняка, сможет подсчитать площадь треугольника классическим способом.
Меньше кода, меньше оверхеда, лучше читается, никакого WTF. Деконструкция здесь просто не нужна.
Вы, похоже, не уловили сути. Деконструкция и инициализация с With позволяют выводить, объявлять и обновлять значения где угодно в цепочных вызовах без кардинальной смены структуры кода.
string _newName = "abc";

bool UpdateData(Person p) => p.With(
    p.Name.To(out var oldName),
    p.Name = _newName)
)
.Use(() => Debug.WriteLine($"Name changed  from {oldName} to {_newName}"))
.TrySave();

Например, тут присутствует временный дебажный вывод, который может быть легко удалён без смены структуры кода.
string _newName = "abc";

bool UpdateData(Person p) => p.With(
    p.Name = _newName)
)
.TrySave();


(o, e) =>
{
if (App.Current.MainWindow is Window w)
w.Title = «x»;
};

With для того мне и нужен, чтобы избежать скобок и конструкций вида if-else, вы же предлагаете мне вернуться к старому варианту, который всегда был мне не по душе. И да, я хочу использовать вывод типов без всяких хаков, а не указывать их явно как Window w.
Это смотря с чем сравнивать. Ну да, F# мне нравится больше. Но F# имеет свои занятные особенности (и с вашей манерой писать совместим, кстати, исключительно плохо).

Активно не использую F#, но реализация паттерн-матчинга там чище, чем в C#. Хотя и он меня вполне устраивает, особенно с кастомными To-With-Is-Check.
Почему бы не поддержать намного более интуитивную конструкцию default var o безо всякой дополнительной путаницы?

switch (GetPoint())
{
  case Point p:
    // вызывается только когда GetPoint вернул Point
  default var o:
    // вызывается во всех остальных случаях, и нам нужно значение GetPoint
}


Да и правостороннее присваивание хорошо подходит для такого случая

//switch (GetPoint() to var o)
switch (GetPoint().To(out var o))
{
  case Point p:
    // вызывается только когда GetPoint вернул Point
  default:
    // можем использовать значение из GetPoint
}


Решил сделать так: перименовал интерфейсные методы по принципу TryLoadAsync

1. Try — не генерирует исключений и возвращает bool
2. Async — асинхронный

Надеюсь, теперь будет понятнее.
Я и не говорю, что таких исследований никто не делает и не пытается. Просто это настолько многранные и многофакторные области, что чётко и достоверно их описать во всей полноте практически невозможно. Можно лишь выявлять корреляции и на их основе давать вероятностные прогнозы…
Образование у меня техническое. Опыт преподования есть, но небольшой.
Продемонстрируйте.

GetPerson().To(out var p).With(
    p.Name.To(out var name),
    p.Age.To(out var age)
)./* use of 'name' and 'age' */

У класса Person может быть хоть сотня свойств и полей, но мне не нужно добавлять десятки перегрузок метода Deconstruct, я просто вывел в переменные те свойства, что мне были нужны, причём, в произвольном порядке.

… и как вы для этого используете With?

Вы ведь уже видели.
(o, e) =>
App.Current.MainWindow.To(out var w)?.With(w.Title = "x");


А паттерн-матчинг — фича интересная, но некоторые детали реализации в C# оставляют желать лучшего. Мне вообще думается, что 'is {… }', может, и не выйдет в релиз… Поживём — увидим.
Мой жизненный опыт подтверждает это.

И ещё такой момент — далеко не все области хорошо поддаются исследованиям и статистическому анализу. Естественные науки — да, но психология и творчество — это во многом субъективные мнения и зачастую противоположные точки зрения. Поэтому когда вы просите меня предоставить критерии оценки красоты или исследования о закономерностях развития мышления у людей, то вы просто забываете о том факте, что существуют явления в основе своей вероятностные и малоопределённые.
Детям не дают заданий «придумайте необычный способ решения»

Это и отичает способных учеников — неординарный подход к решению различных задач.
Таких сценариев достаточно.

Во-первых, инициализация.

Во-вторых, деконструкция, которая во многих случаях более удобна, чем стандартный аналог с методами Deconstruct.

В-третьих, цепочная замена конструкций if-else при проверках на null.

И наконец, вы же не противитесь внедрению 'is {… }'? Хотя Check паттерн (родственный With) гораздо более гибкий и интуитивный.

Даже у меня в простеньком текстовом редакторе нашлось несколько мест, где With весьма органично вписался. Поэтому было бы желание — применение найдётся.
У меня нет цели кого-то в чём-то переубедить, но… может, я знаю таски и хуже вашего, однако в конкретном случае их поведение меня полностью устраивает и соответствует даже интуитивному пониманию. Да, когда я впервые воспользовался такой конструкцией, некоторые вопросы были, но когда поразмыслил над ней и перепроверил, то всё стало на свои места.

Поэтому никаких обманутых ожиданий такой код у меня не вызывает. Мне вообще не ясно, чем вам так запал в душу этот пример…
Фантазирование развивает мышление, а от мышления зависит эффективность и качество выполняемой работы. Зачем дети в школе и студенты постоянно решают задачи, казалось бы, лишённые практического значения?

На мой взгляд, воображение и абстрактное мышление — важнейшие инструменты инженера-проектировщика. Поэтому их стоит поддерживать в тонусе даже из спортивного интереса.
Ради бога используйте, никого не призываю переходить полностью на With, сам пользуюсь инициализационными блоками, просто есть сценарии, где они уже неприменимы, зато уместен With.
Многие достоинства, что сам вижу, уже выделил в статье и комментариях, выслушал и проанализировал критику. Возможно, просто стоит чуть повнимательнее пробежаться по тексту публикации, чтобы акцентировать на них внимание.

Решений было предложено множество (To, With, Check, Put и другие паттерны), более того, в публикации и вовсе не шло речи про ForEach, но почему-то в расширенных примерах кода зацепились именно за него. :) Если же вам ничего из этого списка не пришлось по вкусу, то пользуйтесь своими решениями.

Многие эти штуки я использую не только в экспериментальных целях, но и на практике, мне они облегчают работу, поэтому решил поделиться с другими людьми, вот и всё, даже никого не призываю их использовать, просто предлагаю материал, над которым как минимум можно поразмышлять и пофантазировать…
Если вы изучили таски достаточно глубоко, то со стандартными конструкциями вида
items.ToList().ForEach(async i =>
    await DoSomething(i));

items.ToList().ForEach(async i =>
{
    try { await DoSomething(i); }
    catch (Exception e) { Debug.WriteLine(e); }
});

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

Не сомневаюсь, что вы потратили время с пользой, участвуя в дискуссии, однако если вы не слишком пытались изучить «мой диалект», ограничиваясь лишь беглым поверхностным рассмотрением, то делать выводы о его ценности конкретно для вас и особенно для других людей преждевременно. Вы вполне могли упустить суть некоторых вещей.

Если же вы изучите материалы подробно, тогда сможете более объективно оценить все их стороны и решить, полезены он вам или нет. Конечно, на это нужно потратить время, есть риск разочароваться, но пока вы, глубоко не вникая, отрицаете что-то новое и непривычное, ценность и польза этих знаний конкретно для вас неопределена.
Для меня WTF-эффект — это когда встречаешь что-то новое, начинаешь с этим разбираться, и вдруг выясняется, что тут очень-очень перемудрили…

Если же при изучении всё наоборот становится на свои места, то тут нет никакого WTF-эффекта. По сути, согласно вашему определению, любой код обладает таким эффектом, например, я новичок и увидел впервые лямбды, конечно, первый вопрос, что это вообще такое? Но стоит их изучить, как сам уже применяю на практике, потому что с ними всё логично и лаконично…

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность