Download - JRuby e DSL
JRuby e DSLsLuca Guidi - Sourcesense
Java Day Roma - 1 Dic 2007
DSLs cosa sono?
Domain Specific Language
DSLs
•single purpose
•singolo dominio
Linguaggi di programmazione
•general purpose
•multi dominio
YACC (1975)Stephen C. Johnson
UNIX scripting
ls | grep dsl >> ~/list.txt
favoriscono le ontologie
Ontologia: rappresentazione strutturata delle informazioni espressa tramite
gerarchie e relazioni tra classi.
Behavior Driven Development
it "tracks implicit observable models" do instance = FooObserver.new instance.send(:observed_classes).should include(Foo) instance.send(:observed_classes).should_not include(ObservedModel)end
should
Secondo Martin Fowleri DSL sono:
•Esterni (XML)
•Interni (Smalltalk, Ruby)
Java
•Non dinamico
•Strongly typed
<?xml version="1.0" encoding="UTF-8"?><book> <attribute id="title"> <required>true</required> <length> <minimum>1</minimum> <maximum>23</maximum> </length> </attribute></book>
Annotations
import java.lang.reflect.*;
public class Book { @Size(min=1, max=23) protected String title; public Book (String title) { setTitle(title); } public String getTitle() { return this.title; } public void setTitle(String title) { this.title = title; } public boolean isValid() throws NoSuchFieldException, SecurityException { Size size = (Size) this.getClass().getDeclaredField("title") .getAnnotation(Size.class); return ( title != null && ( title.length() >= size.min() || title.length() <= size.max() ) ); }}
import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.FIELD)public @interface Size { public int max() default 0; public int min() default 0;}
module Validations def validates_presence_of(*attributes) # ... end def validates_size_of(*attributes) # ... endend
class Book extend Validations validates_presence_of :title validates_size_of :title, 1..23end
Nella mia esperienza,la cosa più affascinante è che i programmi Ruby ben scritti sono già un DSL, a causa della sintassi
del linguaggio.
Jamis Buck - 37 signals
Ruby
• Symbol
• Block
• Module
• Splat
• eval, instance_eval, class_eval
• define_method, alias_method
Ruby DSLs
Method Class
class Carrot < ActiveRecord::Base belongs_to :bunnyend
class Bunny < ActiveRecord::Base has_many :carrotsend
Top Levelnamespace :db do desc "Create a database connection." task :connect do # ... end desc "Prepare the database for tests." task :prepare => :connect do # ... endend
Sandbox
ActiveRecord::Schema.define do create_table :bunnies do |t| t.column :name, :string, :null => false endend
ActiveRecord::Schema.define do drop_table :bunniesend
Piattaforma Java
Java => JRubyrequire 'java'include_class 'java.util.Random'
class JavaRandom def self.next @@r ||= Random.new @@r.nextInt endend
JavaRandom.next # => 23
JRuby => Java
import org.jruby.*;
public class UsingRuby { public static void main(String[] args) { Ruby runtime = Ruby.getDefaultInstance(); runtime.evalScript("puts 1 + 2"); }}
www.lucaguidi.comwww.sourcesense.com
www.pronetics.it