Nano Hash - криптовалюты, майнинг, программирование

Есть ли способ сделать правило решарпера, чтобы препятствовать параметрам ref & out?

Мое мнение, что параметры ref и out ухудшают читабельность кода. В большинстве случаев их можно заменить с помощью дженериков и типов, допускающих значение NULL.

Я бы хотел, чтобы resharper предупреждал, когда кто-то пытается определить функцию с параметром ref или out. Однако все, что мне удалось найти, — это способ рефакторинга методов, объявленных для использования параметров out. Кажется, не существует каких-либо существующих проверок или способов написать собственный шаблон, ориентированный на параметры ref и out.

Вот обычное использование параметра out:

int i;
if(!int.TryParse(str, out i))
{
    i = -1;
}

Сравните это с этим:

var i = str.TryParse<int>() ?? -1;

TryParse — это просто метод расширения строки. У меня есть пользовательское правило решарпера, которое подчеркивает любые вызовы ValueType.TryParse(). Обратите внимание, что теперь можно анализировать строку как часть выражения linq.

T? TryParse<T>(this string str) 
{
   //magic
}

  • Зачем тебе это ВСЕГДА? 30.03.2013
  • Я считаю, что здесь необходимо обоснование. 30.03.2013
  • @ofstream, хотя я мог бы использовать такие методы, как xx.TryParse, я бы очень редко решил написать такой метод в своем собственном коде. Простое разочарование кажется разумным. Вы создали параметр ref. Должны ли вы вместо этого вернуть правильный тип? 30.03.2013
  • @ofstream: я не знаю, тот ли это сценарий, который имеет в виду OP, но иногда у нас есть люди, которым не хватает понимания, и они думают, что должны использовать ref, если метод изменяет свойства или поля экземпляра класса, переданного в качестве параметра . 30.03.2013
  • Что бы вы хотели побудить разработчиков использовать вместо этого? Кортеж (jetbrains.com/resharper/webhelp/)? Или что-то другое? 30.03.2013
  • @levelnis, предположительно, хорошо определенный класс. Возможно, вам, ребята, не посчастливилось работать с кодовыми базами, где разработчики регулярно пытались получить дополнительные (а иногда несколько дополнительных) возвращаемые значения из метода. Или код, который передает (возможно, несколько) локальные переменные другим методам для (условной) модификации. Это затрудняет рассуждения о коде, когда эта функция (злоупотребление) используется. Так что да, предупреждение о том, что помедленнее, племянник, прежде чем дело дойдет до проверки кода, может оказаться ценным для данной команды разработчиков. 30.03.2013
  • @ofstream только потому, что он существует, не означает, что его следует использовать или даже полезно. С# также имеет goto, знаете ли. Существуют сценарии, в которых необходимы ref и out (в определенных функциях фреймворка), но никогда не бывает случая, когда вам нужно было бы использовать их в пользовательских функциях. 30.03.2013
  • @levelnis ссылка, которую вы дали, это то, что я упомянул в своем посте. Я знаю, что у resharper есть рефакторинг для преобразования ref & out, но я хочу проверить код, чтобы выделить его как ошибку. 30.03.2013
  • @dan Есть несколько случаев, когда вам следует поощрять использование параметров ref или out. Например, если у вас есть тип, который может анализировать строку в экземпляре типа, TryParse — это давно установленный, понятный и ожидаемый способ обработки операции без создания исключения, и пользователям не следует пытаться найти ему альтернативы. . Кроме того, формат bool Try*(args, out result) является ожидаемой формой метода, который может дать сбой, но следует избегать исключений из соображений производительности. Пытаясь найти лучший способ, вы просто создаете библиотеку, полную неожиданных методов. 30.03.2013
  • -1: Вопрос может быть верным, но презентация чрезмерно и излишне аргументирована. 30.03.2013
  • @ 280Z28 Я сделал вопрос более приятным;) Однако я не нахожу аргумент производительности убедительным - разве это не микрооптимизация? Если я анализирую строки, то, скорее всего, я получил эти строки из операции ввода-вывода, которая затмевает любое преимущество производительности по сравнению с использованием версии параметра out. Я также не считаю традиции веской причиной тратить время разработчиков на чтение и написание стандартного кода. 31.03.2013
  • @dan - я бы настоятельно не рекомендовал вам использовать любой метод TryXXX, который не возвращает логическое значение. Ваш пример возвращает -1. Это противоречит ожидаемому шаблону использования шаблона TryXXX в фреймворке. Вместо этого я бы создал новый шаблон и назвал его SafeParse или ParseWithDefault, потому что это то, что вы делаете.. Вы не пытаетесь анализировать.. Вы анализируете и возвращаете значение по умолчанию с ошибкой... Старайтесь не переопределять существующие рамки или языковые шаблоны, так как это вызывает путаницу. 22.08.2014
  • @ErikFunkenbusch, это справедливая критика, чтобы не переопределять шаблоны фреймворка. между прочим, мой пример возвращает ноль, а не -1. 25.08.2014

Ответы:


1

К моему удивлению, следующий пользовательский шаблон действительно работает:

$type$ $X2$($pb$, ref $pt$ $i$, $pa$)
{
$stmts$;
}

Где

X2 – идентификатор
i – идентификатор
type – тип объекта или производный
stmts – любое количество операторов
pt – объект любого типа или производный
pa – любое количество аргументов
pb — любое количество аргументов

Это соответствует public int X(ref int y), а также private int X2(string j, ref int i, DateTime k).

Я не нашел способа сопоставить void методы.

Это с ReSharper 7.1.1 в Visual Studio 2012.

14.04.2013
  • Спасибо. Я был очень заинтересован в нестандартных шаблонах. Они могут сделать так много, но все же ограничены. Я не знал, что могу помещать параметры до и после определенного параметра, и не знал, что ref или out будут работать. 14.04.2013
  • Мне удалось заставить ваш шаблон работать с пустотами, сделав две копии и во второй заменив $type$ на void. Очень жаль, что документация по шаблонам настолько скудна, что я не смог найти в Интернете ничего, кроме тривиальных примеров. 15.04.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..