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 Databaseclass 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

--

--