インターフェイスだけ定義してもプログラムは動作しませんので、実装をしなければなりません。
Spiderシステムは情報を蓄積して扱いやすいインターフェイスを提供するためのものですから、情報を蓄積するストレージが必要になります。フリースタイル(自前でディスクへの保存などの機能を実装する)でもいいのですが、効率の良いものを構築する自信はありません。また、かなりの手間がかかるので、完成がいつになるのか分かりません。そこで、リレーショナルデータベースをストレージシステムとして利用することにします。幸いなことに、JavaにはJDBCという仕組みが用意されているので、データベースの操作は比較的に楽です。また、著名なデータベースのJDBCドライバも公開されています。
どのデータベースを利用するか悩むところですが、まだシステムが成熟しておらず、テスト段階であることを考えれば、手軽に使うことのできるものが望ましいといえます。とはいえ、いつまでも簡易なデータベースに頼っているようでは、システムやデータの規模が大きくなってきたときに対応できなくなるおそれがあります。そのため、特定のデータベースに依存しない設計を目指すことにし、最初は扱いやすいデータベース(SQLiteなど)で開発し、徐々に本格的なデータベース(MySQLなど)へ移行していくことにします。具体的には、NetworkやConceptはデータベースを抽象化したオブジェクトを介してデータベースと情報をやり取りします。そして、そのデータベースごとに仲介オブジェクトの実体を実装していきます。
簡略的に記述すれば、次のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | package jp.blacksoft.spider_jdbc; public interface Database { /** * @param id * 調べるオブジェクトの概念ID * @return オブジェクトの作成日時, オブジェクトが存在しなければ{@code null} */ public Date getConceptCreateDate (long id); // etc... } public class JdbcNetwork implements Network { private final Database objDatabase; // etc... } public abstract class JdbcConcept implements Concept { // ... @Override public Date getCreateDate () { return this.getDatabase().getConceptCreateDate(this.numConceptID); } // ... } |
各データベース用の実装クラスでは、Databaseで定義されたインターフェイスに合わせた情報を返すように、各データベースに応じたSQLを記述します。