2014-12-04 3 views
6

큰 알고리즘에서 동일한 알고리즘을 따르는 많은 메소드가 있으며, 많은 코드 중복을 제거하는 일반적인 메소드를 호출 할 수 있기를 바랍니다.많은 양의 코드가 중복되는 문제

내가 아래에있는 것과 같은 방법의 톤을 가지고, 나는 최적의 단지 Save<SQLiteLocation>(itemToSave);를 호출 할 수 있도록하려는 것입니다하지만 난 이후 문제의 큰 거래를하는 방법 SQLiteConnection.Find<T> T 같은 추상 데이터 유형을 수락하지 않습니다 제네릭에서.

이 문제를 해결받을 수있는 방법은 내가 그것을 내가 코드의 많은 150 라인을 절약 할 수 고칠 수 있다면

여기

내 코드입니다, 거기 :

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; 
    } 

그리고 여기 또 다른 방법은 방법 참조 참고 : 내 점선 아래 두 가지 방법의 코드는 기본적으로

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; 
    } 
+0

당신은 AutoMapper 또는 뭔가를 사용할 수 있다고 생각하는 것이 바로 그대로 보는 T에 또 다른 제약 조건을 추가했다. 또한 메소드에서'itemToSave'를 옮겨서 매개 변수로 전달하면 나머지 코드를 일반적인 것으로 만들 수 있다고 생각합니다. –

+0

'Find '문장을 만들기 위해 표현식 트리를 살펴 보셨습니까? –

+0

'storedX'는'null'이거나'else'를 사용할 필요가 없습니다. 이로 인해 false를 반환하지 않으므로 반환 값을 제거 할 수 있습니다. 왼쪽은'if (storedX! = null) {dbConn.Update (itemToSave); } else {dbConn.Insert (itemToSave); primaryKey = itemToSave.PrimaryKey; }'. 거기에 3 줄이 바로 제거되었습니다. – Default

답변

0

: 아래 코드는하지만 내 불황을 고정

T storedItem = dbConn.Find<T>(x => x.PrimaryKey == item.PrimaryKey); 

는 감사 도움말 모두를 위해, 나는이 사이트를 사랑 해요! 또한 나는 T가 아닌 추상 형식을 수 있고 인터페이스가 나는 그것이 속성을 이동처럼

private void SaveItem<T>(T item, ref int primaryKey) 
     where T : ISQLiteClass, new() 
    { 
     var dbConn = new SQLiteConnection(dbPath); 

     T storedItem = dbConn.Find<T>(primaryKey); 

     if (storedItem != null) 
     { 
      dbConn.Update(item); 
     } 
     else if (storedItem == null) 
     { 
      dbConn.Insert(item); 
      primaryKey = item.PrimaryKey; 
     } 
    } 
1

당신이 뭔가를 할 수 없을 겁니다 같은 일이다 IComm onInterface는 T로 사용하고자하는 클래스 중에서 공통적으로 사용되는 클래스입니다. 코드, PrimaryKey 속성을 노출하는 인터페이스 또는 클래스를 살펴 보는 것이 바람직합니다.

public bool SaveItem<T>(T item, ref int primaryKey) where T : ICommonInterface, new() 
{ 
    var dbConn = new SQLiteConnection(dbPath); 


    T storedItem = dbConn.Find<T>(x => x.PrimaryKey == item.PrimaryKey); 

    if (storedItem != null) 
    { 
     dbConn.Update(item); 
     return true; 
    } 
    else if (storedItem == null) 
    { 
     dbConn.Insert(item); 
     primaryKey = item.PrimaryKey; 
     return true; 
    } 
    return false; 
} 

편집 : 메소드에 new() 제약 조건이 추가되었습니다. 내가 사용 때이 지원되지 않는 예외 을 던진 몇 가지 이유를 들어

+0

당신이 올바른 내 코드를 수정하면 코드의 내 많은 많은 라인을 저장 – Guano

+0

사실 내가 너무 발진이 나타납니다, 나는이 오류가 나타납니다 : \t \t \t 'T '매개 변수'일반 형식 또는 메서드 'SQLite.SQLiteConnection.Find (System.Linq.Expressions.Expression > "매개 변수로 사용하려면 공용 매개 변수가없는 생성자가있는 추상 형식이 있어야합니다.) '(CS0310) (ShoppingAssistant) – Guano

+0

수정 된 답변을 참조하십시오. 메서드에 new() 제약을 추가합니다. 예 : 여기서 T : ICommonInterface, new() – gmiley