2010-08-19 6 views
5

Ich versuche mein eigenes DSL für Dateimanipulation zu programmieren, nur um zu lernen.Entsprechende DSL-Syntax

Mein Ziel ist es verständlich und einfach zu programmieren.

Hier gibt es 3 Alternativen für einen String in einen database.yml anhängt:

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 ein wenig in all diesen Alternativen verloren.

Könnte jemand mit Erfahrung in DSL mir eine Anleitung geben und erklären, was das Für und Wider mit jedem ist?

Jeder wird gleich gelesen, aber ich möchte wissen, welche Best Practice für DRY und gute Codierung Standard folgt.

EDIT: Ich denke, es wird gut sein, wenn ich einige optionale Parameter angeben könnte z.

So betrachtet, denke ich, dass ich die Methodenaufrufe verwenden muss. Denn wenn ich Alternativen 4-5 verwende, kann ich bei Angabe von force => true nicht wissen, ob es sich um die Zeichenkette oder die Datei handelt.

+0

@musicfreak. Alle sind gleich gelesen. Die nächste Frage, die ich vermute, ist die, die einem "Best Practice" für DRY folgt. –

+1

Vielleicht sollten Sie die Domain angeben: Wer ist der Zielbenutzer, welche Art von Dateimanipulation wollen Sie, was wird der Umfang Ihrer 'DSL' sein? – David

Antwort

4

Für mich scheint jede Option in Ordnung.

Wenn Sie (oder Benutzer) immer auf "database.yml" schreiben, aber anhängende Inhalte sind unterschiedlich, folgende möglicherweise besser.

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

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

Wenn Sie (oder Benutzer) wollen „Fenster“ immer für verschiedene Datenbankdateien, folgende kann in Ordnung sein anhängen.(Vielleicht seltenen Fall ,,)

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

Wie dem auch sei, ich denke, die bessere Wahl, es selbst zu nutzen oder fragen Sie Ihren Benutzernamen und anschließend verfeinern.

3

Das beste DSL, das ich kenne, kümmert sich normalerweise um den Typ für Sie. Also würde ich den Typ des angehängten Wertes nicht angeben. Dies würde alle Alternativen ausschließen, die das Wort "string" enthalten, und möglicherweise auch alle Alternativen, die das Wort "file" enthalten.

Ich persönlich wie diese hier:

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" 

wenn ich Alternativen verwenden 4-5 dann, wenn ich angeben : force => true, kann ich nicht wissen, ob es für die Zeichenfolge ist oder die Datei.

Ich sehe es nicht als ein Problem, die optionalen Parameter zielen in der Regel auf die Aktion. Sie sind weder für die Zeichenfolge noch für die Datei spezifisch. Wenn Sie Folgendes festlegen: force => true, erzwingen Sie das Anhängen.

+0

Die Varianten 3-6 sehen so aus, als wäre der Dateiname optional, was nicht gerade eine gute Idee ist. –

+0

Tatsächlich zwingt keine der auf dieser Seite vorgeschlagenen Alternativen den Benutzer, die Zieldatei festzulegen. Ich denke, das ist eines der Probleme mit DSL: Sie können nicht sicherstellen, dass der Benutzer die Sprache korrekt spricht, da Sie nicht sicherstellen können, dass Stack Overflow-Benutzer Englisch korrekt sprechen. – David

+1

Wenn Sie auf Cucumbers DSL schauen, Objekt. property.should == "Etwas", das "== 'etwas'" kann optional aussehen. Der Satz scheint jedoch nicht korrekt zu sein, wenn nichts nach dem Soll ist. Genauso wie der Satz nicht korrekt aussieht, wenn Sie versuchen, einen Text an nichts anzufügen. – David

3

Ich denke, es hängt alles davon ab, wie Sie Ihr DSL verwenden möchten. Es scheint sinnvoll, dass man mehrere Optionen auf einer einzigen Datei in einem Lauf durchführen möchte, so könnten Sie vielleicht so etwas wie

on 'database.yaml' do 
    append 'windows' 

    line 16 do 
    indent 2.spaces 
    end 

    lines 3,6,7 do 
    delete 
    end 
end 

Bedeutung der Ansicht, dass zuerst definieren Sie einen Bereich (eine Datei, eine Linie, eine Reihe von Zeilen, ein Block usw.) und dann eine Reihe von Operationen, die darauf ausgeführt werden sollen. Aber andererseits sind wir Programmierer, vielleicht möchte "durchschnittlicher Benutzer" etwas, das einer natürlichen Sprache ähnelt, wie Sie begonnen haben.

2

ich einen Blog-Post auf DSL gestern schreiben, ist es nicht das Dateisystem-spezifische DSL Frage beantworten, aber es sollte Ihnen genügend Informationen bieten eine Entscheidung

Slick code with simple DSLs thanks to Ruby

+0

toller Beitrag! Lesezeichen setzen! ist Block [email] dasselbe wie yield (email)? –

+0

+1 Awesome Link –

1

einige Ideen zu machen:

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 
Verwandte Themen