今そこにある“DSL”
第3回 流暢なインターフェース
最終回となる今回は,
レビュー:内部DSLと外部DSL
内部DSLを採用したDSLは,
外部DSLは,
内部DSLを学習するにあたり耳にする言葉は,
次は,
- ※1)
- 『Domain-Driven Design』
(ISBN-10: 0321125215)
Fluent Interface - 流暢なインターフェース
一般的なプログラムは,
例を挙げて説明します。コーヒーショップでコーヒーの注文を受ける簡単なアプリケーションを考えます。
一般的なプログラムでは,
Fluent Interfaceは,
リスト1一般的なプログラム
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
リスト2Fluent Interface
order = Order.new
.with(:LATTE, :size=>:TALL, :milk=>:SOY)
.with(:CAPPUCCUINO, :size=>:SHORT, :milk=>:NON_FAT)
.with(:AMERICANO, :size=>:GRANDE)
.prepare
Fluent Interfaceは,
リスト3Searsar S2JDBCの例
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")
}
}
}
リスト5リスト4による出力結果
<html>
<head>
<title>Fluent Interface</title>
</head>
<body>
<!-- comment -->
<div>
<h1>Header</h1>
<p>paragraph</p>
</div>
</body>
</html>
XmlMarkupは,
このmethod_
リスト6 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は,
今回の連載では,