두 개의 다른 데이터베이스 엔티티에 대해 기본적으로 동일한 작업을 수행하는 두 가지 메소드가 DB 도우미 클래스에 있으며 코드 복제를 피하기 위해 리팩토링하고 싶습니다.이 Objective-C 코드를 리팩토링하는 방법
제 1 엔티티 :
- (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);
}
차이는 (등 RMSQLEntityAExists
, RMSQLEntityBExists
) SQL 문에 사용되는 상수 및 방법 SQLite 문의 데이터 (bindEntityA
및 bindEntityB
). 후자는 내가 일반화하기가 특히 어려웠다.
어떻게이 두 가지 방법을 리팩터링합니까? 해야합니까?
[FMDB] (http://github.com/ccgus/fmdb)를 사용하십시오. –
하지만이 특정 코드를 리팩토링하는 방법을 배우지는 않습니다. ;) – hpique