Fluent Interface(流れるようなインタフェース)をPythonでやってみよう

30分プログラム、その529。ThoughtWorksアンソロジー ―アジャイルとオブジェクト指向によるソフトウェアイノベーションを読んでいたら「言語内にDSLを作りたいときは、Fluent Interface(流れるようなインタフェース)を使うといいよ!」と書いてあった。
そういえばFluent Interface(流れるようなインタフェース)は書いたことがなかったので、Pythonでやってみよう。
個人的には、内部DSLを作るときはFluent Interfaceを使うよりも、クロージャとかを使うほうが好みです。

使い方

sb = ShapeBuilder()
rect = sb.
       kind('square').
       width(10).
       height(20).
       color('red').
       shape()

ソースコード

#! /usr/bin/python
# -*- mode:python; coding:utf-8 -*-
#
# fluent.py  -
#
# Copyright(C) 2009 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2009/02/17 14:23:48
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#

class Shape():
    def area(self):
        return self.width * self.height

class ShapeBuilder():
    def __init__(self):
        self.subject = Shape()

    def kind(self,kind):
        self.subject.kind = kind
        return self

    def width(self,width):
        self.subject.width = width
        return self

    def height(self,height):
        self.subject.height = height
        return self

    def color(self,color):
        self.color = color
        return self

    def shape(self):
        return self.subject

sb = ShapeBuilder()
rect = sb.kind('square').width(10).height(20).color('red').shape()
print rect.area()