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

C# — Как проверить отсутствие операторов scope.Complete()?

Программисты в моей команде иногда открывают транзакцию и забывают включить оператор scope.Complete() (см. блок кода ниже). Любые идеи о способах

(1) найдите в нашем решении отсутствующие операторы scope.Complete() или

(2) Visual Studio автоматически выделяет или выдает предупреждение об отсутствующих операторах scope.Complete()?

Вот строка, которую мы пропускаем:

 using(TransactionScope scope = new TransactionScope())
 {
      /* Perform transactional work here */
      scope.Complete(); <-- we forget this line
      /* Optionally, include a return statement */
 }

Что я пробовал

Я пытался использовать для этой цели пользовательский шаблон ReSharper, но безуспешно. В идеале я бы искал что-то вроде:

using(TransactionScope scope = new TransactionScope())
{
    $statements1$
    [^(scope.Complete();)]
    $statements2$
}

Однако ReSharper принимает регулярные выражения только для идентификаторов, а не для операторов, поэтому это не работает (http://www.jetbrains.com/resharper/webhelp/Reference__Search_with_Pattern.html).

Есть идеи? Я также открыт для использования других плагинов или инструментов.

Спасибо,
Бен

18.06.2012

  • Я видел это сделано раньше с тестом. С помощью отражения вы можете определить, вызывается ли метод для экземпляра. Если это не так, то тест не пройден. 18.06.2012
  • Я считаю, что с помощью NDepend вы можете настроить правило для поиска методов, в которых количество использований TransactionScope ctor меньше, чем количество использований Complete. 18.06.2012
  • @AakashM Это работает как возможное решение! Похоже, NDepend может это сделать (ndepend.com/Features.aspx#CQL) существуют и бесплатные альтернативы (например, reflectoraddins.codeplex.com/). Не могли бы вы опубликовать свой комментарий в качестве возможного ответа на этот вопрос? Спасибо! 18.06.2012
  • @BenPaul готов и перемаркирован - я бы немного подождал и посмотрел, сможет ли Патрик из NDepend добавьте больше, он был бы лучшим человеком, чтобы уточнить, является ли это работой для NDepend 18.06.2012
  • Исправление к моему комментарию выше: отражатель не свободен. До сих пор я не нашел никаких бесплатных инструментов поиска кода, которые бы подошли для этой цели. 20.06.2012

Ответы:


1

NDepend, безусловно, может помочь, но не может проверить на 100% то, что вы просите. NDepend не знает о внутренностях тела метода (порядке вызова методов). Поэтому в лучшем случае вы можете написать правило кода для LINQ (CQLinq), которое будет проверять, что если метод создает TransactionScope, по крайней мере, он должен вызывать TransactionScope.Complete():

warnif count > 0
from m in Application.Methods
where m.CreateA("System.Transactions.TransactionScope") &&
     !m.IsUsing("System.Transactions.TransactionScope.Complete()")
select m

Обратите внимание: если разработчики достаточно дисциплинированы, чтобы не создавать несколько TransactionScope в одном методе, это правило должно сработать для вас.

19.06.2012

2

Не могли бы вы заставить программистов использовать пользовательский API вместо низкоуровневого scope.Complete?

Закрытие заставит использовать .Complete():

public static void Do(this TransactionScope scope, Action action) {
  using (scope) {
    action();
    scope.Complete();
  }
}

Тогда вы можете сделать:

new TransactionScope().Do(() => /* Transactional stuff */);
18.06.2012
  • Спасибо за ответ! Это правда, мы могли бы реорганизовать наши существующие транзакции, чтобы использовать собственный API, подобный тому, который вы написали, а затем попытаться заставить программистов использовать этот API для будущего кода. Я думаю, что трудным моментом будет рефакторинг всех транзакций, поскольку у нас уже есть большая база кода. Я не уверен, что это стоило бы затраченного времени. Думаю об этом... 18.06.2012

  • 3

    Я не знаю ни одного существующего плагина R#, который бы это проверял, но вы, безусловно, можете создать свой собственный. Все, что вам нужно сделать, это обнаружить оператор using с объявлением переменной типа TransactionScope, а затем выполнить итерацию содержащихся операторов в поисках вызова Complete().

    Если вы заинтересованы в этом, я рекомендую вам загрузить ReSharper SDK и проверить из Руководства по разработке плагинов.

    19.06.2012
    Новые материалы

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

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

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

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

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

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

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