2016-10-31 2 views
-2

Ich habe eine Reihe von Ruby-Skripten entwickelt. Jeder von ihnen sollte "in sich abgeschlossen" sein, so dass ein Benutzer es alleine ausführen kann. Aber ich möchte sie auch verwenden, um andere Skripte zu erstellen, zum Beispiel, um ihre Methoden zu verwenden, aber auch um sie als Ganzes auszuführen, ohne 'script.rb `zu machen.Skripting in Ruby

Bisher habe ich nur ein paar Skripte (separate Dateien), in denen ich keine Klassen habe, nur ein paar Methoden. Die Verarbeitung von Benutzereingaben und das Ausführen dieser Methoden liegt außerhalb von Funktionen. Ich sehe, dass dieses Modell nicht richtig ist.

Meine Frage ist, was soll ich jetzt tun, um jedes Skript eigenständig zu halten, aber auch anderen Skripten zu erlauben, es zu benutzen? Sollte jedes Skript nur eine Klasse mit einer Hauptmethode enthalten, die ich ausführen würde object.main?

Oder vielleicht meine Vorgehensweise, ein einfaches Skript zu schreiben, keine Klassen ist auch gut?

Wenn ich ein neues Skript starte, sollte ich immer den objektiven Weg gehen?

+0

Ihre Frage hat zwei nicht verwandte Fragen in ihm. Bitte lesen Sie "[fragen]". Wenn die Fragen eng miteinander verbunden sind, sind sie akzeptabler, aber die Fragen, die nicht zusammenhängen, verringern die Effektivität Ihrer Frage, wenn Sie anderen helfen. –

Antwort

1

Wenn ich ein einzelnes Skript schreibe, wickle ich es oft in eine Klasse. Sie haben auf einige Vorteile hingewiesen, darunter die Wiederverwendung und sauberere Dokumentation.

Ich finde, dass es mehrere Ebenen für Skripte gibt, je nachdem, wie sie verwendet werden. Wenn das Skript einmal ausgeführt wird und nie wieder verwendet wird, kann es möglicherweise nicht in eine Klasse eingebunden werden. Wenn es wichtig ist (Backups von Produktionssystemen zu erstellen), ist es wahrscheinlich wert, es in Form eines vollständigen Edelsteins und Tests zu schreiben. Irgendwo in der Mitte ist die einzelne Zweckklasse. Im Allgemeinen bedeutet dies, dass Sie den Code, der nicht in einer Methode enthalten ist, in den Klassenkonstruktor übernehmen.

Dieser:

#!ruby 

def amethod(i) 
    i+1 
end 

ARGF.each do |l| 
    if l.chomp.to_i > 0 
     puts amethod(l.chomp.to_i) 
    end 
end 

Becomes:

#!ruby 

class OneAdder 
    def amethod(i) 
     i+1 
    end 

    def initialize 
     ARGF.each do |l| 
      if l.chomp.to_i > 0 
       puts amethod(l.chomp.to_i) 
      end 
     end 
    end 
end 

OneAdder.new 
+0

Was würde dein Edelstein enthalten? Nur die OneAdder-Klasse oder vielleicht eine ganze Reihe von Klassen? – damian

Verwandte Themen