jruby rules

32
Arjan Blom Profict (J)Ruby Rules Engine

Upload: robbert

Post on 05-Dec-2014

1.894 views

Category:

Business


2 download

DESCRIPTION

Arjan Blom's slide's of his presentation at the RubyenRails 2007 conf in Amsterdam.

TRANSCRIPT

Arjan BlomProfict

(J)Ruby Rules Engine

Agenda

Rule EngineDSL/BNL

Metaprogrammeren

JRuby

Business Rules ?

“Het bel tegoed moet minimaal €2,- zijn”

=> “Het bel tegoed moet minimaal €2,- zijn”

=> “Het bel tegoed moet minimaal €2,- zijn”

=> “Het bel tegoed moet minimaal €2,- zijn”

=> “Het bel tegoed moet minimaal €2,- zijn”

Bellen

SMS

MMS

Video

“Het bel tegoed moet minimaal €1,- zijn”

=> “Het bel tegoed moet minimaal €1,- zijn”

=> “Het bel tegoed moet minimaal €2,- zijn”

=> “Het bel tegoed moet minimaal €1,- zijn”

=> “Het bel tegoed moet minimaal €1,- zijn”

Bellen

SMS

MMS

Video

Bellen

SMS

MMS

Video

Rule engine

[when]There is a customer ticket with status of "{status}"=customer : Customer( ) ticket : Ticket( customer == customer, status == "{status}" )

[when]There is a "{subscription}" customer with a ticket status of "{status}"=customer : Customer(subscription == "{subscription}") ticket : Ticket( customer == customer, status == "{status}")

[then]Log "{message}"=System.out.println("{message} " + ticket);

[then]Escalate the ticket=ticket.setStatus("Escalate"); modify(ticket);

[then]Send escalation email=sendEscalationEmail( customer, ticket );

JBoss Rule Example

Domain Specific Language

● DRY● Mogelijk lastiger te

begrijpen

Business Natural Language● DAMP

● Zelfstandig● Bevordert de

leesbaarheidJay Fields

compensate $3000 each past 30

compensate $3000 for each deal closed in the past 30 days

Van een Boeking mag de datum niet groter zijn dan de project einddatum

Van een Boeking mag de datum niet groter zijn dan de project einddatum

.getDatum < .getProject.getEindDatum

_groter_niet

_project _boeking

_einddatum _datum

Semantiek transformator

Klassen

keywords "groter" do"> "

end

domain_class("Boeking","nl.profict.stage.urenreg.domein.Boeking")

filter

Van een Boeking mag de datum niet groter zijn dan de project einddatum

_van._een._Boeking._mag._de._datum._niet._groter._zijn._dan._de._project._einddatum!

instance_eval(RULE)+

domein klasse methodes _boeking

_project

+method_missing(method , *args)

_van._een._Boeking._mag._de._datum._niet._groter._zijn._dan._de._project._einddatum

Nieuwe Rule Class

def method_missing(sym, *args) # geen methode gevonden transform(sym.to_s) self

end

def transform(rule_piece)case

when @semantics.respond_to?(rule_piece) append(@semantics.send(rule_piece))

[...]

Rule Class

def _groter “> ” end

Semantiek Class

mag de datum niet groter zijn dan de project einddatum

getDatum < getProject.getEindDatum Boeking.getdatum < Boeking.getProject.getEindatum

JRuby

Snelheid (JIT)

Java technieken / libs

Ondersteuning door grote spelers (sun)

Ruby op Java Applicatie Server

bsfManager = new BSFManager();

BSFManager.registerScriptingEngine("ruby", "org.jruby.javasupport.bsf.JRubyEngine", new String[] { "rb" });

bsfManager.registerBean("Object", domainObject);

bsfManager.eval("ruby","(java)",1,1,

"puts \"This is a test.\"");

Gebruik de juiste communicatie middelen

Onderschat niet de JAS

Pas op met method_missing

DEMO

Vragen ?

?e-mail :

[email protected]