Re[28]: Новости C#12
От: IT Россия linq2db.com
Дата: 22.11.23 15:47
Оценка:
Здравствуйте, ·, Вы писали:

·>Не-не. Не путай цели и средства. Цель АОП — описывать аспекты кода. Т.е. задаём аспект "Вызов методов в слое DAO должен оборачиваться в DB-транзацкцию, для 'Load*' транзакция должна быть RO, для 'Save*' — RW". Теперь кто бы ни позвал Save или Load метод любого класса DAO — транзакция будет открыта и закрыта, с нужными пермишеннами.


Да-да. В рамках моего солюшена это всё будет работать как надо. Не сомневайся.

·>Ок... Могу согласится, что это заработает на небольшом одномодульном проекте,


Я тебя умоляю...

·>без единой 3rd party зависимости (включая стандартную библиотеку Платформы).


Т.е. ты всё таки хочешь АОП для перехвата кода из стандартных библиотек?
Если нам не помогут, то мы тоже никого не пощадим.
Re[29]: Новости C#12
От: · Великобритания  
Дата: 22.11.23 15:51
Оценка:
Здравствуйте, IT, Вы писали:

IT>·>Не-не. Не путай цели и средства. Цель АОП — описывать аспекты кода. Т.е. задаём аспект "Вызов методов в слое DAO должен оборачиваться в DB-транзацкцию, для 'Load*' транзакция должна быть RO, для 'Save*' — RW". Теперь кто бы ни позвал Save или Load метод любого класса DAO — транзакция будет открыта и закрыта, с нужными пермишеннами.

IT>Да-да. В рамках моего солюшена это всё будет работать как надо. Не сомневайся.
Удаление гланд же, через же.

IT>·>без единой 3rd party зависимости (включая стандартную библиотеку Платформы).

IT>Т.е. ты всё таки хочешь АОП для перехвата кода из стандартных библиотек?
Я же тебе всё на пальцах показал. Вот для этого:
public void PrintColours(List<Colour> colours)
{
    Logger.Info("You chose {colours}", colours); // и что здесь подменять?!
}
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[25]: Новости C#12
От: · Великобритания  
Дата: 22.11.23 15:55
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

S>·>... но это бесполезный пример, игрушечный. Да и вообще, ведь это твой код, проще сразу писать Console.WriteLine("You chose " + colour.ToStringFast()), зачем эта вся котовасия вообще неясно.

S>Ну так он и пишет — что надо не забыть использовать ToStringFast вместо ToString. Его пример должен, по идее, починить забывчивость.
Так не чинится же, ну никак. Ведь в реальности такой код не пишут, будет Console.WriteLine("You chose " + colour).

Даже хуже. Тот же Reshaper будет выдавать warning, что "You chose " + colour.ToString() надо упростить до "You chose " + colour
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[30]: Новости C#12
От: IT Россия linq2db.com
Дата: 22.11.23 16:37
Оценка:
Здравствуйте, ·, Вы писали:

·>Удаление гланд же, через же.


В принципе, да. Такие маленкие гландочки, немножко через жопку.

IT>>·>без единой 3rd party зависимости (включая стандартную библиотеку Платформы).

IT>>Т.е. ты всё таки хочешь АОП для перехвата кода из стандартных библиотек?
·>Я же тебе всё на пальцах показал. Вот для этого:

т.е. от выше выделенного ты отказываешься?
Если нам не помогут, то мы тоже никого не пощадим.
Re[31]: Новости C#12
От: · Великобритания  
Дата: 22.11.23 16:54
Оценка:
Здравствуйте, IT, Вы писали:

IT>В принципе, да. Такие маленкие гландочки, немножко через жопку.

Т.е. просто для любителей извращений. Практической ценности не имеет. ЧТД.

IT>>>·>без единой 3rd party зависимости (включая стандартную библиотеку Платформы).

IT>>>Т.е. ты всё таки хочешь АОП для перехвата кода из стандартных библиотек?
IT>·>Я же тебе всё на пальцах показал. Вот для этого:
IT>т.е. от выше выделенного ты отказываешься?
Ты наверное не понял, что в моём примере класс Colour — твой, и перехватывать надо только его, и лежит он в твоём проекте уютненьком, но call site нужного метода находится в недрах 3rd party библиотеки логгирования. Следовательно InterceptsLocation ты поставить не сможешь, тупо некуда.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[32]: Новости C#12
От: IT Россия linq2db.com
Дата: 22.11.23 18:05
Оценка: +1
Здравствуйте, ·, Вы писали:

IT>>В принципе, да. Такие маленкие гландочки, немножко через жопку.

·>Т.е. просто для любителей извращений. Практической ценности не имеет. ЧТД.

Вот ты упёртый.

IT>>т.е. от выше выделенного ты отказываешься?

·>Ты наверное не понял, что в моём примере класс Colour — твой, и перехватывать надо только его, и лежит он в твоём проекте уютненьком, но call site нужного метода находится в недрах 3rd party библиотеки логгирования. Следовательно InterceptsLocation ты поставить не сможешь, тупо некуда.

Это ты наверное меня плохо читал. Это сценарий один на сотню. По-крайней мере для моих прокетов. Даже 0 на сотню. Но ты на нём зациклился как на единственно возможном. Есть куча сценариев и их на порядки больше, чем твой пример. И в них во всех это решение работать будет. То, что оно не кошерное, ну да, ну и что? Работает и это главное.

Можешь называть это Duck AOP. Если оно ходит как AOP и крякает как AOP, то это, должно быть, AOP.
Если нам не помогут, то мы тоже никого не пощадим.
Re[32]: Новости C#12
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 22.11.23 18:49
Оценка:
Здравствуйте, ·, Вы писали:

·>Ты наверное не понял, что в моём примере класс Colour — твой, и перехватывать надо только его, и лежит он в твоём проекте уютненьком, но call site нужного метода находится в недрах 3rd party библиотеки логгирования. Следовательно InterceptsLocation ты поставить не сможешь, тупо некуда.

Это проблема того, кто сторонний код вызывает. У него своя стратегия логирования и ему лишнее логирование не нужно.
Опять же можно создавать отдельные проекты, на базе основных проектов, где модифицировать существующие методы на основе Рослина и отдавать их на отладку клиентам.
Чем больше вариантов тем лучше.
Ты же уперся, что раз InterceptsLocation не укладывается в твое понимание, то он не нужен!
и солнце б утром не вставало, когда бы не было меня
Re[26]: Новости C#12
От: Sinclair Россия https://github.com/evilguest/
Дата: 23.11.23 02:56
Оценка:
Здравствуйте, ·, Вы писали:
·>Так не чинится же, ну никак. Ведь в реальности такой код не пишут, будет Console.WriteLine("You chose " + colour).
Надо смотреть, в какое AST конвертится этот код в реальности.
Потому, что IL получается такой, как будто написали
Console.WriteLine(string.Concat("You chose ", colour.ToString()));

·>Даже хуже. Тот же Reshaper будет выдавать warning, что "You chose " + colour.ToString() надо упростить до "You chose " + colour
Я с вами на 80% согласен. 20% оставляю на то, что в финале это всё-таки починят так, чтобы подмена происходила как в данном примере:
1. Порождается AST по правилам компилятора для сложения строк и автоконверсии объектов через ToString()
2. Вызов ToString подменяется на пользовательский.

Пока непонятно, возможно это или нет — но скорее да, чем нет. Надо попробовать на пользовательском не-enum типе.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[36]: Новости C#12
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.11.23 07:34
Оценка:
Здравствуйте, ·, Вы писали:

S>> На самом деле есть еще способ, это на основании текущего проекта генерить новый проект со сгенеренными файлами.

·>Ну да, например, тут https://github.com/Jishun/RoslynWeave — попытка... и явно со своими проблемами.

S>> То есть ты сам же и дал ссылку, подтверждающую, что InterceptsLocation для АОП нужна!

·>Нужен не этот конкретный InterceptsLocation proposal, а то о чём сказали разработчики АОП-бибилиотеки: "a more general and flexible approach".

Есть еще пункт использования InterceptsLocation. Часто при багах на клиентах нужно более детальная информация в конкретном месте.
Не нужна это информация во всех вызовах метода, а только в нескольких местах, что бы не засирать лог.
Поставив комментарий у этого метода сгенерирутся замена. После решения бага убрать комментарий
и солнце б утром не вставало, когда бы не было меня
Re[27]: Новости C#12
От: · Великобритания  
Дата: 23.11.23 09:54
Оценка: :)
Здравствуйте, Sinclair, Вы писали:

S>·>Так не чинится же, ну никак. Ведь в реальности такой код не пишут, будет Console.WriteLine("You chose " + colour).

S>Надо смотреть, в какое AST конвертится этот код в реальности.
S>Потому, что IL получается такой, как будто написали
S>Console.WriteLine(string.Concat("You chose ", colour.ToString()));

В java я знаю, что такой код сконвертится в String.valueOf(colour), который внутри ещё делает null-check: String valueOf(Object obj) {return obj == null ? "null" : obj.toString(); }. Т.к. c# сдирали с явы, то скорее всего будет что-то очень похожее. Но даже если вдруг не так, то не так уж важно, суть в том, что вызов метода ToString находится в 3rd party code, соответственно InterceptsLocation ставить тупо некуда. Поэтому вся эта затея с магическим ToStringFast очень хрупкая и практически никак не контролируемая, только в бложик написать годится. Если кто-то захочет внедрить подобное в проекте — надо будет сильно стукнуть по башке.

S>·>Даже хуже. Тот же Reshaper будет выдавать warning, что "You chose " + colour.ToString() надо упростить до "You chose " + colour

S>Я с вами на 80% согласен. 20% оставляю на то, что в финале это всё-таки починят так, чтобы подмена происходила как в данном примере:
S>1. Порождается AST по правилам компилятора для сложения строк и автоконверсии объектов через ToString()
Это всё не поможет. Всё равно остаётся миллион возможностей когда call site окажется за пределами досягаемости компилятора. Недаром я немного другой пример привёл с Logger.Info вместо +, там уж точно метод будет дёргаться хз откуда; так же лесом пойдут все функции и либы форматирования и шаблонизации.

S>2. Вызов ToString подменяется на пользовательский.

S>Пока непонятно, возможно это или нет — но скорее да, чем нет. Надо попробовать на пользовательском не-enum типе.
Не понял. Если ты имеешь в виду, что появится возможность поменять тело ToString? Ну да, это и надо делать, это то что будет полезно и покрывать практически всё возможно необходимое. Делать подмены call site — толку как с козла молока, очень узкий специфичный сценарий, неясно какие проблемы решающий.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[37]: Новости C#12
От: · Великобритания  
Дата: 23.11.23 10:01
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Есть еще пункт использования InterceptsLocation. Часто при багах на клиентах нужно более детальная информация в конкретном месте.

S>Не нужна это информация во всех вызовах метода, а только в нескольких местах, что бы не засирать лог.
Для этого делают Logger.Debug и можно рулить детализацией лога меняя конфигурацию логгера, даже на работающем приложении.

S>Поставив комментарий у этого метода сгенерирутся замена. После решения бага убрать комментарий

KISS. Если ты можешь поставить комментарий, то гораздо проще тупо поставить вызов желаемого кода сразу.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[38]: Новости C#12
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.11.23 10:05
Оценка:
Здравствуйте, ·, Вы писали:

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


S>>Есть еще пункт использования InterceptsLocation. Часто при багах на клиентах нужно более детальная информация в конкретном месте.

S>>Не нужна это информация во всех вызовах метода, а только в нескольких местах, что бы не засирать лог.
·>Для этого делают Logger.Debug и можно рулить детализацией лога меняя конфигурацию логгера, даже на работающем приложении.
Мне нужно только в одном месте. Это может быть 1 % от всех вызовов метода!
Как мне узнать, для какого вызова делать лог, а для какого не надо?
S>>Поставив комментарий у этого метода сгенерирутся замена. После решения бага убрать комментарий
·> KISS. Если ты можешь поставить комментарий, то гораздо проще тупо поставить вызов желаемого кода сразу.
Зачем если есть алгоритм создания обертки? Это проще, чем писать метод с параметрами и запихивать эти параметры в логи
Не ну ты упёртый. Время тратишь. Не надо, не используй. Но ты всем доказываешь с пеной у рта, что это не нужно!
При этом другим это нужно и используют!
и солнце б утром не вставало, когда бы не было меня
Отредактировано 23.11.2023 10:07 Serginio1 . Предыдущая версия .
Re[28]: Новости C#12
От: Sinclair Россия https://github.com/evilguest/
Дата: 23.11.23 10:23
Оценка: +1
Здравствуйте, ·, Вы писали:
S>>Потому, что IL получается такой, как будто написали
·>
S>>Console.WriteLine(string.Concat("You chose ", colour.ToString()));
·>

·>В java я знаю, что такой код сконвертится в String.valueOf(colour), который внутри ещё делает null-check: String valueOf(Object obj) {return obj == null ? "null" : obj.toString(); }. Т.к. c# сдирали с явы, то скорее всего будет что-то очень похожее.
Не "скорее всего", а будет ровно то, что я написал. Это часть спецификации языка, и результат нетрудно проверить.

·>Но даже если вдруг не так, то не так уж важно, суть в том, что вызов метода ToString находится в 3rd party code, соответственно InterceptsLocation ставить тупо некуда.

Нет, не находится. Там нет никакого 3rd party code. Порождается именно такое AST, прямо в том месте, где идёт вызов WriteLine.

·>Поэтому вся эта затея с магическим ToStringFast очень хрупкая и практически никак не контролируемая, только в бложик написать годится. Если кто-то захочет внедрить подобное в проекте — надо будет сильно стукнуть по башке.

Ничего никуда не стукнет. Потому, что эта штука — оптимизационная. Её задача — не в том, чтобы менять семантику 3rd-party code, а в том, чтобы оптимизировать свой код.

·>Это всё не поможет. Всё равно остаётся миллион возможностей когда call site окажется за пределами досягаемости компилятора. Недаром я немного другой пример привёл с Logger.Info вместо +, там уж точно метод будет дёргаться хз откуда; так же лесом пойдут все функции и либы форматирования и шаблонизации.

1. Логгеры в дотнете устроены не так, как вы пишете.
2. Опять-таки: если есть какой-то сторонний код, который собрался что-то там логировать, то при использовании этой техники он просто продолжит работать как работал.

·>Не понял. Если ты имеешь в виду, что появится возможность поменять тело ToString?

Нет, я имею в виду, что непонятно, на какой фазе разбора применяется подстановка. До того, как код будет рассахарен, или после.
Потому что до рассахаривания никакого вызова ToString() нету: там BinaryOperation сложения, у которой правый аргумент — это Convert.
·>Ну да, это и надо делать, это то что будет полезно и покрывать практически всё возможно необходимое. Делать подмены call site — толку как с козла молока, очень узкий специфичный сценарий, неясно какие проблемы решающий.
Вполне ясно, какие проблемы он решает. В частности, он позволяет в тех местах, где происходит рантайм-анализ всякого разного, включая Expression Trees, подставить компайл-тайм результат.
Иногда можно добиться похожего эффекта ручным редактированием, но это
а) контрпродуктивно и
б) возможно не всегда.
Даже когда таких сценариев "мало", они могут всё ещё существенно повлиять на результат. В частности, какой-нибудь https://nessos.github.io/LinqOptimizer/ требует везде втыкать AsQueryExpr(), и он всё ещё тратит время на оптимизацию кода в рантайме.
А обсуждаемая фича способна взять и автоматически заменить весь "медленный linq-код" на эквивалентный быстрый без затрат на ручное переписывание кода во время разработки, и анализ выражений во время выполнения.
Если у вас есть приложение, у которого подобные запросы составляют значительную долю вычислительного времени, то банальный импорт пакета и перекомпиляция дадут вам перформанс буст на ровном месте.
Чем плохо-то?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[39]: Новости C#12
От: · Великобритания  
Дата: 23.11.23 10:35
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>·>Для этого делают Logger.Debug и можно рулить детализацией лога меняя конфигурацию логгера, даже на работающем приложении.

S>Мне нужно только в одном месте. Это может быть 1 % от всех вызовов метода!
S> Как мне узнать, для какого вызова делать лог, а для какого не надо?
Ну добавь лог-стейтмент в это одно место.

S>>>Поставив комментарий у этого метода сгенерирутся замена. После решения бага убрать комментарий

S>·> KISS. Если ты можешь поставить комментарий, то гораздо проще тупо поставить вызов желаемого кода сразу.
S> Зачем если есть алгоритм создания обертки? Это проще, чем писать метод с параметрами и запихивать эти параметры в логи
Можно просто написать код, который делает что надо в нужном месте.
Ты предлагаешь писать генератор, который генерит этот же код, комментарий чтобы отметить вместо вставки, и код, который это всё связывает?

S>Не ну ты упёртый. Время тратишь. Не надо, не используй. Но ты всем доказываешь с пеной у рта, что это не нужно!

Эти твои проблемы решаются гораздо проще и надёжнее, без магии. Поэтому надо резать Оккамом.

S>При этом другим это нужно и используют!

Мозоль больная. Насмотрелся я на таких использователей всякого... Наворотят слоёв, использовав всё подряд, и свалят на другой проект, а мне и другим потом разгребать.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[29]: Новости C#12
От: · Великобритания  
Дата: 23.11.23 11:01
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>·>В java я знаю, что такой код сконвертится в String.valueOf(colour), который внутри ещё делает null-check: String valueOf(Object obj) {return obj == null ? "null" : obj.toString(); }. Т.к. c# сдирали с явы, то скорее всего будет что-то очень похожее.

S>Не "скорее всего", а будет ровно то, что я написал. Это часть спецификации языка, и результат нетрудно проверить.
Да говорю, что это всё неважно, это же игрушечный пример.
Стоит поменять на чуть более красивое $"You chose {colour}" и магия исчезла.
Или как я уже упоминал List<Colour>. Что теперь, и списки уже нельзя будет использовать?!

S>·>Но даже если вдруг не так, то не так уж важно, суть в том, что вызов метода ToString находится в 3rd party code, соответственно InterceptsLocation ставить тупо некуда.

S>Нет, не находится. Там нет никакого 3rd party code. Порождается именно такое AST, прямо в том месте, где идёт вызов WriteLine.
Именно, что только в данном случае. В этом и беда.

S>·>Поэтому вся эта затея с магическим ToStringFast очень хрупкая и практически никак не контролируемая, только в бложик написать годится. Если кто-то захочет внедрить подобное в проекте — надо будет сильно стукнуть по башке.

S>Ничего никуда не стукнет. Потому, что эта штука — оптимизационная. Её задача — не в том, чтобы менять семантику 3rd-party code, а в том, чтобы оптимизировать свой код.
Слишком хрупкая оптимизация.

S>·>Это всё не поможет. Всё равно остаётся миллион возможностей когда call site окажется за пределами досягаемости компилятора. Недаром я немного другой пример привёл с Logger.Info вместо +, там уж точно метод будет дёргаться хз откуда; так же лесом пойдут все функции и либы форматирования и шаблонизации.

S>1. Логгеры в дотнете устроены не так, как вы пишете.
S>2. Опять-таки: если есть какой-то сторонний код, который собрался что-то там логировать, то при использовании этой техники он просто продолжит работать как работал.
А как?

S>·>Ну да, это и надо делать, это то что будет полезно и покрывать практически всё возможно необходимое. Делать подмены call site — толку как с козла молока, очень узкий специфичный сценарий, неясно какие проблемы решающий.

S>Вполне ясно, какие проблемы он решает. В частности, он позволяет в тех местах, где происходит рантайм-анализ всякого разного, включая Expression Trees, подставить компайл-тайм результат.
Ок... Т.е. дать возможность пользователям играться с оптимизацией самого сишарп кода, когда сам компилятор не справляется?.. Ну не знаю, уж очень мало возможностей развернуться, имхо.

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

S>Чем плохо-то?
Это интереснее. Может даже взлететь.

Мой спор был про упомянутые тут юнит-тесты и АОП и уж тем более дебаг-отладка — для них это точно не взлетит. Слишком много ограничений.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[40]: Новости C#12
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.11.23 11:39
Оценка:
Здравствуйте, ·, Вы писали:


S>>·>Для этого делают Logger.Debug и можно рулить детализацией лога меняя конфигурацию логгера, даже на работающем приложении.

S>>Мне нужно только в одном месте. Это может быть 1 % от всех вызовов метода!
S>> Как мне узнать, для какого вызова делать лог, а для какого не надо?
·>Ну добавь лог-стейтмент в это одно место.
Мне жалко тратить время. Я лучше потрачу на создание автомата.
S>>>>Поставив комментарий у этого метода сгенерирутся замена. После решения бага убрать комментарий
S>>·> KISS. Если ты можешь поставить комментарий, то гораздо проще тупо поставить вызов желаемого кода сразу.
S>> Зачем если есть алгоритм создания обертки? Это проще, чем писать метод с параметрами и запихивать эти параметры в логи
·>Можно просто написать код, который делает что надо в нужном месте.
·>Ты предлагаешь писать генератор, который генерит этот же код, комментарий чтобы отметить вместо вставки, и код, который это всё связывает?
Да это проще чем на каждый чих писать обертки. Проще написать генератор кода по комментарию.
Суть обертки это тот же AOP вывести в лог значения параметров и результат.
И таких мест может быть множество. Можно и все вызовы в методе обернуть.
И его нужно сделать один раз, а использовать потом постоянно. И наверняка уже кто то напишет генератор.

S>>Не ну ты упёртый. Время тратишь. Не надо, не используй. Но ты всем доказываешь с пеной у рта, что это не нужно!

·>Эти твои проблемы решаются гораздо проще и надёжнее, без магии. Поэтому надо резать Оккамом.
С InterceptsLocation намного ускоряется создание кода для отладки.
S>>При этом другим это нужно и используют!
·>Мозоль больная. Насмотрелся я на таких использователей всякого... Наворотят слоёв, использовав всё подряд, и свалят на другой проект, а мне и другим потом разгребать.

Ну с SG так или иначе будут генерить код и без InterceptsLocation.
А для создания оберток для отладки проблемного кода он работает ровно столько пока не найдется баг. Затем автоматом, можно все эти комментарии отключить или отключить генератор.

Кроме того InterceptsLocation хорошь при AOT когда нужно выкосить рефлекшн, динамическую компиляцию итд.
В зависимости от опции компилятора, мы можем использовать разные версии
и солнце б утром не вставало, когда бы не было меня
Отредактировано 23.11.2023 11:46 Serginio1 . Предыдущая версия . Еще …
Отредактировано 23.11.2023 11:43 Serginio1 . Предыдущая версия .
Re[29]: Новости C#12
От: · Великобритания  
Дата: 23.11.23 11:54
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

S>Не "скорее всего", а будет ровно то, что я написал. Это часть спецификации языка, и результат нетрудно проверить.

Понял. Если потерять тип, то и появляется этот самый null-check, притом компилятор сразу инлайнит аналог valueOf. Видимо, очередной хак из-за плохого оптимизатора.
Вот тут несколько кейсов, когда Colour.ToString исчезает в своём коде.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[41]: Новости C#12
От: · Великобритания  
Дата: 23.11.23 12:12
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>·>Ну добавь лог-стейтмент в это одно место.

S>Мне жалко тратить время. Я лучше потрачу на создание автомата.
Ты потратишь на порядки больше времени на отладку этого автомата и ещё потом на отладку отладочного кода.

S>>> Зачем если есть алгоритм создания обертки? Это проще, чем писать метод с параметрами и запихивать эти параметры в логи

S>·>Можно просто написать код, который делает что надо в нужном месте.
S>·>Ты предлагаешь писать генератор, который генерит этот же код, комментарий чтобы отметить вместо вставки, и код, который это всё связывает?
S> Да это проще чем на каждый чих писать обертки. Проще написать генератор кода по комментарию.
В современных редакторах есть разные макросы и шаблоны. Это всё автоматизируется. Вставится нужный кусочек кода, который можно тут же поглядеть и подправить если не совсем подходит. Это не проблема которая должна решаться в компиляторе.

S>Суть обертки это тот же AOP вывести в лог значения параметров и результат.

S>И таких мест может быть множество. Можно и все вызовы в методе обернуть.
S>И его нужно сделать один раз, а использовать потом постоянно. И наверняка уже кто то напишет генератор.
Потом тебе надо будет бороться со сценариями которые я упомянул тут
Автор: ·
Дата: 23.11 14:54
.
Потом тебе надо будет бороться с некоторыми значениями, которые надо как-то по особенному логгировать. Скажем, параметром передаётся огромная коллекция и выводить её в лог устанешь, да и не надо. А массив надо, ВНЕЗАПНО окажется, выводить надо через String.Join. И ещё 100500 частных случаев.
Потом тебе надо будет придумывать как через этот комментарий протащить небольшой кусочек логики (ну там не весь HugeRequest param залоггировать, а только param.Id).
Потом ты нахрен плюнешь и пожалеешь о потраченном времени.

S>·>Эти твои проблемы решаются гораздо проще и надёжнее, без магии. Поэтому надо резать Оккамом.

S> С InterceptsLocation намного ускоряется создание кода для отладки.
Ты просто дальше носа не видишь.

S> Кроме того InterceptsLocation хорошь при AOT когда нужно выкосить рефлекшн, динамическую компиляцию итд.

S>В зависимости от опции компилятора, мы можем использовать разные версии
Не дай боже потом такой код придётся как шаред-компонент выложить. Будешь выклдадывать несколько бинарных версий с разными комбинациями ключей компилятора.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Отредактировано 23.11.2023 12:15 · . Предыдущая версия .
Re[42]: Новости C#12
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.11.23 14:19
Оценка:
Здравствуйте, ·, Вы писали:


S>>·>Ну добавь лог-стейтмент в это одно место.

S>>Мне жалко тратить время. Я лучше потрачу на создание автомата.
·>Ты потратишь на порядки больше времени на отладку этого автомата и ещё потом на отладку отладочного кода.
Ну вот Игорь уже написал автомат. Нужно просто пройтись по коду обнаружить методы помеченные определенных комментарием.
Получить реальный метод и по нему создать новый с такими же параметрами ну и логирование параметров. Если рука набита это недолго.
А думаю, что нугеты сделают и MS или кто другой.

S>>>> Зачем если есть алгоритм создания обертки? Это проще, чем писать метод с параметрами и запихивать эти параметры в логи

S>>·>Можно просто написать код, который делает что надо в нужном месте.
S>>·>Ты предлагаешь писать генератор, который генерит этот же код, комментарий чтобы отметить вместо вставки, и код, который это всё связывает?
S>> Да это проще чем на каждый чих писать обертки. Проще написать генератор кода по комментарию.
·>В современных редакторах есть разные макросы и шаблоны. Это всё автоматизируется. Вставится нужный кусочек кода, который можно тут же поглядеть и подправить если не совсем подходит. Это не проблема которая должна решаться в компиляторе.
То есть ту работу которую сделает компилятор автоматически предлагаешь в рукопашную создавать, а потом и убирать код?
Спасибо!

S>>Суть обертки это тот же AOP вывести в лог значения параметров и результат.

S>>И таких мест может быть множество. Можно и все вызовы в методе обернуть.
S>>И его нужно сделать один раз, а использовать потом постоянно. И наверняка уже кто то напишет генератор.
·>Потом тебе надо будет бороться со сценариями которые я упомянул тут
Автор: ·
Дата: 23.11 14:54
.

·>Потом тебе надо будет бороться с некоторыми значениями, которые надо как-то по особенному логгировать. Скажем, параметром передаётся огромная коллекция и выводить её в лог устанешь, да и не надо. А массив надо, ВНЕЗАПНО окажется, выводить надо через String.Join. И ещё 100500 частных случаев.
·>Потом тебе надо будет придумывать как через этот комментарий протащить небольшой кусочек логики (ну там не весь HugeRequest param залоггировать, а только param.Id).
·>Потом ты нахрен плюнешь и пожалеешь о потраченном времени.

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

S>>·>Эти твои проблемы решаются гораздо проще и надёжнее, без магии. Поэтому надо резать Оккамом.

S>> С InterceptsLocation намного ускоряется создание кода для отладки.
·>Ты просто дальше носа не видишь.
Угу, только ты выискиваешь проблемы, там где их нет!
S>> Кроме того InterceptsLocation хорошь при AOT когда нужно выкосить рефлекшн, динамическую компиляцию итд.
S>>В зависимости от опции компилятора, мы можем использовать разные версии
·>Не дай боже потом такой код придётся как шаред-компонент выложить. Будешь выклдадывать несколько бинарных версий с разными комбинациями ключей компилятора.
Так я так и делаю. Для отладки определенных вещей я делаю специальные сборки и отдаю клиенты.
Конечно не выкладываю, а по договоренности отдаю клиентам, что бы локализовать ошибку.
InterceptsLocation позволяет без изменения кода генерить нужные сборки.
и солнце б утром не вставало, когда бы не было меня
Отредактировано 23.11.2023 14:20 Serginio1 . Предыдущая версия .
Re[43]: Новости C#12
От: · Великобритания  
Дата: 23.11.23 15:00
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>·>В современных редакторах есть разные макросы и шаблоны. Это всё автоматизируется. Вставится нужный кусочек кода, который можно тут же поглядеть и подправить если не совсем подходит. Это не проблема которая должна решаться в компиляторе.

S> То есть ту работу которую сделает компилятор автоматически предлагаешь в рукопашную создавать, а потом и убирать код?
Это не то, что я написал. Ключевое слово выделил.

S>·>Потом ты нахрен плюнешь и пожалеешь о потраченном времени.

S> Ты тут придумываешь. Я тебе написал, нужны входные параметры и состояние объекта, что бы воспроизвести ошибку
Как ты в комментарии опишешь какое состояние объекта ты хочешь вывести? А если это приватные данные?
Входные параметры тоже по-разному требуется выводить в зависимости от фазы луны.

S>·>Не дай боже потом такой код придётся как шаред-компонент выложить. Будешь выклдадывать несколько бинарных версий с разными комбинациями ключей компилятора.

S> Так я так и делаю. Для отладки определенных вещей я делаю специальные сборки и отдаю клиенты.
S>Конечно не выкладываю, а по договоренности отдаю клиентам, что бы локализовать ошибку.
Что-то издевательство какое-то над клиентами. И над собой.

S>InterceptsLocation позволяет без изменения кода генерить нужные сборки.

Ты вроде собирался комментарий вставлять. Это — уже изменение кода.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.