Ho molti metodi che seguono in parti grandi lo stesso algoritmo e idealmente voglio essere in grado di effettuare chiamate a un metodo generico che elimina un sacco di duplicazione del codice.Problemi con una grande quantità di duplicazione del codice
Ho tonnellate di metodi come quelli qui sotto, vorrei in modo ottimale vogliono essere in grado di chiamare solo Save<SQLiteLocation>(itemToSave);
ma ho una grande quantità di problemi in quanto che i metodi SQLiteConnection.Find<T>
non accettare un tipo di dato astratto come T in generici.
C'è un modo per aggirare questo, se potessi farlo riparare vorrei salvare fino a 150 righe di codice
Ecco il mio codice:
public bool SaveLocation(ILocation location, ref int primaryKey)
{
var dbConn = new SQLiteConnection (dbPath);
SQLiteLocation itemToSave = new SQLiteLocation();
itemToSave.LocationName = location.LocationName;
itemToSave.Latitude = location.Latitude;
itemToSave.Longitude = location.Longitude;
itemToSave.PrimaryKey = location.PrimaryKey;
----------------------------------------------------------------------------------------
SQLiteLocation storedLocation = dbConn.Find<SQLiteLocation>
(x => x.PrimaryKey == location.PrimaryKey);
if (storedLocation != null)
{
dbConn.Update(itemToSave);
return true;
}
else if (storedLocation == null)
{
dbConn.Insert(itemToSave);
primaryKey = itemToSave.PrimaryKey;
return true;
}
return false;
}
Ed ecco un altro metodo vedere come il codice in entrambi i metodi indicati mia linea tratteggiata è fondamentalmente la stessa cosa
public bool SaveInvitation(IInvitation invitation, ref int primaryKey)
{
var dbConn = new SQLiteConnection(dbPath);
SQLiteInvitation itemToSave = new SQLiteInvitation();
itemToSave.GroupName = invitation.GroupName;
itemToSave.InviterName = invitation.InviterName;
itemToSave.ParseID = invitation.ParseID;
itemToSave.GroupParseID = invitation.GroupParseID;
itemToSave.PrimaryKey = invitation.PrimaryKey;
---------------------------------------------------------------------------------------
SQLiteInvitation storedInvitation = dbConn.Find<SQLiteInvitation>
(x => x.PrimaryKey == invitation.PrimaryKey);
if (storedInvitation != null)
{
dbConn.Update(itemToSave);
return true;
}
else if (storedInvitation == null)
{
dbConn.Insert(itemToSave);
primaryKey = itemToSave.PrimaryKey;
return true;
}
return false;
}
È possibile utilizzare automapper o qualcosa di simile per spostare le proprietà. Inoltre, se sposti 'itemToSave' dal metodo e lo passi come parametro, allora credo che potresti rendere generico il resto del codice. –
Hai considerato di esaminare gli alberi di espressione per creare l'istruzione 'Trova'? –
'storedX' è o' null' o no, quindi non è necessario usare 'else if'. A causa di ciò, non restituirai mai false, quindi potresti rimuovere il valore restituito. Sinistra è 'if (storedX! = Null) {dbConn.Update (itemToSave); } else {dbConn.Insert (itemToSave); primaryKey = itemToSave.PrimaryKey; } '. 3 righe rimosse proprio lì – Default