Почему я получаю ошибку ReSharper «Извлеченный код имеет несколько точек входа»? - PullRequest
16 голосов
/ 03 октября 2011

Я использую ReSharper для повторного кодирования моего кода. Когда я пытаюсь переместить блок кода в метод, я получаю следующее предупреждение:

The extracted code has multiple entry points

Вот подпись метода, которую я планирую использовать:

private void GetRatePlanComponents(ProductPlan productPlan, 
    ProductRatePlan productRatePlan)    

Я искал в Интернете, чтобы понять, что это значит. Но не повезло. Кто-нибудь объяснит это?

Для справки, вот фрагмент кода, который я пытаюсь перенести на отдельный метод:

QueryResult productRatePlanChargeQueryResult = 
    _zuoraService.query(string.Format(@"select Id, Name, IncludedUnits from
        ProductRatePlanCharge where ProductRatePlanId = '{0}' and 
        ChargeModel = 'Overage Pricing'", productRatePlan.Id));

if (productRatePlanChargeQueryResult.size > 0)
{
    foreach (ProductRatePlanCharge productRatePlanCharge 
        in productRatePlanChargeQueryResult.records)
    {
        string numberOfUnits = productRatePlanCharge.IncludedUnits.ToString();

        if (productRatePlanCharge.Name.Equals("Users"))
        {
            productPlan.NumberofUsers = numberOfUnits;
        }
        else if (productRatePlanCharge.Name.Equals("Projects"))
        {
            productPlan.NumberofProjects = numberOfUnits;
        }
        else if (productRatePlanCharge.Name.Equals("Storage"))
        {
            decimal volumeOfStorage;
            if (decimal.TryParse(productRatePlanCharge.IncludedUnits.ToString(), 
                out volumeOfStorage))
            {
                if (volumeOfStorage < 1) volumeOfStorage *= 1000;
                    productPlan.VolumeofStorage = volumeOfStorage.ToString();
                }
                else
                {
                    productPlan.VolumeofStorage = numberOfUnits;
                }
            }
        }
    }
}

Ответы [ 2 ]

7 голосов
/ 04 октября 2011

Похоже, вы могли столкнуться с известной проблемой :

public static IEnumerable<ITagPrefixHolder> GetRelevantHolders(IPsiSourceFile sourceFile )
{
  var targetPath = FileSystemPath.Empty;
  var projectFile = sourceFile.ToProjectFile();
  if (projectFile != null)
    targetPath = projectFile.Location;

  foreach(var holder in GetRelevantHoldersBeforeFile(sourceFile, targetPath))
    yield return holder;

  foreach(var holder in GetHoldersInFile(sourceFile, targetPath))
    yield return holder;
}

Выберите оба цикла foreach и метод извлечения.Это дает странное предупреждение, что фрагмент имеет несколько точек входа (??!) И приводит к следующему коду:

public static IEnumerable<ITagPrefixHolder> GetRelevantHolders(IPsiSourceFile sourceFile )
{
  var targetPath = FileSystemPath.Empty;
  var projectFile = sourceFile.ToProjectFile();
  if (projectFile != null)
    targetPath = projectFile.Location;

  foreach(var tagPrefixHolder in Foo(sourceFile, targetPath))
       yield return tagPrefixHolder;
}

private static IEnumerable<ITagPrefixHolder> Foo(IPsiSourceFile sourceFile, FileSystemPath targetPath)
{
  foreach(var holder in GetRelevantHoldersBeforeFile(sourceFile, targetPath))
    yield return holder;
  foreach(var holder in GetHoldersInFile(sourceFile, targetPath))
    yield return holder;
}

Было бы лучше заменить сгенерированный foreach на простой return Foo(sourceFile, targetPath);.

1 голос
/ 04 октября 2011

Я видел, как ReSharper делал то же самое, когда в коде, который я пытался извлечь, было несколько операторов throw.

Вы можете сделать то, что я сделал в этом случае - систематически комментировать по одной строке за раз, пока не найдете ту, по которой ReSharper спотыкается. Затем вы можете извлечь метод и затем раскомментировать строку.

Или вы можете просто выполнить рефакторинг вручную.

...