Ho diversi metodi che fanno ancora la stessa cosa, quando si interfaccia con il database MySQL, salvare o caricare un diverso tipo di parametro. Attualmente, ho un metodo diverso per ogni tipo. Come posso combinare questi metodi in modo che supportino tipi diversi?Metodi di refactoring che utilizzano lo stesso codice ma tipi diversi
seguito è un esempio di due metodi che sono ancora molto simili utilizzano diversi tipi:
public static void saveLongArray(Connection con, int playerID, String tableName, String fieldName, long[] array, long[] originalArray) {
try {
for (int i = 0; i < array.length; i++) {
// Check for change before running query
if (array[i] != originalArray[i]) {
if (array[i] != 0 && array[i] != -1) {
PreparedStatement updateQuery = con.prepareStatement("REPLACE INTO `" + tableName + "` (`player_id`, `index`, `" + fieldName + "`) VALUES(?, ?, ?)");
updateQuery.setInt(1, playerID);
updateQuery.setInt(2, i);
updateQuery.setLong(3, array[i]);
updateQuery.execute();
} else {
PreparedStatement deleteQuery = con.prepareStatement("DELETE FROM `" + tableName + "` WHERE `player_id` = ? AND `index` = ?");
deleteQuery.setInt(1, playerID);
deleteQuery.setInt(2, i);
deleteQuery.execute();
}
originalArray[i] = array[i];
}
}
} catch (SQLException ex) {
Logger.getLogger(PlayerSaveHandler.class.getName()).log(Level.SEVERE, "SQL Exception while saving a long array!", ex);
}
}
public static void saveIntArray(Connection con, int playerID, String tableName, String fieldName, int[] array, int[] originalArray) {
try {
for (int i = 0; i < array.length; i++) {
// Check for change before running query
if (array[i] != originalArray[i]) {
if (array[i] != 0 && array[i] != -1) {
PreparedStatement updateQuery = con.prepareStatement("REPLACE INTO `" + tableName + "` (`player_id`, `index`, `" + fieldName + "`) VALUES(?, ?, ?)");
updateQuery.setInt(1, playerID);
updateQuery.setInt(2, i);
updateQuery.setInt(3, array[i]);
updateQuery.execute();
} else {
PreparedStatement deleteQuery = con.prepareStatement("DELETE FROM `" + tableName + "` WHERE `player_id` = ? AND `index` = ?");
deleteQuery.setInt(1, playerID);
deleteQuery.setInt(2, i);
deleteQuery.execute();
}
originalArray[i] = array[i];
}
}
} catch (SQLException ex) {
Logger.getLogger(PlayerSaveHandler.class.getName()).log(Level.SEVERE, "SQL Exception while saving an int array!", ex);
}
}
Nota in quell'esempio i tipi sono entrambi numerico. In un caso in cui i tipi sono completamente diversi (ad esempio int e String), cosa posso fare per evitare metodi quasi duplicati?
Ho esaminato questo modello di progettazione ma non avrei mai pensato di usarlo in questo caso. Grazie! – jSherz
L'unica cosa che aggiungerei qui è che, poiché gli array porteranno ora oggetti anziché primitive, dovrebbero essere confrontati usando 'equals()' (ad esempio '! Array [i] .equals (originalArray [i])' o 'compareTo()'. Inoltre, si presume che gli array contengano solo tipi numerici, quindi non abbiamo bisogno di un comportamento per String, e l'argomento type dovrebbe probabilmente essere '' solo per sicurezza –
jpm
L'aggiunta di implementazione nelle interfacce è una buona idea in Java? Non sarebbe meglio come classe astratta? – flurdy