jruby rules
DESCRIPTION
Arjan Blom's slide's of his presentation at the RubyenRails 2007 conf in Amsterdam.TRANSCRIPT
=> “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 €2,- zijn”
=> “Het bel tegoed moet minimaal €1,- zijn”
=> “Het bel tegoed moet minimaal €1,- zijn”
Bellen
SMS
MMS
Video
[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
Van een Boeking mag de datum niet groter zijn dan de project einddatum
.getDatum < .getProject.getEindDatum
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!
_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
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.\"");