jruby e dsl

Post on 28-May-2015

2.106 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Panoramica sui DSL e sul loro utilizzo con i linguaggi dinamici.

TRANSCRIPT

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"); }}

top related