扩展接口模式

25

在 .Net 3.5 中的新扩展允许从接口中分离功能。

比如,在 .Net 2.0 中:

public interface IHaveChildren {
    string ParentType { get; }
    int ParentId { get; }

    List<IChild> GetChildren()
}

可以(在3.5中)变成:

public interface IHaveChildren {
    string ParentType { get; }
    int ParentId { get; }
}

public static class HaveChildrenExtension {
    public static List<IChild> GetChildren( this IHaveChildren ) {
        //logic to get children by parent type and id
        //shared for all classes implementing IHaveChildren 
    }
}

这个机制对于许多接口来说似乎是更好的。它们不再需要抽象基类来共享这段代码,从功能上来看代码仍然有效。这可以使代码更易于维护和测试。
唯一的缺点是抽象基类的实现可能是虚拟的,但这能否得到解决(一个实例方法是否会隐藏具有相同名称的扩展方法?这样做是否会使代码混乱?)
还有其他原因不经常使用这种模式吗?
澄清:
是的,我看到使用扩展方法的趋势是到处都有它们。如果没有进行大量同行评审,我会特别小心在.Net值类型上使用任何一个(我认为我们仅在字符串上有一个.SplitToDictionary() - 类似于.Split(),但也带有键值分隔符)
我认为这里有整个最佳实践的辩论;-)
(顺便说一句:DannySmurf,你的私人消息听起来很可怕。)
我在这里特别询问了先前我们使用接口方法的扩展方法的使用。
我试图避免大量级别的抽象基类 - 实现这些模型的类大多已经有了基类。我认为这个模型可能比添加其他对象层次结构更易于维护和不过度耦合。
这是 MS 对 Linq 的 IEnumerable 和 IQueryable 所做的吗?
11个回答

0

我能看到的一个问题是,在大公司中,这种模式可能会导致代码变得难以(如果不是不可能)让任何人理解和使用。如果多个开发人员不断将自己的方法添加到现有类中,与这些类分离(甚至是BCL类),我可以看到代码库很快失控。

即使在我的工作中,我也能看到这种情况的发生,我的PM想要将我们所做的每一份代码都添加到UI或数据访问层中,我完全可以看到他坚持要添加20或30个与字符串处理仅有间接关系的方法到 System.String 中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接