#c# #.net #c#-3.0 #refactoring #resharper
#c# #.net #c #-3.0 #рефакторинг #resharper
Вопрос:
Я использую 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;
}
}
}
}
}
Комментарии:
1. Вы уверены, что в нем указано несколько точек входа , а не точек выхода ? Указывает ли он на определенную строку? Это весь метод? Можете ли вы включить сигнатуру метода?
2. @Джон Скит: Да. там написано «точка входа». Взгляните на обновленный вопрос.
Ответ №1:
Похоже, вы, возможно, столкнулись с известной проблемой:
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 на simple return
.
Foo(sourceFile, targetPath);
Ответ №2:
Я видел, как ReSharper делал то же самое, когда в коде, который я пытался извлечь, было несколько операторов throw .
Вы можете сделать то, что я сделал в этом случае — систематически комментировать по одной строке за раз, пока не найдете ту, на которую указывает ReSharper. Затем вы можете извлечь метод и впоследствии раскомментировать строку.
Или вы можете просто реорганизовать его вручную.