【问题标题】:How can I merge these two similar methods如何合并这两种相似的方法
【发布时间】:2016-09-27 17:45:05
【问题描述】:

我正在使用实体框架,并且拥有包含多个 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;
        }
    }
}

用法:(我删掉了带有“xxx”的名字)

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

【问题讨论】:

  • 扩展方法会删除一个参数,比如public void HandleSomething(this PERSON person, string phoneType, string newVal) ,然后像person.HandleSomething("asd","asdf"); 一样调用它,你可以像public void HandeSomething<T> (this PERSON, string Type, string newVal){ if(T is Phone){...} else if(T is Email)}一样调用它
  • 如果 EMAIL 和 PHONE 类不共享一个基类,那么我看不出如何在不使用泛型的情况下合并代码并同时保持可读性和可维护性。

标签: c# refactoring code-duplication


【解决方案1】:

如果它们遵循相同的规则,那么将 PhoneEmail 类统一并创建一个 Contact 类是有意义的。 Contact 类将具有 Type 属性(电子邮件、电话等)、Value 属性和其他属性(如果需要)。 这样您就可以对两种类型(电子邮件和电话)使用相同的方法:HandleContactUpdate

【讨论】:

    猜你喜欢
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多