pythonによるデザインパターン[Facade]
# Intro
この文章は結城 浩さんの「Java言語で学ぶデザインパターン入門」を、pythonで実装してみたサンプルコードです。
筆者の環境は以下の通りです。Python 3.6.3
まだ修行中の身なので間違いがあると思いますがご了承ください。 今回は「Facade」です。
最初ふぁけーど、って何🙃と、思いましたが、あの自由な立面(ファザード)のファザードです。つまり建物の正面という意味らしいです。
# Summarise
本書のp224によると、 Facadeとは
複雑に絡み合ってごちゃごちゃした詳細をまとめ、高レベルのインターフェース(API)を提供する
とあります。複雑な処理を一つの関数・クラスにまとめてあげて、使う側は1度の関数・クラスで、複雑な処理を実行できるようにするということです。
# Practice
## Specification
以下のhtmlを作成するプログラムを作ります。
今回メールアドレスを取得するときは(malto
)、メールアドレスがkey、メユーザー名がvalueとなっている以下のjsonファイルから、ユーザー名を取得します。この機能をclass Database
にまとめてください。
{
"hyuki@hyuki.com": "Hiroshi Yuki",
"hanako@hyuki.com": "Hanako Sato",
"tomura@hyuki.com": "Tomura",
"mamoru@hyuki.com": "Mamoru Takahashi"
}
そして、 class HtmlWriter
では実際のhtmlを作成します。
重要なのはmain関数からは class PageMaker
のクラスメソッドdef make_welcome_page
を呼び出すだけにしてください。
## Explanation
まずはjsonからユーザー名を取得する class Database
を作成します。
ただjsonをparseしているだけなので説明は省きます。
次にhtmlを作成するclass HtmlWriter
を作ります。
これもただfile objectにhtmlを書き込んでいくだけなので、説明は省きます。
最後に class Database
と class HtmlWriter
を用いて、指定したユーザーのwebページを作る class PageMaker
を実装します。
中の処理は読めばわかるので省略しますが、重要なのはこのクラスを作成することのよって、main関数からは
PageMaker.make_welcome_page('hyuki@hyuki.com', 'welcome.html')
と記述するだけでhtmlが作成されます。もしかしたら、こんなクラスを作成せずにmain関数に同じことを書けば良いじゃないか?と思うかもしれません。ですが、例えば以下のように2人分のユーザを作成したいとき、class PageMaker
を使えば
PageMaker.make_welcome_page('hyuki@hyuki.com', 'welcome.html')
PageMaker.make_welcome_page('mamoru@hyuki.com', 'welcome2.html')
と書けますが、class PageMaker
がなければ同じような複雑な処理を2度main関数に書かなければいけなくなります。
つまり外部に対しては1つのAPI(メソッド)だけを見せており、複雑な処理は隠蔽しているのです。
## Sample Code
# Conclusion
正直言ってこのパターンを聞いたとき、「なにを当たり前なことを言っているんだろう🧐」と思いました。関数の基本として複雑な処理をまとめ上げることによって、再利用できるようにすることですから、わざわざ名前をつけてデザインパターンと宣言する理由がよくわからないです…
私がこのように処理を一つのクラス・関数にまとめ上げる時に大変なのが、「どれくらい処理をまとめるか」です。
まとめすぎたらまとめすぎたで部品化できず、再利用し辛くなり、逆にまとめなかったら部品ばっかりになり同じような記述が増えてしまうことです。恐らくこれは経験していくうちに、この程度なら関数・クラスとしてまとめておいた方が良いかもしれない、というセンスが磨かれていくと信じているので、沢山経験を積んで行きたいです。
# ref
- 「増補改訂版 Java言語で学ぶデザインパターン入門」 結城浩(著)第11版