最終回となる今回は、
レビュー:内部DSLと外部DSL
内部DSLを採用したDSLは、
外部DSLは、
内部DSLを学習するにあたり耳にする言葉は、
次は、
Fluent Interface - 流暢なインターフェース
一般的なプログラムは、
例を挙げて説明します。コーヒーショップでコーヒーの注文を受ける簡単なアプリケーションを考えます。
一般的なプログラムでは、
Fluent Interfaceは、
order = Order.new
order.add(Coffee.new(:LATTE, :TALL, {milk=>:SOY})
order.add(Coffee.new(:CAPPUCCUINO, :SHORT, {milk=>:NON_FAT})
order.add(Coffee.new(:AMERICANO, :GRANDE)
order.prepare
order = Order.new
.with(:LATTE, :size=>:TALL, :milk=>:SOY)
.with(:CAPPUCCUINO, :size=>:SHORT, :milk=>:NON_FAT)
.with(:AMERICANO, :size=>:GRANDE)
.prepare
Fluent Interfaceは、
List<Contact> results = jdbcManager.from(Contact.class)
.join("prefecture")
.where("id in (? , ?)", 1, 2)
.orderBy("last_name")
.getResultList();
しかし、
2つ目は、
動的受信
Fluent Interfaceを紹介するときに必ずと言って良いほど引き合いに出されるのが、
リスト4XmlMarkup
require 'builder/xmlmarkup'
xml = Builder::XmlMarkup.new(:indent=>2)
puts xml.html {
xml.head {
xml.title "Fluent Interface"
}
xml.body {
xml.comment! "comment"
xml.div {
xml.h1("Header")
xml.p("paragraph")
}
}
}
<html>
<head>
<title>Fluent Interface</title>
</head>
<body>
<!-- comment -->
<div>
<h1>Header</h1>
<p>paragraph</p>
</div>
</body>
</html>
XmlMarkupは、
このmethod_
class Greeter
GREETINGS = {
:dutch => 'Hallo',
:english => 'Hello',
:french => 'Bon Jour',
:japanese=> 'こんにちは',
:spanish => 'Hala'
}
def method_missing(method_name, *args)
name = method_name.to_s.split(/_/).first
language = method_name.to_s.split(/_/).last.to_sym
return unless name == 'greet'
puts GREETINGS[language] + '!'
end
end
greeter = Greeter.new
greeter.greet_in_dutch #=> Hallo!
greeter.greet_in_english #=> Hello!
greeter.greet_in_french #=> Bon Jour!
greeter.greet_in_japanese #=> こんにちは!
greeter.greet_in_spanish #=> Hala!
“method_
最後に
DSLは、
今回の連載では、