¿Es mejor crear una instancia de clase, o crear una instancia cada vez que se llame un método? -- # campo con performance camp codereview Relacionados El problema

Is it better to create a class instance, or create an instance each time a method is called?


3
vote

problema

Español

Estoy creando un convertidor para su uso en una aplicación XAML de Windows 8 (MVVM). Como puede ver en el código a continuación, el convertidor se usa para convertir un BOOL en una de las dos cadenas de un archivo de recursos de idioma.
Mi pregunta es, ¿es mejor crear una instancia de ResourceLoader para la clase del convertidor o debería continuar creando nuevas instancias cada vez que se llama el método?

  class BooleanToBudgetYearStringConverter : IValueConverter {     private const string CALENDAR = "BudgetCycle_Calendar",                         FISCAL = "BudgetCycle_Fiscal";      private Windows.ApplicationModel.Resources.ResourceLoader loader;      public object Convert(object value, Type targetType, object parameter, string language)     {         string entryName = (value is bool && (bool)value) ? CALENDAR : FISCAL;  //The name of the entry desired from the entry file.         return new Windows.ApplicationModel.Resources.ResourceLoader().GetString(entryName);     }      public object ConvertBack(object value, Type targetType, object parameter, string language)     {         return (value is string && (string)value == new Windows.ApplicationModel.Resources.ResourceLoader().GetString(CALENDAR));     } }   

Estoy específicamente preocupado por la velocidad y el uso de la memoria.

Original en ingles

I am creating a converter for use in a Windows 8 XAML app (MVVM). As you can see in the code below, the converter is used to convert a bool into one of two strings from a language resource file.
My question is, is it better to create one instance of ResourceLoader for the converter class or should I continue creating new instances each time the method is called?

class BooleanToBudgetYearStringConverter : IValueConverter {     private const string CALENDAR = "BudgetCycle_Calendar",                         FISCAL = "BudgetCycle_Fiscal";      private Windows.ApplicationModel.Resources.ResourceLoader loader;      public object Convert(object value, Type targetType, object parameter, string language)     {         string entryName = (value is bool && (bool)value) ? CALENDAR : FISCAL;  //The name of the entry desired from the entry file.         return new Windows.ApplicationModel.Resources.ResourceLoader().GetString(entryName);     }      public object ConvertBack(object value, Type targetType, object parameter, string language)     {         return (value is string && (string)value == new Windows.ApplicationModel.Resources.ResourceLoader().GetString(CALENDAR));     } } 

I am specifically concerned about speed and memory use.

     
   
   

Lista de respuestas

5
 
vote
vote
La mejor respuesta
 

Usa un atributo

La clase debe ser etiquetada con:

  [ValueConversion(typeof(Boolean), typeof(String))]   

Si es de la variedad Normal, Old-School .NET (escritorio, perfil del cliente, WP8). Las aplicaciones de Windows Store no parecen tener un atributo análogo en sus bibliotecas .NET y, por lo tanto, esta recomendación se puede ignorar al compilar tal programa.

Cheques tipo gota

Si el valor aprobado no es del tipo esperado, no debe hacer su conversión; Debe permitir que se lanza una excepción, para que sepa que se haya realizado una vinculación no válida (y puede ir correcto el código ofensivo). Esto se aplica tanto a la conversión como a la conversión posterior.

Conversión de la espalda explícita

Revise una coincidencia explícita: no es predeterminado para devolver "Falso" en una no coincidencia con la cadena de calendario. En su lugar, verifique que la cadena de entrada coincida con la cadena fiscal. Lanzar una excepción si la cadena de entrada coincide con una cadena aceptable.

Usa un singleton

La documentación para Windows.ApplicationModel.Resources.ResourceLoader implica que el Constructor predeterminado que está usando debe dar lugar a un objeto que es idéntico en la función a la disponible en la función estática GetForCurrentView() . Si no, configure su propio patrón de Singleton para asegurarse de que tiene en la mayoría de las copias compartidas del objeto de recursos en un momento dado.

 

Use an Attribute

The class should be tagged with:

[ValueConversion(typeof(Boolean), typeof(String))] 

If it's of the normal, old-school .NET variety (desktop, client profile, WP8). Windows store apps don't appear to have an analogous attribute in their .NET libraries, and thus this recommendation can be ignored when compiling such a program.

Drop Type Checks

If the passed-in value is not of the expected type, you should not do your conversion; you should allow an exception to be thrown, so that you know an invalid binding has taken place (and you can go correct the offending code). This applies to both conversion and back-conversion.

Explicit Back Conversion

Check for an explicit match -- don't default to returning "false" on a non-match with the CALENDAR string. Instead, check that the input string matches with the FISCAL string. Throw an exception if the input string matches neither acceptable string.

Use a Singleton

The documentation for Windows.ApplicationModel.Resources.ResourceLoader implies that the default constructor you're using should result in an object that is identical in function to the one available from the static GetForCurrentView() function. If not, then set up your own singleton pattern to ensure that you have at most one shared copy of the resource object around at any given time.

 
 
         
         
3
 
vote
  private const string CALENDAR = "BudgetCycle_Calendar",                     FISCAL = "BudgetCycle_Fiscal";   

sería mucho más bonita como dos instrucciones:

  private const string CALENDAR = "BudgetCycle_Calendar"; private const string FISCAL = "BudgetCycle_Fiscal";   

  private Windows.ApplicationModel.Resources.ResourceLoader loader;   

Dado assert(0 <= i && i < size) 0 , la declaración anterior se puede simplificar a:

  assert(0 <= i && i < size) 1  

La variable se declara, pero nunca asignada, y no se usa en ninguna parte.

Tomaría @ Travis 'consejos y asignándolo así:

  assert(0 <= i && i < size) 2  

Esto mejora en gran medida la legibilidad de su assert(0 <= i && i < size) 3 Declaraciones:

  assert(0 <= i && i < size) 4  

y

  assert(0 <= i && i < size) 5  

(Siga Consejos de @Travis aquí también , sobre la conversión explícita de la espalda / Bueno, todo su entero Respuesta en realidad)

 
private const string CALENDAR = "BudgetCycle_Calendar",                     FISCAL = "BudgetCycle_Fiscal"; 

Would be much prettier as two instructions:

private const string CALENDAR = "BudgetCycle_Calendar"; private const string FISCAL = "BudgetCycle_Fiscal"; 

private Windows.ApplicationModel.Resources.ResourceLoader loader; 

Given using Windows.ApplicationModel.Resources;, the above declaration can be simplified to:

private ResourceLoader loader; 

The variable is declared, but never assigned, and isn't used anywhere.

I'd take @Travis' advice and assign it like this:

private ResourceLoader loader = ResourceLoader.GetForCurrentView(); 

This greatly improves the readability of your return statements:

return loader.GetString(entryName); 

and

return (value is string && value.ToString() == loader.GetString(CALENDAR)); 

(follow @Travis' advice here too, about explicit back conversion / well, his entire answer actually)

 
 

Relacionados problema

1  Compruebe si dos cadenas son permutación entre sí  ( Check if two strings are permutation of each other ) 
private String sort(String word) { char[] content = word.toCharArray(); Arrays.sort(content); return new String(content); } private boolea...

5  Memoria / Performance of Merge Sort Code  ( Memory performance of merge sort code ) 
Escribí un código de tipo de combinación para un poco de bocadillo nocturno. Lo he puesto trabajando, pero solo estaba mirando a aprender si me faltaba algo e...

5  Encuentre el próximo número Prime - Control de flujo de los bucles anidados 'para `  ( Find the next prime number flow control of nested for loops ) 
Este código funciona perfectamente, pero me molesta. Tener un bucle etiquetado y anidado Bucle, con un Enumerable<T>.Empty()0 Declaración, y un 9988777665...

3  Generador de imágenes de Mandelbrot con iteración paralela  ( Mandelbrot image generator with parallel iteration ) 
Actualmente estoy tratando de optimizar esta clase que tengo para la generación fractal. La ecuación está destinada a ser conectable; He usado z => z*z + c ...

35  Demasiados bucles en la aplicación de dibujo  ( Too many loops in drawing app ) 
Tengo un método que tiene muchos bucles: #ifndef __RUNES_STRUCTURES_H #define __RUNES_STRUCTURES_H /* Runes structures. */ struct Game { char board[2...

6  Palindrome más largo en una matriz  ( Longest palindrome in an array ) 
Soy nuevo en la programación, y creo que este código podría mejorarse. ¿Alguna sugerencia? 'done'0 ...

2  IMACROS BOT para realizar refrescos  ( Imacros bot for performing refreshes ) 
Estoy tratando de simplificar este código. Parece que todo funciona como debería; Sin embargo, cuando en el bucle de actualización de Imacro, parece un poco i...

4  Simulación simple de red neural en C ++ (Ronda 2)  ( Simple neural network simulation in c round 2 ) 
Intro Ayer He publicado esta pregunta . Desde entonces, he actualizado mi código para incorporar estas sugerencias . También he eliminado la dependencia d...

8  Simple GCD Utility en Java  ( Simple gcd utility in java ) 
i anteriormente discutido El rendimiento se refiere a diferentes algoritmos GCD. Escribí una simple clase de Java que implementa el algoritmo binario GCD. E...

1  Integración de oscilador de fase perturbada  ( Perturbed phase oscillator integration ) 
Estoy integrando un sistema de osciladores de fase perturbados. Defino el sistema de ecuación y también la matriz jacobiana. Tengo que remodelar el vector dim...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos