-S2DataSetのAPI(1)
v2.0.5でのS2DataSetでいくらか書いてみて、またXlsReader/XlsWriterを眺め、SqlReader/SqlWriterを想像して、考えました。仕様の変更および拡大があるので難しいかなと思いますが、私なりの理想を書いてみます。
- XlsおよびSqlの違いを、DataSetのAPIレベルでは隠蔽したい。
- 2.0.5ではメタ情報なメソッドで足りないものがある。
- DataSet に保持するTable名を返すメソッド。String getTableName();
- Column名を返すメソッド。String getColumnName();
- Columnの型を返すメソッド。Class getColumnType();
- 書き込みできるかを返すメソッド。boolean isWritable();
- 構造を変えられるかどうかを返すメソッド。boolean isAlterable();
- 書き込んでまだ永続化してないかを判定するメソッド。boolean isDuty();
以上を鑑み、S2DataSet v2.0.6 API仕様私案です。とにかく、DataReader/DataWriterの実装種類を隠蔽するために、S2DataSetのAPIが拡大してますが、なるべくシンプル?にしたつもりではあります。これだけあれば案件でも困らないと思います。今、XlsReader/XlsWriterで開発したとして、後にSqlReaderがでてきてもSeaser2の設定XMLを変更するだけで動いてほしい!との切なる願い。。。
public class SqlReader { public SqlReader(DataSource source); public void addSQL(String sql, String alias); public DataSet read(); }
まんまSQLを書けます。このSqlReaderは各isWritable()およびisAlterable()は全false。リードオンリーです。よって、SqlWriterは無し。S2DataSetのAPIを介してクライアントコードからSQLにアクセスするという意味で、S2Daoと異なります。
public class TableReader { public DBTableReader(DataSource source); public void addTable(String tableName); public void addTable(String tableName, String alias); public void addTable(String tableName, String condition); public void addTable(String tableName, String condition, String alias); public DataSet read(); }
public class TableWriter { public DBTableWriter(DataSource source); public void write(); }
基本的にtableNameで、DataSet#getTable(tableName)が呼べるのですが、名前がかぶるときにはaliasをつけます。テーブルにPKが付いていれば、書き込みも可能とします。このTableReader/TableWriterがほしい!いわゆるTTableですね。
public interface DataSet { public boolean isAlterable(); public int getTableSize();public String getTableName(int index);// うーん。 public DataTable getTable(int index); public DataTable getTable(String tableName) throws TableNotFoundRuntimeException, ConfrictNamesRuntimeException; public DataTable addTable() throws NotAlterableRuntimeException; public void deleteTable(DataTable table) throws NotAlterableRuntimeException; }
Alterableであれば、テーブルの追加、削除ができます。DBReaderで、名前がTooManyな時には、getTable(tableName)でConfrictNamesRuntimeExceptionが発生します。
public interface DataTable { public boolean isDuty(); public boolean isAlterable(); public boolean isWritable(); public String getTableName(); public void setTableName(String tableName) throws NotAlterableRuntimeException; public int getColumnSize();public String getColumnName(int index);// うーん。public Class getColumnType(int index);// getValueType? public int getRowSize(); public DataRow getRow(int index); public DataRow addRow() throws NotWritableRuntimeException; public void deleteRow(DataRow row) throws NotWritableRuntimeException; public String getPrimaryKeys(); // 賛成。 public void PrimaryKeys(String primaryKeys) throws NotAlterableRuntimeException; // 賛成。だけど可能? }
DataTableは、テーブルメタデータへのアクセスと、DataRowの操作を行います。
public interface DataRow { public boolean isDuty(); public boolean isAlterable(); public DataColumn getColumn(int index); public DataColumn getColumn(String columnName) throws ColumnNotFoundRuntimeException; public DataColumn addColumn(Class clazz) throws NotAlterableRuntimeException, NotSupportColumnTypeRuntimeException; public void deleteColumn(DataColumn column) throws NotAlterableRuntimeException; public DataTable getTable(); // 賛成。 }
DataRowは、DataColumnの操作のみを行います。addColumn(Class)で、対応不能な型が引数に渡されると、NotSupportColumnTypeRuntimeExceptionが発生します。
public interface DataColumn { public boolean isDuty(); public boolean isWritable(); public String getColumnName();public Class getColumnType();// 賛成。 public int getValueType(); // 賛成。 public Object getValue(); public void setValue(Object value) throws NotWritableRuntimeException; public DataTable getTable(); // 賛成。 }
DataColumnは、カラムメタデータへのアクセスと、データの操作のみを行います。
赤字でひがさんからのコメントを反映してみました。