2010-08-19 9 views
5

Im tratando de codificar mi propia DSL para la manipulación de archivos, solo por el bien de aprender.Sintaxis DSL adecuada

Mi objetivo es hacer que sea comprensible y fácil de codificar.

Aquí hay 3 alternativas para anexar una cadena a un database.yml:

1. append("windows").to("database.yml") 

2. append(string: "windows").to(file: "database.yml") 

3. append_string("windows").to_file("database.yml") 

4. append_string "windows", to_file: "database.yml" 

5. append string: "windows", to_file: "database.yml" 

soy un poco perdido en todas estas alternativas.

¿Podría alguien con experiencia en DSL darme una guía y explicarme cuáles son los pros y los contras de cada uno?

Todos son leídos igual, pero quiero saber cuál sigue las mejores prácticas para el estándar de codificación DRY y bueno.

EDIT: Creo que sería bueno si pudiera especificar algunos parámetros opcionales, por ej.

append(string: "windows").to(file: "database.yml", :force => true) 

Así que, teniendo esto en cuenta, creo que tengo que usar las llamadas a métodos. Porque si uso las alternativas 4-5, cuando especifico: force => true, no puedo saber si es para la cadena o el archivo.

+0

@musicfreak. todos ellos son leídos igual. La siguiente pregunta que creo es cuál sigue una "mejor práctica" para DRY. –

+1

Quizás debería especificar el dominio: ¿quién es el usuario objetivo, qué tipo de manipulación de archivos desea, cuál será el alcance de su 'DSL'? – David

Respuesta

4

Para mí, cualquier opción parece estar bien.

Si usted (o usuario) siempre escribe en "database.yml" pero los contenidos anexos son diferentes, puede ser mejor.

on "database.yml" { 
    append "windows" 
    append "ubuntsu" 
    append "Leopard" 

    remove_if "bsd" do |..| 
     ....#if condition satisfied, "bsd" will be removed 
    end 
    .. 
} 

Si usted (o usuario) desea anexar "ventanas" siempre para diferentes archivos de bases de datos, siguiente puede estar bien.(Tal vez el caso raro ,,)

append "windows".to { 
    to "database.yml" 
    to "database2.yml" 
    to "database3.xml", :force=>true 
} 

De todos modos, creo que la mejor opción es utilizar usted mismo o pida a su usuario, y luego refinar.

3

La mejor DSL que conozco suele ocuparse del tipo que usted necesita. Por lo tanto, no especificaría el tipo de valor a adjuntar. Esto excluiría todas las alternativas que incluyen la palabra "cadena", y tal vez también todas las alternativas que incluyen la palabra "archivo".

yo personalmente como éstas:

append("windows").to("database.yml") 
append("windows").to("database.yml", :force => true) 

append "windows", :to => "database.yml" 
append "windows", :to => "database.yml", :force => true 

append "windows", :to_file => "database.yml" # if you really want "to_file" 
append "windows", :to_file => "database.yml", :force => true # if you really want "to_file" 

si uso alternativas 4-5 luego cuando especificar: fuerza => cierto, no puedo saber si es para la cadena o el archivo.

No lo veo como un problema, los parámetros opcionales generalmente apuntan a la acción. No son específicos de la cadena ni del archivo. Cuando estableces: force => true, estás forzando el anexar.

+0

Las variantes 3-6 parecen como si el nombre de archivo fuera opcional, lo que no parece una buena idea. –

+0

En realidad, ninguna de las alternativas propuestas en esta página obliga al usuario a establecer el archivo de destino. Creo que ese es uno de los problemas con DSL: no puedes asegurarte de que el usuario hable el idioma correctamente, ya que no puedes asegurarte de que los usuarios de Stack Overflow hablen inglés correctamente ... – David

+1

Si miras el DSL de Cucumber, objeta. property.should == "something", el "== 'something'" puede parecer opcional. Sin embargo, la oración no parece correcta cuando no hay nada después del debería. De la misma manera que la oración no se ve correctamente cuando intenta agregar texto a nada. – David

3

Creo que todo depende de cómo quiera usar su DSL. Parece razonable que uno quiere realizar varias opciones en un único archivo en una carrera, así que tal vez podría considerar algo así como

on 'database.yaml' do 
    append 'windows' 

    line 16 do 
    indent 2.spaces 
    end 

    lines 3,6,7 do 
    delete 
    end 
end 

Lo que significa que primero se define un ámbito de aplicación (un archivo, una línea, un conjunto de líneas, un bloque, etc.), y luego un conjunto de operaciones para realizar en él. Pero, nuevamente, somos programadores, tal vez al "usuario promedio" le gustaría usar algo que se asemeje más a un lenguaje natural, como ha comenzado.

2

escribo un blog el día de ayer de DSL, que no responde a su pregunta DSL-sistema de archivos específico, sino que se debe proporcionar suficiente información para tomar una decisión

Slick code with simple DSLs thanks to Ruby

+0

¡gran publicación! ¡Lo marcó como favorito! ¿bloquear [correo electrónico] es lo mismo que rendimiento (correo electrónico)? –

+0

+1 enlace impresionante –

1

algunas ideas:

with file('database.yaml') do |f| 
    f.append file('additions.yaml') 
    f.append 'somekey: true' 
    f.move_to dir('/some/where') 
    cpy = f.copy_to dir('some/where/else') 
    f.delete 
end