デザインパターンのエッセンス
デザインパターン一覧
デザインパターンの記事を書き終えたので、まとめておきます。各々のデザインパターンの詳細は、下記のページをご覧ください。
デザインパターンが重要なワケ
どのような言語でも、プログラミングの学習はたいていの場合、世界にこんにちはとつぶやくところから始まる。例えばJavaの場合は、以下のようになる。
System.out.println("Hello World!");
その後、次のように変数が定義できることを知る。
int a = 1;
次に、関数を定義できることを知る。
int myFunc(int a) { return a++; }
オブジェクト指向に基づくプログラミング言語の場合は、クラスという概念も学ぶことになるだろう。
public myClass { public int a = 1; public int myFunc(int b) { return a + b; } }
このようにしてプログラムをひととおり学ぶと、どんなアルゴリズムは自分で作れるようになる。これでプログラミングの学習は終わり。めでたしめでたし。…と思いきや、そうは問屋が卸さない。
"好きなようにプログラミングできる"ことは、"どのように実装するかを選択する"ことをプログラマに強いる。そして、プログラマは例えば次のような悩みを持つだろう。
- 継承と委譲をどう使うか
- どのようにメソッドを切るか
- ロジックをどうやって共通化するか
- 機能と実装をどうやって分離するか
- 拡張性を保持するにはどうすべきか
- 再利用性を保証するにはどうすべきか
- 可読性を高めるにはどうすべきか
- …
これらの悩みに対して、プログラマは長年にわたって知見を蓄積してきた。それらのTipsをプログラム設計のカタログとしてまとめたものが、デザインパターンである。デザインパターンは、プログラマが培ってきたプログラミングのパターンを集約したものと考えてよい。
したがって、綺麗なコードを書くための第一歩は、デザインパターンの理解から始まる。また、あまり気付かれないが、既存のコードを読むためにもデザインパターンの習得が重要である。
デザインパターンを分かりやすく
デザインパターンの解説書や解説しているホームページは数多くあるが、読むのがうんざりするほど長い。デザインパターンの解説なのに、デザインパターン以外の部分がこれでもかと盛り込まれている。また、ページをまたいで解説されているため、理解がしにくい。
そこで、本ブログではデザインパターンのエッセンスだけを以下にまとめた。JavaプログラムをUMLに併記することで、一目で流れを確認できるようにしている。UMLが読める人でJavaの文法をひととおり勉強した人であれば、お役に立つのではと思う。
参考・引用
- 作者: 結城浩
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2004/06/19
- メディア: 大型本
- 購入: 51人 クリック: 762回
- この商品を含むブログ (394件) を見る
デザインパターンのエッセンス~振る舞いパターン~
デザインパターンの解説は数多あるけれど、そもそも例が複雑で分かりにくい!というわけで、UML1枚のみでシンプルに説明するシリーズ第3弾(最終回)。
生成に関するパターンと構造に関するパターンに引き続き、今回は振る舞いに関する11個のパターン。
13. Chain of Responsibilityパターン
- 責任をたらい回しを行うパターン。
- イベントの送受信を行う複数のオブジェクトを鎖状につなぎ、それらの間をイベントが渡されてゆくようにする。
14. Commandパターン
- 命令をメソッドではなく命令を表すクラスのインスタンスという1個の「もの」として表現するパターン。
- 複数の異なる操作について、それぞれに対応するオブジェクトを用意し、オブジェクトを切り替えることで操作の切替えを実現する。
17. Mediatorパターン
- オブジェクト同士がすべて相談役を介してやりとりするパターン。
- オブジェクト間の相互作用を仲介するオブジェクトを定義し、オブジェクト間の結合度を低くする。
18. Mementoパターン
- インスタンスの状態を表す役割を導入し、カプセル化の破壊に陥ることなく保存と復元を行うパターン。
- データ構造に対する一連の操作のそれぞれを記録しておき、以前の状態の復帰または操作の再現が行えるようにする。
20. Stateパターン
- 状態をクラスで表現するパターン。
- オブジェクトの状態を変化させることで、処理内容を変えられるようにする。
22. Template Methodパターン
- スーパークラスで処理の枠組みを定め、サブクラスでその具体的内容を定めるパターン。
- あるアルゴリズムの途中経過で必要な処理を抽象メソッドに委ね、その実装を変えることで処理が変えられるようにする。
23. Visitorパターン
- データ構造の中をめぐり歩く訪問者のクラスを用意し、そのクラスが処理を行うパターン。
- データ構造を保持するクラスと、それに対して処理を行うクラスを分離する。
デザインパターンのエッセンス~構造パターン~
デザインパターンの解説は数多あるけれど、そもそも例が複雑で分かりにくい!というわけで、UML1枚のみでシンプルに説明するシリーズ第2弾。
今回は、構造に関する7つのパターン。生成に関するパターンはこちら。
6. Adapter
- すでに提供されているものと必要なもののずれを埋めるデザインパターン。Wrapperパターンとも呼ばれる。
- 元々関連性のない2つのクラスを接続するクラスを作る。
- 継承を用いる方法
- 委譲を用いる方法
8. Composite
- 容器と中身を同一視し、再帰的な構造を作るパターン。
- 再帰的な構造を表現する。
デザインパターンのエッセンス~生成パターン~
デザインパターンの解説は数多あるけれど、そもそも例が複雑で分かりにくい!そこで、デザインパターンのエッセンスのみを抽出し、Javaのソースコードを併記することで、UML1枚ずつでシンプルに説明する。
デザインパターンには、生成に関するパターン・構造に関するパターン・振る舞いに関するパターンがあるが、今回は生成に関する5つのパターンを取り上げる。
EclipseでMahout環境を構築する
目的
Mahoutは、Hadoop上で動くスケーラブルなオープンソース機械学習ライブラリである。今回は、Mahoutをソースコードレビューするために、Eclipseに取り込む。実行環境ではないので悪しからず。OSはWindowsを使用している。
方法
1.以下のサイトにアクセスする。
2.必要そうなものをダウンロードする。mahout/やhadoop/からダウンロードできる。例えば以下のjarファイルをC:\Program Files (x86)\pleiades\3_7_Indigo\libに保存する。
mahout-core-0.7-cdh4.1.2.jar mahout-core-0.7-cdh4.1.2-sources.jar mahout-math-0.7-cdh4.1.2.jar mahout-math-0.7-cdh4.1.2-sources.jar mahout-examples-0.7-cdh4.1.2.jar mahout-examples-0.7-cdh4.1.2-sources.jar hadoop-core-2.0.0-mr1-cdh4.1.2.jar hadoop-core-2.0.0-mr1-cdh4.1.2-sources.jar hadoop-example-2.0.0-mr1-cdh4.1.2.jar hadoop-example-2.0.0-mr1-cdh4.1.2-sources.jar
3.Eclipseを起動させる。
4.ファイル > 新規 > Javaプロジェクト > プロジェクト名を記入して次へ > ライブラリータブをクリック > 外部JARの追加 > ダウンロードしたjarファイルをすべて選択して開く。
5.各jarの左をクリック > ソース添付をダブルクリック > 外部ファイル > ソースファイルを開く。設定後の画面は以下のとおり。
6.これにて環境構築完了。例えば、mahout-exampleにはkddcup 2011を解くプログラムらしきものが含まれていますね・・・。
How to Run Kdd2013AuthorPaperIdentification Benchmark
What is Kdd2013AuthorPaperIdentification?
- KDD Cup is the well-known data mining competition of the annual ACM SIGKDD International Conference on Knowledge Discovery and Data Mining.
- KDD Cup 2013 -> https://www.kaggle.com/c/kdd-cup-2013-author-paper-identification-challenge
How to Build Benchmark Environment?
- Add exclude to /etc/yum.repos.d/CentOS-Base.repo file [base] and [updates] sections to exclude PostgreSQL Packages:
[base] ... exclude=postgresql* [updates] ... exclude=postgresql*
- Install PostgreSQL 9.2 and others:
# Only PostgreSQL 9.2 can store dataRev2.postgres rpm -Uvh http://yum.postgresql.org/9.2/redhat/rhel-6-x86_64/pgdg-centos92-9.2-6.noarch.rpm yum install postgresql92 postgresql92-server postgresql92-contrib postgresql92-libs postgresql92-devel # Python installation yum install python yum install python-devel # Numpy installation yum install numpy # Scipy installation yum install scipy # g++ installation yum install gcc-c++ # pip installation yum install pip # psycopg2 installation (not available by yum) pip install psycopg2 # scikit-learn installation (not available by yum) pip install -U scikit-learn
PostgreSQLのインストール
PostgreSQLのインストールにつまづいたので、ポイントを書いておきます。
- 環境
- Windows7
- PostgreSQL 9.2.4
ポイント1: .exeでインストールしてもPATHが通らない
.exeの標準設定でインストールして、ログインしようとすると、以下のようなエラーが出た。
C:\>psql -U postgres psql: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
バージョンを確認してみると、8.2.11??
C:\>psql --version psql (PostgreSQL) 8.2.11 contains support for command-line editing
何かのアプリケーションをインストールしたときにPostgreSQLもインストールされていて、それにアクセスしようとしていたようだ。
しかも.exeを実行してもPATHが設定されていなかった。
というわけで、スタート>コンピュータ>システムのプロパティ>システムの詳細設定>詳細設定>環境設定>システム環境設定>変数PATHの値にインストールしたパス(デフォルトでは"C:\Program Files\PostgreSQL\9.2\bin";)を先頭に加える。
ポイント2: ポート番号を合わせる
再びアクセスしようとすると下記のエラー。
C:\>psql -U postgres psql: could not connect to server: Connection refused (0x0000274D/10061) Is the server running on host "localhost" (::1) and accepting TCP/IP connections on port 5432? could not connect to server: Connection refused (0x0000274D/10061) Is the server running on host "localhost" (127.0.0.1) and accepting TCP/IP connections on port 5432?
dataの中にあるpostgresql.confからポートを確認すると、ポート番号が一致していない。
port = 5433 # (change requires restart)
以前インストールしたPostgreSQLが5432を使ってしまっていた。
以前のPostgreSQLには port = 5431 としてもらい、最新版を port = 5432 に変更して、保存して、再起動(pgAdminIIIからサービスの停止→サービスの再開)。
ポイント3: psqlとserverのバージョンを合わせる
やっと接続できた。が、psqlとserverのバージョンが異なるというWARNINGが出ている。
C:\>psql -U postgres psql (9.2.4, server 9.1.9) WARNING: psql version 9.2, server version 9.1. Some psql features might not work. Type "help" for help.
pgAdminIIIからPostgreSQL 9.1のサービスを停止し、PostgreSQL 9.2に接続でWARNINGが出なくなった。
C:\>psql -U postgres psql (9.2.4) Type "help" for help. postgres=# \q