2010-07-09 30 views
5

un rubygem que estoy escribiendo y que es útil para contar las ocurrencias de palabras en un texto, elijo poner 3 parámetros en el constructor de la clase.¿Es aceptable tener un parámetro en el constructor de clase?

El código está funcionando, pero quiero refactorizarlo para que sea agradable. En su experiencia, es más fácil leer/mantener/usar como API una clase con un constructor sin params y muchos métodos setters/getters o un código como este, con todos los parámetros en el constructor.

TIA

Paolo

def initialize(filename, words, hide_list) 

    if ! filename.nil? 
    @filename = filename 
    @occurrences = read 
    else 
    @filename = STDIN 
    @occurrences = feed 
    end 

    @hide_list = hide_list 
    @sorted = Array(occurrences).sort { |one, two| -(one[1] <=> two[1]) } 
    @words = words 

end 
+1

Una ventaja de tener parámetros en el constructor en otros idiomas, al menos, es que puede hacer que el tipo sea inmutable. No puede hacer eso si configura todo por separado. No sé si eso se aplica a Ruby o no, por lo que este es un comentario en lugar de una respuesta. –

+0

@Jon: http://stackoverflow.com/questions/408208/ruby-immutable-objects analiza si puede hacer objetos inmutables en ruby ​​(que pueden ser diferentes del tipo inmutable) –

Respuesta

3

Se podía hacerlo de la manera rieles, donde se dan las opciones en un hash:

def initialize(filename = nil, options = {}) 
    @hide_list = options[:hide_list] 
    @words = options[:words] 

    if filename 
    @filename = filename 
    @occurrences = read 
    else 
    @filename = STDIN 
    @occurrences = feed 
    end 

    @sorted = Array(occurrences).sort { |one, two| -(one[1] <=> two[1]) } 

end 

Entonces se le puede llamar así:

WC.new "file.txt", :hide_list => %w(a the to), :words => %w(some words here) 

o esto:

wc = WC.new 
wc.hide_list = %w(a the is) 
wc.words = %w(some words here) 
+0

Mate esta pieza de código se ve muy bien –

0

No sé cómo es en Ruby, pero en otros idiomas que suelo poner esos argumentos en la firma constructora que son necesarios para inicializar el objeto en un estado válido . El resto del estado se puede configurar mediante setters.

+0

En este caso, los parámetros son opciones para personalizar la clase comportamiento al disparar su tarea. No es necesario para la inicialización de objetos. –

+0

@ thesp0nge si Ruby admite argumentos opcionales, entonces podría hacer que esos argumentos opcionales reflejen su opcionalidad. O agrega setters para las opciones. También debe considerar lo que dijeron los demás acerca de la mutabilidad. – Gordon

3

En mi experiencia, puedo decir que la razón para permitir parámetros de constructor en la mayoría de los lenguajes, aparte del hecho de aumentar la facilidad en la creación de instancias de clase, es facilitar el uso de la API.

Favorecer al constructor, sobre la instancia de getter/setter, también ayuda a la inmutabilidad, es decir, crear un objeto a través de su constructor y no dejar que nadie modifique sus propiedades más adelante.

+0

_aparte del hecho de aumentar la facilidad en la creación de instancias de clase, es facilitar el uso de la API_. ¿Puedes explicar qué significa "hacer que sea fácil usar la API"? – zuba

Cuestiones relacionadas