Почему бы не поддержать намного более интуитивную конструкцию 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
}
Я и не говорю, что таких исследований никто не делает и не пытается. Просто это настолько многранные и многофакторные области, что чётко и достоверно их описать во всей полноте практически невозможно. Можно лишь выявлять корреляции и на их основе давать вероятностные прогнозы…
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, но почему-то в расширенных примерах кода зацепились именно за него. :) Если же вам ничего из этого списка не пришлось по вкусу, то пользуйтесь своими решениями.
Многие эти штуки я использую не только в экспериментальных целях, но и на практике, мне они облегчают работу, поэтому решил поделиться с другими людьми, вот и всё, даже никого не призываю их использовать, просто предлагаю материал, над которым как минимум можно поразмышлять и пофантазировать…
у вас больших проблем возникнуть не должно. Тут даже не мой какой-то диалект, а стандартные средства языка позволяют так делать.
Не сомневаюсь, что вы потратили время с пользой, участвуя в дискуссии, однако если вы не слишком пытались изучить «мой диалект», ограничиваясь лишь беглым поверхностным рассмотрением, то делать выводы о его ценности конкретно для вас и особенно для других людей преждевременно. Вы вполне могли упустить суть некоторых вещей.
Если же вы изучите материалы подробно, тогда сможете более объективно оценить все их стороны и решить, полезены он вам или нет. Конечно, на это нужно потратить время, есть риск разочароваться, но пока вы, глубоко не вникая, отрицаете что-то новое и непривычное, ценность и польза этих знаний конкретно для вас неопределена.
Для меня WTF-эффект — это когда встречаешь что-то новое, начинаешь с этим разбираться, и вдруг выясняется, что тут очень-очень перемудрили…
Если же при изучении всё наоборот становится на свои места, то тут нет никакого WTF-эффекта. По сути, согласно вашему определению, любой код обладает таким эффектом, например, я новичок и увидел впервые лямбды, конечно, первый вопрос, что это вообще такое? Но стоит их изучить, как сам уже применяю на практике, потому что с ними всё логично и лаконично…
Не знаю, как у других, но у меня даже 16 параметров уже покроют не меньше 98% случаев инициализаций, а оставшиеся 2% вполне можно выполнить при помощи конкатенации вызовов.
Если для вас такое ухудшение столь существенно, то можно один раз добавить ряд перегрузок метода With с достаточно большим числом параметров и пользоваться ими без склеиваний.
При аккуратном форматировании читаемость не слишком страдает
new Person().To(out var p).With(
PropA = aA,
...
PropN = aN).With(
PropM = aM,
...
PropZ = aZ).DoSomething();
Конечно же, при необходимости можно просто создать перегрузки метода With и для большего числа параметров.
Производительность можете сами проверить, как показывают мои опыты, подобные конструкции очень близки по скорости выполнения к классическим инициализационным блокам.
Спор у нас больше филосовского характера, вы стремитесь к «канонам», мне же интересны нестандартные пути и решения, даже, я бы сказал, неожиданные.
Вот вы видите впервые в коде With или ForEach с асинхронным делеготом, сразу вопрос — что это вообще такое и как оно работает? Начинаете разбираться, копаться, спорить, попутно узнаёте для себя что-то новое или вспоминаете позабытое… Разве это плохо?
И самое удивительное — всё это работает! И даже с хорошей производительностью. Да, при первой встрече такой код, возможно, окажется сюрпризом, насторожит, но когда вы его поймёте, то откроется его прелесть.
У меня нет цели писать специально под новичков, мне нравятся лямбды, дженерики, цепочные вызовы и прочие выразительные вещи, которые без определённого опыта сходу не поймёшь. Но это именно те вещи, которые заставляют думать и учиться, прививают вкус и чувство прекрасного в программировании.
Моя задача — просто делиться такими решениями с людьми, а каждый самостоятельно решит, насколько они ему подходят.
default var oбезо всякой дополнительной путаницы?Да и правостороннее присваивание хорошо подходит для такого случая
1. Try — не генерирует исключений и возвращает bool
2. Async — асинхронный
Надеюсь, теперь будет понятнее.
У класса Person может быть хоть сотня свойств и полей, но мне не нужно добавлять десятки перегрузок метода Deconstruct, я просто вывел в переменные те свойства, что мне были нужны, причём, в произвольном порядке.
Вы ведь уже видели.
А паттерн-матчинг — фича интересная, но некоторые детали реализации в C# оставляют желать лучшего. Мне вообще думается, что 'is {… }', может, и не выйдет в релиз… Поживём — увидим.
И ещё такой момент — далеко не все области хорошо поддаются исследованиям и статистическому анализу. Естественные науки — да, но психология и творчество — это во многом субъективные мнения и зачастую противоположные точки зрения. Поэтому когда вы просите меня предоставить критерии оценки красоты или исследования о закономерностях развития мышления у людей, то вы просто забываете о том факте, что существуют явления в основе своей вероятностные и малоопределённые.
Это и отичает способных учеников — неординарный подход к решению различных задач.
Во-первых, инициализация.
Во-вторых, деконструкция, которая во многих случаях более удобна, чем стандартный аналог с методами Deconstruct.
В-третьих, цепочная замена конструкций if-else при проверках на null.
И наконец, вы же не противитесь внедрению 'is {… }'? Хотя Check паттерн (родственный With) гораздо более гибкий и интуитивный.
Даже у меня в простеньком текстовом редакторе нашлось несколько мест, где With весьма органично вписался. Поэтому было бы желание — применение найдётся.
Поэтому никаких обманутых ожиданий такой код у меня не вызывает. Мне вообще не ясно, чем вам так запал в душу этот пример…
На мой взгляд, воображение и абстрактное мышление — важнейшие инструменты инженера-проектировщика. Поэтому их стоит поддерживать в тонусе даже из спортивного интереса.
Решений было предложено множество (To, With, Check, Put и другие паттерны), более того, в публикации и вовсе не шло речи про ForEach, но почему-то в расширенных примерах кода зацепились именно за него. :) Если же вам ничего из этого списка не пришлось по вкусу, то пользуйтесь своими решениями.
Многие эти штуки я использую не только в экспериментальных целях, но и на практике, мне они облегчают работу, поэтому решил поделиться с другими людьми, вот и всё, даже никого не призываю их использовать, просто предлагаю материал, над которым как минимум можно поразмышлять и пофантазировать…
у вас больших проблем возникнуть не должно. Тут даже не мой какой-то диалект, а стандартные средства языка позволяют так делать.
Не сомневаюсь, что вы потратили время с пользой, участвуя в дискуссии, однако если вы не слишком пытались изучить «мой диалект», ограничиваясь лишь беглым поверхностным рассмотрением, то делать выводы о его ценности конкретно для вас и особенно для других людей преждевременно. Вы вполне могли упустить суть некоторых вещей.
Если же вы изучите материалы подробно, тогда сможете более объективно оценить все их стороны и решить, полезены он вам или нет. Конечно, на это нужно потратить время, есть риск разочароваться, но пока вы, глубоко не вникая, отрицаете что-то новое и непривычное, ценность и польза этих знаний конкретно для вас неопределена.
Если же при изучении всё наоборот становится на свои места, то тут нет никакого WTF-эффекта. По сути, согласно вашему определению, любой код обладает таким эффектом, например, я новичок и увидел впервые лямбды, конечно, первый вопрос, что это вообще такое? Но стоит их изучить, как сам уже применяю на практике, потому что с ними всё логично и лаконично…
Конечно же, при необходимости можно просто создать перегрузки метода With и для большего числа параметров.
Производительность можете сами проверить, как показывают мои опыты, подобные конструкции очень близки по скорости выполнения к классическим инициализационным блокам.
Вот вы видите впервые в коде With или ForEach с асинхронным делеготом, сразу вопрос — что это вообще такое и как оно работает? Начинаете разбираться, копаться, спорить, попутно узнаёте для себя что-то новое или вспоминаете позабытое… Разве это плохо?
И самое удивительное — всё это работает! И даже с хорошей производительностью. Да, при первой встрече такой код, возможно, окажется сюрпризом, насторожит, но когда вы его поймёте, то откроется его прелесть.
У меня нет цели писать специально под новичков, мне нравятся лямбды, дженерики, цепочные вызовы и прочие выразительные вещи, которые без определённого опыта сходу не поймёшь. Но это именно те вещи, которые заставляют думать и учиться, прививают вкус и чувство прекрасного в программировании.
Моя задача — просто делиться такими решениями с людьми, а каждый самостоятельно решит, насколько они ему подходят.