Vraag Waarom krijg ik de ReSharper-foutmelding "De uitgepakte code heeft meerdere toegangspunten"?


Ik gebruik de ReSharper om mijn code te herfactoren. Wanneer ik een blok code naar de methode probeer te verplaatsen, krijg ik de volgende waarschuwing:

The extracted code has multiple entry points

Hier is de methodehandtekening die ik van plan ben te gebruiken:

private void GetRatePlanComponents(ProductPlan productPlan, 
    ProductRatePlan productRatePlan)    

Ik heb op het web gezocht om te begrijpen wat het betekent. Maar had niet veel geluk. Zou iemand het uitleggen?

Ter referentie, hier is het codefragment dat ik probeer te verplaatsen naar een afzonderlijke methode:

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;
                }
            }
        }
    }
}

16
2017-10-03 19:36


oorsprong


antwoorden:


Het lijkt erop dat je bent tegengekomen een bekend probleem:

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;
}

Selecteer zowel foreach-loops als extract-methode. Het geeft een vreemde waarschuwing dat het fragment meerdere toegangspunten heeft (??!) en resulteert in de volgende code:

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;
}

Het is beter om gegenereerde foreach met eenvoudig te vervangen return Foo(sourceFile, targetPath);.


7
2017-10-03 20:28



Ik heb ReSharper hetzelfde zien doen toen de code die ik probeerde uit te pakken een paar werpinstructies had.

Je kunt doen wat ik in die zaak heb gedaan - systematisch commentaar geven op een regel tegelijk totdat je degene hebt gevonden waar ReSharper over struikelt. Vervolgens kunt u de methode extraheren en de lijn achteraf opheffen.

Of je kunt het gewoon refacteren met de hand.


1