Squeak 4.4 でODBMSを導入する(Magma)


 DBMS を使った事がある方は多いと思いますが、ほとんどが MySQL などの RDBMS なのではないでしょうか?オブジェクト指向言語を使っていても ORM を介して RDBMS でオブジェクトを永続化する方が一般的ではないかと思います。
 ですが、せっかくオブジェクト指向言語を使っているのですから、DBMS もオブジェクト指向でやってみるのも良いのではないでしょうか?

オブジェクト指向データベース管理システム(ODBMS)

 「オブジェクト指向データベース管理システム」についての詳しい説明は他の資料を参照して頂くとして、ここでは簡単に ODBMS を使う動機などを書いておきます。

 大きなところでは「インピーダンス・ミスマッチ」があげられます。RDBMS を使う場合、データは「オブジェクト」形式として存在していますが、DB へ入出力する際には「表」形式として扱わなければなりません。そのため双方への変換が必要になってしまいます。「どのクラス」を「どのテーブル」に対応させて、「どのプロパティ」を「どのカラム」に対応させるかといったアレです。
 最近ではフレームワークによって、その辺りは自動化されていることも多くて大して苦ではないかもしれませんが、仕様変更のたびにルールを書き換えたり DB に手を入れたりするのはバグが入りそうで何か嫌な感じです。
 ODBMS を利用することで、「インピーダンス・ミスマッチ」からは解放されます。何だか良さそうです。

 Squeak ではフリーな ODBMS 実装として “Magma” があります。今回はこちらを使ってみましょう。

 なお、以下は “Getting started with Magma” を参考にしています。

Magma をインストールする

 SqueakMap からのインストールが簡単です。注意が必要なのは “(head)” ではない最新バージョンを入れる事です。”(head)” には開発中のバージョンが上がっていて不安定なようです。ちなみに現在は “SqueakSource3” で管理されているようです。
スクリーンショット 2014-02-25 21.25.58
 対象バージョン(“server”を選択してください)を選択して右クリックメニューから “Install” をクリックするとダウンロード、インストールが始まりますので、終了を待ちます。

データベースを作成する

 次のようにして DB 名とルートオブジェクトを指定することで DB を作成することが出来ます。

MagmaRepositoryController
	create: 'mydb'
	root: Dictionary new.

 DB は “file list” で確認することが出来ます。
スクリーンショット 2014-02-25 21.33.53

セッションを開く

 今回は簡単のためにサーバを立てずにシングルユーザモードで使う事にします。次のようにしてローカル DB へのセッションオブジェクトを取得します。

session := MagmaSession openLocal: 'mydb'.

 セッションが確立出来たら #root を使ってルートオブジェクトを取得する事が出来ます。

session root. "a Dictionary()"

トランザクション処理

 あとは普通にこの Dictionary インスタンスに放り込んでいけば良いのですが、実際のアプリケーションではトランザクション処理をすることが多いと思います。トランザクション処理を行いたい場合は対象の処理をブロックにして #commit: を使うと実現出来ます。

session commit: [
	session root
		at: 'one' put: 1;
		at: 'two' put: 2.
	]
session root at: 'one' "1"

セッションを閉じる

 セッションを閉じる時は #disconnectAndClose を送ります。

session disconnectAndClose

データベースを削除する

 もし DB を削除したい場合は次のようにします。

MagmaRepositoryController delete: 'mydb'

 すると本当に削除して良いのかを確認するノーティファイアが開くので “Proceed” をクリックすると削除されます。大切な DB を削除しないよう気をつけてください。
スクリーンショット 2014-03-01 0.19.38

 さて、 DB の作成、書き込み、DB の削除まで一連の操作を見てきました。あまり DB との境目を感じる事が無かったのではないでしょうか?これがオブジェクト指向プログラミング言語と ODBMS を組み合わせる大きなメリットではないでしょうか?

 一方で分かりやすいデメリットとしてはアプリケーションのオブジェクト構造がそのまま永続化されるため、そのアプリケーション以外では使いやすいとは言えない事が多いようです。例えば、あるアプリケーションが残したデータを KPI 分析で使う、などの場合です。
 また RDB と SQL は集合論という数学の裏付けがしっかりとしているので、数学を応用した操作が出来ますが、 ODB では数学的な裏付けが弱い点がデメリットの一つと言えるかもしれません。

 いずれにせよ様々なシステムを使っておくのは良い経験になると思いますので、 ODBMS に触れた事のない方は触ってみるのはいかがでしょうか?

Squeak 4.4 で作図ツールを導入する(Connectors)


 オブジェクト指向言語である Smalltalk はデザインパターンなどの参考にもってこいです。Browser などを使っても良いのですが、やはり「図で表示出来ると直感的に分かるのに」と思う事もしばしばです。
 そんな時に便利な “Connectors” を導入してみます。

インストールする

 今回は “SqueakMap Catalog” を使ってインストールすることにします。”World” メニューから “open…” をクリックして、”open…” メニューが開いたら “SqueakMap Catalog” をクリックします。
スクリーンショット 2014-01-28 0.12.51

 ”SqueakMap Catalog” が開いたら左側のペインから “Connectors” を選択して開き “head” を右クリックして “install” をクリックするとインストールが始まるので、終わるのを待ちます。
スクリーンショット 2014-01-28 0.13.13

 インストールが無事に終了すると下のようなフラップが増えます。
スクリーンショット 2014-02-02 21.05.53

 こちらのフラップからモーフを引っ張りだしてクラス図などを描くことが出来ます。
スクリーンショット 2014-02-02 21.12.55

 その他に次のようにすることで、継承関係を含めて図示することができます。デザインパターンの分析などをしている時に便利なのではないでしょうか?(見やすいように手動で配置し直しています)

val := NCClassHierarchyDiagrammer new.
val drawBelow: Array.
val removeAll. "削除したい場合はこれを DoIt"

スクリーンショット 2014-02-02 22.54.10

 他にもいくつかのメソッドが用意されているので、Browser で調べて使ってみてください。

Squeak 4.4 のブラウザをリファクタリング機能付きに拡張する(OmniBrowser)


 最近の開発環境にはリファクタリング機能付きのが普通になってきています。素の Squeak にはリファクタリング機能はありませんが拡張することで追加をすることが出来ます。そもそもリファクタリングの考えは Smalltalker の間から広まっていったと言われているのです。
 快適な Smalltalk ライフのためにも導入しておきたいのが “OmniBrowser” です。

リポジトリの設定を行う

こちらの記事の “OCompletion を設定する” までを行います。

ロード、設定を行う

 リポジトリが開いたら左側のペインで “ConfigurationOfOmniBrowser” を探して選択し、右側のペインで一番上の行を選択して “Load” ボタンを押すとダウンロードが始まるので終わるのを待ちます。

 終わったら Workspace から

((Smalltalk at: #ConfigurationOfOmniBrowser) project version: #stable) load: #('Dev')

と入力して “DoIt” するとロードが始まりますので、終わるのを待ちます。

 無事にロードが終わったら、Browser を開いてみましょう。今までの Browser にリファクタリング機能が追加されています。その他、クラス構造がネスト表示されて継承関係が分かりやすくなっていたり、クラスやメソッドの種類によってアイコン表示がされるようになっています。
スクリーンショット 2014-01-26 20.59.55

 リファクタリングをしたい場合はクラスや変数を選択状態にして右クリックをすることでリファクタリングメニューが表示されます。