2016-09-27 3 views
0

저는 Entity Framework를 사용하고 있고 여러 개의 EMAIL 및 PHONE 엔터티를 포함하는 PERSON 엔터티를 사용하고 있습니다. 사람을 업데이트 할 때 주소를 업데이트하는 도우미 메서드와 전자 메일 주소를 업데이트하는 도우미 메서드가 있습니다. 나는 그들 사이의 모든 코드 중복을 제거하는 좋은 방법을 이해할 수 없다. 첫 번째 생각은 제네릭을 사용하는 것이었지만 유지 관리 가능성을 높이는 것보다 가독성을 떨어 뜨리는 지나치게 복잡한 방법으로 끝내지 않는 방법을 생각할 수는 없습니다. 고맙습니다!어떻게이 두 가지 유사한 방법을 병합 할 수 있습니까?

private void HandleEmailUpdate(PERSON personEntity, string emailType, string newValue) 
{ 
    var emailEntity = personEntity.EMAILs.FirstOrDefault(h => h.EMAIL_TYPE == emailType); 

    if (emailEntity == null) 
    { 
     if (string.IsNullOrEmpty(newValue)) 
      return; 

     var newEmail = new EMAIL 
     { 
      EMAIL_TYPE = emailType, 
      EMAIL_ADDR = newValue, 
      SSN = personEntity.SSN, 
      PID = personEntity.PID 
     }; 

     personEntity.EMAILs.Add(newEmail); 
     _context.Entry(newEmail).State = EntityState.Added; 
    } 
    else if (emailEntity.EMAIL_ADDR != newValue) 
    { 
     if (newValue == "") 
     { 
      _context.Entry(emailEntity).State = EntityState.Deleted; 
     } 
     else 
     { 
      _context.Entry(emailEntity).CurrentValues.SetValues(new {EMAIL_ADDR = newValue}); 
      _context.Entry(emailEntity).State = EntityState.Modified; 
     } 
    } 
} 

private void HandlePhoneUpdate(PERSON personEntity, string phoneType, string newValue) 
{ 
    var phoneEntity = personEntity.PHONEs.FirstOrDefault(h => h.PHONE_TYPE == phoneType); 

    if (phoneEntity == null) 
    { 
     if (string.IsNullOrEmpty(newValue)) 
      return; 

     var newPhone = new PHONE 
     { 
      PHONE_TYPE = phoneType, 
      PHONE1 = newValue, 
      SSN = personEntity.SSN, 
      PID = personEntity.PID 
     }; 

     personEntity.PHONEs.Add(newPhone); 
     _context.Entry(newPhone).State = EntityState.Added; 
    } 
    else if (phoneEntity.PHONE1 != newValue) 
    { 
     if (newValue == "") 
     { 
      _context.Entry(phoneEntity).State = EntityState.Deleted; 
     } 
     else 
     { 
      _context.Entry(phoneEntity).CurrentValues.SetValues(new {PHONE1 = newValue}); 
      _context.Entry(phoneEntity).State = EntityState.Modified; 
     } 
    } 
} 

사용법 : 그들은 같은 규칙을 따라야하는 경우, PhoneEmail 클래스를 통합하고 Contact 클래스를 만들 의미가

HandlePhoneUpdate(entity, "ALT", updatedPerson.PhoneAlt); 
HandlePhoneUpdate(entity, "CELL", updatedPerson.PhoneCellWork); 
HandlePhoneUpdate(entity, "SECOND_CELL", updatedPerson.PhoneCellPersonal); 
HandlePhoneUpdate(entity, "xxx", updatedPerson.Phonexxx); 
HandlePhoneUpdate(entity, "HOME", updatedPerson.PhoneHome); 
HandlePhoneUpdate(entity, "WORK", updatedPerson.PhoneWork); 

HandleEmailUpdate(entity, "ALT", updatedPerson.EmailAlt); 
HandleEmailUpdate(entity, "xxx", updatedPerson.Emailxxx); 
HandleEmailUpdate(entity, "HOME", updatedPerson.EmailPersonal); 
HandleEmailUpdate(entity, "xxx", updatedPerson.Emailxxx); 
HandleEmailUpdate(entity, "WORK", updatedPerson.EmailWork); 
+0

확장 메서드는 'public void HandleSomething (this person person, string phoneType, string newVal)'과 같은 매개 변수를 제거합니다. 그것은'person.HandleSomething ("asd", "asdf"); '그리고 당신은'public void HandeSomething (this PERSON, string Type, string newVal)과 같이 만들 수 있습니다. {if (T는 전화 번호) {...} else if (T가 이메일)}' – Lucas

+0

EMAIL 및 PHONE 클래스가 코드를 병합하고 제네릭을 사용하지 않고도 가독성과 유지 보수성을 유지하는 방법을 알지 못합니다. – Ma3x

답변

0

(나는 'XXX'로 이름을 검열). Contact 클래스는 Type 속성 (전자 메일, 전화, ...), Value 속성 및 필요한 경우 다른 속성을 갖습니다. 이렇게하면 두 가지 유형 (전자 메일 및 전화) 모두에 동일한 방법을 사용할 수 있습니다. HandleContactUpdate

관련 문제