モジュール指向勉強会でソースコードリーディングを行いました。

先日8/23にDevLOVEモジュール指向勉強会が開催され、一コマ担当しました。その時の資料を公開します。

資料の中でソースコードリーディング前に、モジュール化の必要性について話しました。ぶっちゃけていうと、5人で半年の開発案件くらいだと、複数のモジュールに分割する必要なんかないです。日本のソフトウェア開発プロジェクトの少なくとも5割は5人プロジェクトらしいので、すぐにモジュール化を求めているプロジェクトはそんなに多くないんじゃないか、と思ってます。

ただ、そうはいっても世界に視野を移すと、順調にソースコードが増え、システムがどんどん複雑になっています。そのため、アプリケーション層のモジュール化が求められています。これはJavaに限った話ではなく、他の言語、Rails3や、RequireJSとJuicerなんかでもモジュール化を向上する取り組みが行われています。もっと言うと、他の分野のシステムでもモジュール化が進められています。複雑さを軽減させる枠組みとして、分割統治を採用するのは、コンピュータの世界ではよく採用されています。モジュール化はその方針でとりうる一つの形なのです。

さて、実際のソースコードリーディングですが、今回はJAMCircleの中の、ボード定義のエクスポート/インポートを行うクラスを題材にしました。このクラスは、利用ケースがそれほど多くない、と思ったので、TDDでクラスを書き始め、気づいたら一つのクラスとするにはちょっと大きくなりすぎたクラスです。考えようによっては別のモジュールにクラスを移すべきだと感じていました。なので、今回題材に取り上げ、どうやってモジュール分割していくのか、体験する事を題材に進めました。

資料の見方や、ソースコードについて説明し、やってみると、結構みんな手が動きません。後々聞いてみると、構造や振る舞いだけではなく、実際にどう使われるのか、ユースケースを最初に話を聞きたかった、という声が多く有りました。説明が不足してすいませんでした。分からないなりにも手を動かしてみると、解決への糸口に気づく事が有ります。なので、分からない事に気づくため、とりあえず手を動かし、なんでもいいから書いてみるとよいでしょう。

ソースコードを読んだ後、みなでどういう構造にしていったらいいか、意見を交わしました。結構違う視点の話が出てきて面白かったです。出力形式を拡張しやすいよう、ZipFileを継承してみるのはどうだろう、とか、VisitorパターンとStrategyパターンを採用してみるのはどうだろう、とか、他の人の視点がみられて良かったです。

質問への答えをつらつらと書いておこう

@さんのエンタープライズOSGiのセッションであった質問に対し、自分なりに答えたい事がいくつかありました。当日は@さんのセッションだったので、首を突っ込むのもなんだかな、と思ったんですが、改めて考えると、知っていたり、やっている事はいろいろあるので、ここで述べさせて頂きます。

モジュールの開発の権限を開発者ごとに分けたい

誰でもモジュールが触れる状態だと、既存のモジュールに意図しないコードが混入し、モジュールの情報隠蔽が行えず、結局うまくモジュール化を保てないのでは?という質問がありました。そもそもソースコードとモジュールは切り離せるので、開発するモジュールとリポジトリを別々にすることもできるし、モジュールに対してコード署名をつけてあげれば改変できないので、解決できると思った。Eclipseの例でまた恐縮なんだけど、最近Eclipseがリリースしているプラグインにはコード署名が着いていて、改変してもそのまま使えない形になってます。コード署名をつける話は、OSGi SpecのSecurity Layerで書いてあったようななかったような。

開発したモジュールはどうやって共有するの?

Mavenを使っているのであれば、Maven RepositoryにデプロイするだけでOK。無理にOBRを使う必要はありません。EclipseのPDEでBundle開発しているのであれば、p2を使うのも手。p2は出来る事がたくさんあるので、若干敷居が高い気がしますが、一度共有リポジトリを立てると、開発時に不足しているパッケージがあれば、リポジトリから検索してインストールする機構がEclipseにあるので多少楽できるでしょう。