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 件のコメント:
コメントを投稿