のぶLab.

流しのソフトウェアエンジニアの雑記帳. Android, Scala, Clojure, Ruby on Railsなど

GOFデザインパターンをPythonで - Mediator

こちらの写経です。

Mediator

オブジェクト間で調整が必要な場合の取りまとめを行う。
オブジェクト同士がお互いを参照しあうことがないようにして、低結合を保つ。

GOFデザインパターンをPythonで - Facade

こちらの写経です。

Facade

複数のクラスやメソッドを呼び出す場合、クライアントが呼び出し順などを意識する必要のないよう、一連の処理をまとめて、一つのインターフェイスで提供する。

ここでは各TCクラスのメソッド呼び出しをTestRunnerのrunAll()でひとまとめにして一つのインターフェイスを提供している。

参考

15.Facadeパターン | TECHSCORE(テックスコア)
http://www.techscore.com/tech/DesignPattern/Facade.html/

GOFデザインパターンをPythonで - Decorator

こちらの写経です。

Decorator

あるクラスに機能を追加したい場合、DecoratorはDecorateeを引数にとるなどしてインターフェイスを同一視して機能拡張が可能。

参考

12. Decorator パターン | TECHSCORE(テックスコア)
http://www.techscore.com/tech/DesignPattern/Decorator.html/

GOFデザインパターンをPythonで - Strategy

こちらの写経です。

Strategy

状況によってアルゴリズムを変更する必要がある場合に有効。
if分の分岐内にアルゴリズムをかき分ける必要がなくなる。

アルゴリズムカプセル化アルゴリズムを呼び出すインターフェイスのみ提供する。
クライアントはそのアルゴリズムの実装については知っている必要がない。

参考

10. Strategy パターン | TECHSCORE(テックスコアhttp://www.techscore.com/tech/DesignPattern/Strategy.html/
how is this Strategy Pattern written in Python? (the sample in Wikipedia) - Stack Overflow
http://stackoverflow.com/questions/963965/how-is-this-strategy-pattern-written-in-python-the-sample-in-wikipedia

GOFデザインパターンをPythonで - Adapter

こちらの写経です。

Adapter

あるクラスのインターフェイスをクライアントの要求するインターフェイスへ変換する。

ここではAdapterクラスを介してDog、Cat、Human、Carクラス内のメソッドをmake_noise()として呼び出す。

GOFデザインパターンをPythonで - Builder

こちらの写経です。

Builder

具体的な作成物を作成過程に依存しないものにすることで、同じ作成過程で異なるモノを作成することが可能。

ここではDirectorクラスはAbstract ClassであるBuilderクラスのメソッド呼び出す。
具体的に作成するモノについてはBuilderクラスを継承したConcrete BuilderのBuilderHouse、BuilderFlatに記述する。
今後、作成物が追加される場合はConcrete Builderを追加するだけで良い。

GOFデザインパターンをPythonで - Template Method

こちらの写経です。

Tmeplate Method

アルゴリズムのひな形(Skeleton)となるクラスを作成、具体的な処理はサブクラスの定義に任せる。

ここではSkeletonクラスではなくSkeletonメソッドを用意し、
make_template()でSkeletonに任意の関数オブジェクト(ここではGettersとActions)を渡して具体的な処理を行わせています。

iOSのMVCパターンにおけるViewControllerの役割について

iOSのViewControllerの役割がよくわからないので少し調べました。
結局まだよくわかっていないのですが、以下のように書くとうまくいきそうな気がしました。
View -> XIB, UIViewのサブクラス
Controller -> ViewController
Model -> Model用のクラス

iOSMVCで感じた違和感

iOSにはViewControllerというクラスが存在します。
初めて見た時は「ViewとControllerどっちも持ってるの!?MVCじゃなくね!?」
なんて思ってしまいました。

ViewControllerって何?

以下のサイトで議論されていました!
https://qixil.jp/q/823

どうもViewControllerはControllerっぽいです。
でも名前的にViewControllerでModelの制御させるのは違和感ありまくりですね
Modelの制御はModelControllerみたいなもの作って実装したほうがなんかスッキリしそうです。

Vagrant+ChefでDjangoをインストール

VagrantとChefを使ってDjangoをインストールします。

opscodeで公開されているPythonのcookbookを使ってインストールが可能です。
https://github.com/poise/python
こちらのcookbookではPythonと一緒にpipやvirtualenvもインストールしてくれます。
Djangoのインストールは自作のcookbookからpython::pip経由でインストールを行います。

1.site-cookbooksにDjangoをインストールするcookbookを作成

ここではcustomというcookbookを作成します。

cd site-cookbooks
berks cookbook custom

2. default.rbの編集

作成したcustom cookbookのrecipes/default.rbを編集します。

include_recipe "python::pip"

python_pip django do
	version "1.6.1"
	action :install
end

3.Berksfile, Vagrantfileでpython,custom cookbookを指定する

python cookbookはサードパーティ性のcookbookをインストールする手順と同様です。
custom cookbookはBerksfileで path: 'site-cookbooks/customs' としていしてあげてください。

Berksfile

cookbook 'python'
cookbook 'customs', '~> 0.1.0', path: 'site-cookbooks/customs'

Vagrantfile

   ...
config.vm.provision :chef_solo do |chef|
   chef.add_recipe "python"
   chef.add_recipe "custom"

   chef.json = {
      "python" => {
        "instal_method" => "source",
        "version" => "2.7.3",
      },
      ...
   }
end
   ...

GOFデザインパターンをPythonで

参考
Pythonデザインパターン - モジログ
http://mojix.org/2012/08/10/python-patterns

GOFデザインパターンPythonで書かれています
一通り写経して身につけたいですね
今年の目標