2011-10-03 8 views
16

Estoy usando ReSharper para volver a factorizar mi código. Cuando trato de mover un bloque de código para el método, aparece el siguiente aviso:¿Por qué recibo el error ReSharper "El código extraído tiene múltiples puntos de entrada"?

The extracted code has multiple entry points

Aquí está la firma del método Tengo la intención de utilizar:

private void GetRatePlanComponents(ProductPlan productPlan, 
    ProductRatePlan productRatePlan)  

He buscado en la Web para entender lo que significa Pero no tuve mucha suerte. ¿Alguien lo explicaría?

Para su referencia, aquí es el fragmento de código que estoy tratando de pasar a un método separado:

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

¿Estás seguro de que dice puntos de * entrada * múltiples en lugar de * puntos * de salida? ¿Señala en una línea particular? ¿Es eso la totalidad del método? ¿Puedes incluir la firma del método? –

+0

@Jon Skeet: Sí. dice "punto de entrada". Eche un vistazo a la pregunta actualizada. – Moon

Respuesta

7

Parece que puede haber encontrado a known issue:

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

seleccionar tanto foreach-bucles y método de extracción. Da extraña advertencia porque el fragmento tiene múltiples puntos de entrada y da como resultado el siguiente código (??!):

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

Sería mejor sustituir foreach generado con sencillo return Foo(sourceFile, targetPath);.

1

he visto ReSharper hacer esto mismo cuando el código que estaba tratando de extracto tuvo un par de lanzar declaraciones

Puede hacer lo que hice en ese caso: comente sistemáticamente una línea a la vez hasta que encuentre la ruta por la que vuelve a disparar ReSharper. Luego puedes extraer el método y descomentar la línea después.

O simplemente puede refactorizarlo a mano.

Cuestiones relacionadas