DBヘルパークラスには2つの異なるデータベースエンティティで基本的に同じ2つのメソッドがありますが、それらをリファクタリングしてコードの重複を避けたいと思います。このObjective-Cコードをどのようにリファクタリングするのですか
最初のエンティティ:
- (void) insertOrUpdateEntityA:(NSDictionary*)data {
sqlite3_stmt *exists_stmt;
if(sqlite3_prepare_v2(database, RMSQLEntityAExists, -1, &exists_stmt, NULL) == SQLITE_OK) {
[RMStoreDB bindPrimaryKey:exists_stmt data:data from:1];
if (sqlite3_step(exists_stmt) == SQLITE_ROW) {
int count = sqlite3_column_int(exists_stmt, 1);
sqlite3_stmt *update_stmt;
if (count) { // Update
if (sqlite3_prepare_v2(database, RMSQLEntityAUpdate, -1, &update_stmt, NULL) == SQLITE_OK) {
int index = [RMStoreDB bindEntityA:update_stmt data:data from:1];
[RMStoreDB bindPrimaryKey:update_stmt data:data from:index];
}
} else { // Insert
if (sqlite3_prepare_v2(database, RMSQLEntityAInsert, -1, &update_stmt, NULL) == SQLITE_OK) {
int index = [RMStoreDB bindPrimaryKey:update_stmt data:data from:1];
[RMStoreDB bindEntityA:update_stmt data:data from:index];
}
}
sqlite3_step(update_stmt);
sqlite3_finalize(update_stmt);
}
}
sqlite3_finalize(exists_stmt);
}
第エンティティ:
- (void) insertOrUpdateEntityB:(NSDictionary*)data {
sqlite3_stmt *exists_stmt;
if(sqlite3_prepare_v2(database, RMSQLEntityBExists, -1, &exists_stmt, NULL) == SQLITE_OK) {
[RMStoreDB bindPrimaryKey:exists_stmt data:data from:1];
if (sqlite3_step(exists_stmt) == SQLITE_ROW) {
int count = sqlite3_column_int(exists_stmt, 1);
sqlite3_stmt *update_stmt;
if (count) { // Update
if (sqlite3_prepare_v2(database, RMSQLEntityBUpdate, -1, &update_stmt, NULL) == SQLITE_OK) {
int index = [RMStoreDB bindEntityB:update_stmt data:data from:1];
[RMStoreDB bindPrimaryKey:update_stmt data:data from:index];
}
} else { // Insert
if (sqlite3_prepare_v2(database, RMSQLEntityBInsert, -1, &update_stmt, NULL) == SQLITE_OK) {
int index = [RMStoreDB bindPrimaryKey:update_stmt data:data from:1];
[RMStoreDB bindEntityB:update_stmt data:data from:index];
}
}
sqlite3_step(update_stmt);
sqlite3_finalize(update_stmt);
}
}
sqlite3_finalize(exists_stmt);
}
差がSQL文(RMSQLEntityAExists
、RMSQLEntityBExists
、等)と結合するために使用される方法に使用される定数でありますSQLiteステートメント(bindEntityA
とbindEntityB
)へのデータ。後者は私が一般化するのが特に難しいことです。
これら2つの方法をどのようにリファクタリングしますか?したほうがいい?
[FMDB](http://github.com/ccgus/fmdb)を使用してください。 –
しかし、私はこの特定のコードをどのようにリファクタリングするのか学ばないでしょう。 ;) – hpique