Dies ist mein Szenario, ich habe diese Schnittstelle:
public interface hitTheDataBase
{
public void insertMe(String [] values);
public void modifyMe(String [] values);
public DataTable selectMe();
}
Und ich habe diese zwei Klassen, die die Schnittstelle implementieren:
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
}
}
Dies ist Teil einer Beta-App, die tatsächlich in Test- und Produktionsumgebungen (!) Ausgeführt wird. Sie wird jedoch aufgrund von Fehlerkorrekturen, die nicht mit den Datenbankoperationen zusammenhängen, regelmäßig aktualisiert. Die Updates werden einfach per Deinstallation und Neuinstallation vorgenommen.
Jetzt habe ich eine neue Anforderung für eine ganz bestimmte Eckensituation, bei der eine neue Spalte "col3" zur Tabelle hinzugefügt werden muss, und ich muss auch Werte in diese Spalte einfügen, auswählen und aktualisieren. Das Problem ist, dass ich die Abwärtskompatibilität mit vorhandenen Datenbanken, in denen die Software bereits ausgeführt wird, nicht beeinträchtigen möchte.
Ich habe darüber nachgedacht, eine dritte Klasse zu codieren, die die HitTheDataBase-Schnittstelle implementiert, eine Hilfsklasse, um zu überprüfen, ob "col3" vorhanden ist, und so etwas wie:
hitTheDataBase hitMe = !helperclass.col3Exists() ? new hitSqlServer() : new hitSqlServerWithCol3();
Ist das ein guter Ansatz? Es sieht für mich gut aus, außer weil ich den Code in den Klassen ändern muss, die diejenigen verwenden, die "die Datenbank getroffen haben". Außerdem muss ich ständig überprüfen, ob der Wert von col3 vorhanden ist, um ihn in der GUI anzuzeigen, und den Benutzer ihn ändern lassen.