2010-08-19 11 views
5

Sto cercando di codificare il mio DSL per la manipolazione dei file, solo per motivi di apprendimento.Sintassi DSL appropriata

Il mio obiettivo è renderlo comprensibile e facile da codificare.

Qui ci sono 3 alternative per accodando una stringa in 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" 

Im un po 'perso in tutte queste alternative.

Qualcuno con esperienza in DSL può darmi qualche consiglio e spiegare quali sono i pro ei contro di ognuno?

Tutti vengono letti allo stesso modo, ma voglio sapere quale segue le migliori pratiche per il DRY e lo standard di codifica corretto.

EDIT: Penso che andrà bene se potessi specificare alcuni parametri opzionali es.

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

Quindi, tenuto conto di questo, suppongo di dover utilizzare le chiamate al metodo. Perché se uso le alternative 4-5, quando specificherò: force => true, non posso sapere se è per la stringa o il file.

+0

@musicfreak. tutti sono letti allo stesso modo. La prossima domanda credo sia quale segua una "best practice" per DRY. –

+1

Forse dovresti specificare il Dominio: chi è l'utente di destinazione, che tipo di manipolazione di file vuoi, quale sarà lo scopo della tua 'DSL'? – David

risposta

4

Per me, qualsiasi opzione sembra soddisfacente.

Se (o utente) si scrive sempre su "database.yml" ma i contenuti di accodamento sono diversi, seguente potrebbe essere migliore.

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

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

Se voi (o utente) desidera aggiungere "finestre" sempre per le diverse file di database, seguito può andare bene.(Caso forse rara ,,)

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

In ogni caso, penso che la scelta migliore è quella di utilizzare da soli o chiedere l'utente, quindi perfezionare.

3

La migliore DSL che conosco di solito si prende cura del tipo per voi. Quindi non vorrei specificare il tipo del valore da aggiungere. Ciò escluderebbe tutte le alternative che includono la parola "stringa" e forse anche tutte le alternative che includono la parola "file".

io personalmente come questi:

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" 

se uso alternative 4-5 poi quando ho specificare: forza => vero, non posso sapere se è per la stringa o la file.

Non vedo come un problema, i parametri opzionali solitamente mirano all'azione. Non sono né specifici per la stringa o il file. Quando imposti: force => true, stai forzando l'aggiunta.

+0

Le varianti 3-6 sembrano come se il nome file fosse facoltativo, il che non sembra una buona idea. –

+0

In realtà, nessuna delle alternative proposte in questa pagina obbliga l'utente a impostare il file di destinazione. Penso che sia uno dei problemi con DSL: non puoi assicurarti che l'utente parli correttamente la lingua, poiché non puoi assicurarti che gli utenti di Overflow dello stack parlino correttamente in inglese ... – David

+1

Se guardi il DSL di Cucumber, oggetto. property.should == "something", il "== 'something'" può sembrare optionnal. Tuttavia, la frase non sembra corretta quando non c'è niente dopo il dovrebbe. Nello stesso modo in cui la frase non sembra corretta quando si tenta di aggiungere del testo a nulla. – David

3

Penso che tutto dipenda da come si desidera utilizzare la propria DSL. Sembra ragionevole che si vorrebbe per consentire varie opzioni su un singolo file in una corsa, in modo forse si potrebbe prendere in considerazione qualcosa di simile

on 'database.yaml' do 
    append 'windows' 

    line 16 do 
    indent 2.spaces 
    end 

    lines 3,6,7 do 
    delete 
    end 
end 

Il che significa che prima di definire un ambito (un file, una linea, una serie di linee, un blocco ecc.) e quindi un insieme di operazioni da eseguire su di esso. Ma, ancora una volta, siamo programmatori, forse "utente medio" vorrebbe usare qualcosa di più simile a un linguaggio naturale, come hai iniziato.

2

scrivo un post sul blog di ieri DSL, non risponde alla tua domanda DSL specifici file system, ma dovrebbe fornire informazioni sufficienti per prendere una decisione

Slick code with simple DSLs thanks to Ruby

+0

ottimo post! segnalarlo male! il blocco [email] è uguale a yield (email)? –

+0

+1 Link impressionante –

1

alcune idee:

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