これは私のシナリオです、私はこのインターフェースを持っています:
public interface hitTheDataBase
{
public void insertMe(String [] values);
public void modifyMe(String [] values);
public DataTable selectMe();
}
そして、私はインターフェースを実装するこれらの2つのクラスを持っています:
public Class hitSqlServer implements hitTheDatabase
{
public void insertMe(String [] values)
{
executes insert into table_in_sqlServerBD (col1, col2) values(values[0], values[1])
}
public void modifyMe(String [] values)
{
executes update table_in_sqlServerBD set col1 = values[0], col2 = values[1] where rowid = values[3]
}
public DataTable selectMe()
{
executes select col1, col2 from table_in_sqlServerBD
}
}
public Class hitSqLite implements hitTheDatabase
{
public void insertMe(String [] values)
{
executes insert into table_in_sqLite (col1, col2) values(values[0], values[1])
}
public void modifyMe(String [] values)
{
executes update table_in_sqlLite set col1 = values[0], col2 = values[1] where rowid = values[3]
}
public DataTable selectMe()
{
executes select col1, col2 from table_in_sqLite
}
}
これは実際にテスト環境と本番環境(!)で実行されているベータ版アプリの一部ですが、データベース操作に関連しないバグ修正のため、定期的に更新されます。更新は、アンインストールと再インストールによって簡単に行われます。
これで、テーブルに新しい列「col3」を追加する必要がある非常に特定のコーナー状況に対する新しい要件があり、その列にも値を挿入、選択、および更新する必要があります。問題は、ソフトウェアがすでに実行されている既存のデータベースとの下位互換性を壊したくないことです。
HitTheDataBaseインターフェースを実装する3番目のクラス、「col3」が存在するかどうかを確認するヘルパークラスをコーディングすることを考えていました。
hitTheDataBase hitMe = !helperclass.col3Exists() ? new hitSqlServer() : new hitSqlServerWithCol3();
これは良いアプローチですか?「データベースにヒットする」コードを使用するクラスのコードを変更する必要があるため、それは私には良さそうです。また、GUIに表示するためにcol3の値が存在するかどうかを常に確認し、ユーザーが変更できるようにする必要があります。