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