2011-12-13 24 views
6

Estoy un poco confundido acerca de para qué se usa normalmente el método Initialize en un constructor.¿Para qué se utiliza el método Initialize y realmente lo necesito?

¿Por qué no puedo simplemente poner todo en el constructor y por qué el ejemplo siguiente llama al método de inicialización?

private IAzureTable<Product> _productRepository; 

    public ProductService(string dataSourceID) 
    { 
     Initialize(dataSourceID); 
    } 

    private void Initialize(string dataSourceID) 
    { 
     this._productRepository = StorageHelper.GetTable<Product>(dataSourceID); 
    } 

¿Hay alguna convención que se use normalmente?

En este ejemplo, ¿necesito la palabra this en el método Initialize?

+0

De esta manera el código en el método de inicialización puede ser llamado desde otro lugar aparte del constructor. – Megacan

+0

Para sus dos preguntas, una respuesta común: mejor legibilidad. Y para el método por separado, un punto más es ayudar a seguir el principio DRY. – Maheep

+0

Posible duplicado: http://stackoverflow.com/questions/4414471/initialize-vs-constructor-method-proper-usage-on-object-creation –

Respuesta

9

¿Por qué no puedo simplemente poner todo en el constructor y por qué la muestra a continuación llama al método de inicialización?

Puede ponerlo todo en el constructor. En este caso simple, deberías. Los constructores son para inicializando su objeto.

A veces hay algo más complicado sin embargo:

  • veces querrá un método separado Initialize porque quiere llamar a la vez separado de la construcción.
  • A veces lo desea porque está escribiendo múltiples constructores, y desea compartir parte de la implementación entre ellos.
  • Algunas veces su inicialización es complicada, y usted quiere dar buenos nombres a las piezas para que sepa qué está haciendo su código. Entonces rompes esas piezas en métodos separados.

Ninguno de estos es el caso de este código, así que me lo saltaría y arrojaría el código en el constructor.

¿Hay alguna convención que se use normalmente?

No. La gente hace lo que es más fácil de leer y entender, lo que requiera el mínimo código extra por escribir, y lo que causa la menor duplicación de código.

Sin embargo, si está haciendo que el método Initialize sea público y no lo llame desde el constructor, le recomiendo que lo llame Initialize. Diseñarlo para ser llamado solo una vez.

En este ejemplo, necesito la palabra "this." en el método Initialize?

No. Nunca necesita utilizar this para acceder a los miembros de la clase a menos que tenga otra variable local con el mismo nombre. He aquí un caso así:

public class Something 
{ 
    private string someValue; 

    public class Something(string someValue) 
    { 
     // must use "this" to access the member variable, 
     // because a local variable has the same name 
     this.someValue = someValue; 
    } 
} 
4

Lo que ha publicado es un asistente privado método, no es una clase.

Se utiliza simplemente para que el constructor no esté desordenado con el código de inicialización y para dar un buen nombre a lo que se hace.

En su ejemplo específico, parece tener poco valor.

+1

... y en este caso creo que es redundante. Un constructor ya "inicializa" las cosas, no es necesario hacer otro método que haga lo mismo (a menos que esté compartiendo una implementación común entre múltiples constructores). –

+2

@ MerlynMorgan-Graham - Estoy de acuerdo e hice ese punto en mi respuesta. – Oded

1

Lo primero es que el código parece legible si se separa la funcionalidad en sus propios métodos.

En segundo lugar, a veces, en determinadas situaciones, desea hacer que la inicialización sea pública para que el desarrollador pueda usarla después de llamar al constructor ya que no quiere que el código se ejecute en el constructor. Este suele ser el caso si usted tiene una forma y desea que algún código de inicialización para ejecutar antes de que aparezca una forma etc.

1

1: El uso del método de inicializar podría ser doble:

  • No puede ser una variedad de acciones de inicialización que deben desglosarse en fragmentos manejables (es decir, el constructor puede continuar para realizar otras acciones)
  • Puede haber un requisito para que la clase se reinicialice, en cuyo caso el código de inicialización debe estar en un método que no sea el constructor.

En su ejemplo específico, aunque es de poca importancia.

2: En el caso de this:

vez más en su ejemplo de su poco sentido. Podría tener un uso indifferentating entre las implementaciones de propiedades o métodos en una clase base y la clase actual (es decir, que tendría que utilizar base. en lugar de this.)

1

no existe una norma acordada, pero "initialize" es una palabra muy conocida que es reconocible al instante a cualquier otra persona que lee el código y me todo lo que necesito saber sobre el propósito de la cuenta método. Se podría llamar Bob() pero eso es mucho menos útil.

¿Por qué no puedo simplemente poner todo en el constructor?

Puede hacerlo, pero dividirlo en un método ayuda a que las cosas sean más legibles. Sin embargo, cuando tu constructor es una línea de código, no es realmente necesario.

En este ejemplo, necesito la palabra "this." en el método Initialize?

En el código que ha publicado no, no es necesario. ¿Por qué está ahí? Podría haber sido generado automáticamente por una herramienta, podría ser una convención o un estilo que alguien usó, podría haber sido pegado desde otro lugar donde fuera necesario ...