2010年11月26日金曜日

第15章 Facadeパターン : シンプルな窓口



Facadeはファサードって読むらしいです。フランス語。
概要とポイントは本文から引用します。
Facadeパターンは、複雑にからみ合ってごちゃごちゃした詳細をまとめ、高レベルのインターフェイス(API)を提供します。(中略)Facade役はシステムの内側にある各クラスの役割や依存関係を考えて、正しい順番でクラスを利用します。
非常に大きなシステムが、多数のクラス・多数のパッケージを抱えるとき、要所要所にFacadeパターンを適用すると、システムはより便利になるでしょう。
はっきりと言葉で表現できるノウハウは、プログラマの頭の中に隠しておくべきものではなく、コードとして表現しておくべきものなのです。
いつも決まった手順でクラスを利用するときは、その手順そのものをクラス(メソッド)にしてしまおうということです。

--

今回は練習問題の、リンク集をつくる方を書きました。
また、色々簡略化しています。

実行結果
linkpage.html
<html><head><title>Link page</title></head><body>
<h1>Link page</h1>
<p><a href="mailto:hyuki@hyuki.com">Hiroshi Yuki</a></p>
<p><a href="mailto:hanako@hyuki.com">Hanako Sato</a></p>
<p><a href="mailto:tomura@hyuki.com">Tomura</a></p>
<p><a href="mailto:mamoru@hyuki.com">Mamoru Takahashi</a></p>
</body></html>

ソースコード
#!/usr/bin/env python
# -*- coding: utf8 -*-

class Database:
    def __init__(self): raise Exception("Do not construct instances")
    @classmethod
    def getProperties(cls):
        return [
                 ("hyuki@hyuki.com","Hiroshi Yuki")
                ,("hanako@hyuki.com","Hanako Sato")
                ,("tomura@hyuki.com","Tomura")
                ,("mamoru@hyuki.com","Mamoru Takahashi")
                ]

class HtmlWriter:

    def __init__(self, fsock):
        self.__fsock = fsock

    def __print(self, string):
        try:
            print >>self.__fsock, string
        except IOError, (errno, strerror):
            print "I/O error(%s): %s" % (errno, strerror)

    def makeTitle(self, title):
        self.__print("<html><head><title>"+title.encode("utf_8")+"</title></head><body>")
        self.__print("<h1>"+title.encode("utf_8")+"</h1>")

    def makeParagraph(self, string):
        self.__print("<p>"+string.encode("utf_8")+"</p>")

    def makeLink(self, href, caption):
        self.makeParagraph('<a href="%s">%s</a>' % (href, caption))

    def makeMailTo(self, mailaddr, username):
        self.makeLink('mailto:'+mailaddr, username)

    def close(self):
        self.__print("</body></html>")
        self.__fsock.close()


class PageMaker:
    def __init__(self): raise Exception("Do not construct instances")

    @classmethod
    def makeLinkPage(cls, filename):
        try:
            fsock = open(filename, 'w')
        except IOError, (errno, strerror):
            print "I/O error(%s): %s" % (errno, strerror)

        htmlwriter = HtmlWriter(fsock)
        dbList = Database.getProperties()

        htmlwriter.makeTitle("Link page")
        for t in dbList:
            htmlwriter.makeMailTo(t[0], t[1])
        htmlwriter.close()


def main():
    PageMaker.makeLinkPage("linkpage.html")

if __name__=='__main__': main()

0 件のコメント:

コメントを投稿