検索について、何をキーにして検索するか決める。
本来的なユースケース図の書き方からは外れているのだけれど、矢印は命令を出すアクターとそれを受け取るアクターを表している。実装するときは、各クラスの持つメソッドになる予定。
少し間が開いてしまったと言うこともあるし、あれから実装しておきたいことも変わってしまったので、もう一度最初から作り始めてみようと決心する。これで何度目の作り直しか、という気がしないでもないけれど。
まずは、ユースケースを書くところから始めてみる。
去年から希望している機能に大きな変更はないことを確認。
本当は夏中にひとまずα版くらいまではたどり着いておこうと思っていたのだけれど、気がつけば10月。うーん。1年経とうとしているのか……。
ともあれ、Aredoko クラスを書き始める。
ユーザインタフェイスの作成。「Formdesigner for VisualuRuby」を使ってのイメージ固めはほぼできたので、コードを書き始める。
GUI のテストコードをどうやって書けばいいのか試行錯誤中。できれば、ここもユニットテストをしておきたいのだけれど……。
Value クラスの属性を「code」「name」「body」に確定。
XML データ処理に関してもファイルからの入出力とオブジェクトの生成部分がほぼできあがる。ただ、この部分、もう少し抽象化を進めたいなぁ。
ユーザインタフェイスを作成中。ひとまず、「Formdesigner for VisualuRuby」 を使って、イメージを固めていく。GUI を作る際、こういうお助けツールがあると、本当に助かります。作者さんに感謝、感謝。
Book クラスと Comment クラスの日付関係のメソッドをいじる。与えられたものをそのまま保持するのではなく、メソッド内でDate オブジェクトを生成するように変更。
ユーザインタフェイス、勉強もかねて VisualuRuby を使って作ってみよう。途中で日和るかもしれないけれど。
ところで、メソッドの引数が正当なものかどうかのチェックって、どちら側でやるのがいいんだろう。メソッドの中の人? それとも引数を与える側?
おとなしく考えると、何が与えられるか分からないし、それによってエラーが発生するのはメソッドの中なのだから、メソッドの中でということになるのかなぁ。
またまた間が開いていますけれど、「あれどこ」のユーザインタフェイスをどうしようかというあたりを考えています。
候補としては、
Web アプリケーションというとかっこいい感じですけれど、作る上では今の僕には一番手っ取り早そうというだけだったり(^^;
実際、入力は CGI ライブラリを使えば何とかなりそうですし、出力は ERb ライブラリを使えば何とかなりそう。
ただしネックは、本当の意味で Web アプリケーションにしようとすると、ユーザ管理とかいろいろと別に面倒なことが発生しそうなこと。それに、ローカル環境でということになると、これだけのために Web サーバを起動しないといけないというのも、なんとなく嫌な感じ。
CUI ベースも作る上では簡単なのだけれど、今更 CUI かーという気がしないでもない。いえ、CUI 自体はユーザインタフェイスだと思うのですけれど……。
なんて考えてくると、やっぱり GUI がいいのかなぁと思っています。が、しかし。Ruby の標準の GUI ライブラリってないんですよね。
Access 版の「あれどこ」の画面と機能の関係は、こんな感じ。
まとめられそうなところもあれば、Web アプリケーションにすることで、新たに作らなければいけないところもありそうだけれど、ひとまずは、これを元に HTML ベースで画面デザインを作り始める。最終的に出力は eRuby を使って実装する予定。
ひとまず Access 版の「あれどこ」の画面をリストアップ。呼び出し関係をおおざっぱに記述してみる。
それぞれの画面がもっている機能を洗い出す作業に入る。
ユーザインタフェースをどうしようか考え中。Webアプリケーションにしてしまうのが、今の僕には一番手っ取り早いような気がするのだけれど……。
ともあれ、現実逃避的にここまで作ったクラスの見直しを始める。
書籍データの XMLファイルへの書き込みと読み込みをひとまず書き上げる。
とは言いつつ、本当に「とりあえず」のスクリプトなので、エラー処理などは全くなし。ファイル書き出しのロックもないので、まだ実用的では全然ないのだけれど。
しばらく間が空いてしまったけれど、スクリプトを修正。Book クラスと Value クラスの属性 id を code に変更。
Value の設定は XML ファイルを読み込むことにしよう。
<value> <code></code> <name></name> </value>
ひとまずファイルの読み込み、書き出しは成功。
データベース操作をどうするか考え始める。
MySQL とかを使うという方法もあるのだろうけれど、それだと Access を使っているのと根本的には違いがないので、処理速度の問題を無視して、素の XML ファイルで処理をする方向で考えていこう。
Book クラスの初期化に関して、初期値をどうするか考える。と言っても、「nil」にするか、「""」にするかだけの違いなのだけれど。
引用文の検索結果をどのように返すか考える。
Access 版そのままに考えると、
[[book.name, startPage, endPage, body], []...]
こんな感じで配列を返せばいいのだろうけれど、むしろ、
{book => [quotation, quotation...], book => []...}
こっちの方がいいのかもしれない。でも、ちょっと冗長かなぁ。
引用文の検索まで、Bookshelf クラスに責任を持ってもらうことにする。
細々とスクリプトを書き続ける。
Book クラス、Comment クラス、Quotation クラス、Value クラスについては、ひとまず完成。今考えているモデル部分は、これで一応できたことにしよう。
Bookshelf クラスについても、検索機能はほぼ完成する。引用部分の検索まで、Bookshelf クラスに責任を持たせるべきか引き続き考え中。
書籍に関する DTD を調べてみたのだけれど、「これだ!」というものが見つからない。探し方が悪いのかなぁ。
ひとまず、独自仕様として作ってしまおうか。
<book> <id></id> <title></title> <subtitle></subtitle> <author></author> <translator></translator> <publisher></publisher> <price></price> <year></year> <date></date> <finishdate></finishdate> <value></value> <comments> <comment date=""></comment> <comment date=""></comment> </comments> <quotations> <quotation startPage="" endPage=""></quotation> <quotation startPage="" endPage=""></quotation> </quotations> </book>
ひとまず、XML のベースは、こんな感じ。
Book クラスに関してはほぼ確定できた。
Bookshelf クラスの検索関連のメソッドを書いていく。ひとまず検索対象の項目としてはこんな感じで予定。
引用文に対する検索を Bookshelf クラスで実装するべきなのか、違うクラスを作るのかは検討中。
ひとまず、Book クラスを書き終える。結局、コメントや引用文を生成したり、修正する役割は含めないことにする。
併行して、Bookshelf クラスを書き始める。こちらも同様に、書籍データを生成したり修正する役割は含めないことにする。
Book クラスを書き始める。Book クラスの役割として、コメントや、引用文に対する操作まで含めるか悩み中。
また、Book オブジェクトの集合を扱うクラスについて考え始める。こちらも同じく、Book の各属性を変更する操作まで含めるか悩み中。ともあれ、ひとまずこんな感じ。
引き続き、Book 関連のクラス図を考える。
Access版の「あれどこ」では、コメントは1つしか書けなかったのだけれど、これを複数書けると便利な気がしているので、それにあわせる。また、属性の名前を省略せずにもう少し分かりやすいようにする。
併行して、Comment クラスと Quotation クラス、Value クラスを書く。
Access 版の「あれどこ」からクラス候補の洗い出しを始める。
テーブルの構成から考えると、こんな感じ?
UML図を描くために使っている IIOSS だと、「Book クラスの属性が多い!」と警告してくるのが気にかかるところ。
とりあえず、Access 版の「あれどこ」をベースにして、ユースケースを書き始める。
Access 版でできることは、こんな感じ。
今回 Ruby で作り直すことで新機能も加えていきたいのだけれど、ひとまずは上記を実装することを当面の目標にしよう。