什么是删除此重复的最佳模式

时间:2010-10-02 11:23:05

标签: c# refactoring

我正在尝试合并以下代码。 (这里有两个例子)但是这个重复的模式检查字段是否为null然后如果它们是不同的,如果是,则将新值设置为旧值。

重写此内容以避免重复的最佳方法是什么?

if (String.IsNullOrEmpty(f.FirstName))
    {
    if (exisingPerson.FirstName != f.FirstName)
        {
        change = true;
        exisingPerson.FirstName = f.FirstName;
        }
    }

if (String.IsNullOrEmpty(f.LastName))
    {
    if (exisingPerson.LastName != f.LastName)
        {
        change = true;
        exisingPerson.LastName = f.LastName;
        }
    }

4 个答案:

答案 0 :(得分:2)

我不认为你可以做很多事情来消除重复(至少不会引入反射,这可能会使代码变得混乱,而不是让它更清晰)。

但是你可以看看实现INotifyPropertyChanged这是一个标准模式,用于通知对象的更改而不是你当前使用的布尔值:

如果您查看示例代码,那么它也会有一定的重复次数。

答案 1 :(得分:1)

您可以使用代理:

    public static bool ChangeProperty(Func<Person, string> getter, Action<Person, string> setter, Person person, string value)
    {
        if (!String.IsNullOrEmpty(value) && !getter(person).Equals(value))
        {
            setter(person, value);
            return true;
        }
        return false;
    }

并用lambda这样调用它:

    var barneyRubble = new Person();
    change = ChangeProperty(p => p.FirstName, (p, v) => p.FirstName = v, barneyRubble, "Fred");

更好的办法是将方法放在Person类中,并完全取消第三个参数,将其替换为this

可能有点矫枉过正,但如果你进行了很多这类属性的改变,它可能很有价值,而且我认为无论如何这都是一个有趣的模式。

答案 2 :(得分:0)

对于几个字段,您的代码可能是最好的。简短而简单。

答案 3 :(得分:0)

如果您正在执行此操作,则可以使用反射来遍历对象中的每个字段,并执行操作(如果它是String

然而,缺点是可读性。也许你最好不要明确,并通过大量使用单元测试来防止打字错误。