Design patterns 方法隐藏接口

Design patterns 方法隐藏接口,design-patterns,interface,oop,Design Patterns,Interface,Oop,以上是实现只读/不可变对象的可接受方式吗?IFoo的不变性可以通过临时转换为Foo来打破 在一般(非关键)情况下,通过接口隐藏功能是否是一种常见模式?或者它被认为是惰性编码?或者甚至是反模式?您可以使Foo类仅在程序集级别可见(在C#中为内部),或者使MyReadonlyVar的setter为内部,这样您的代码就不会在程序集之外进行不必要的强制转换。使用接口隐藏使类的接口更小是一种正确的用法。我在Spring应用程序中见过很多这样的代码,其中依赖项只在类中表示(并由Spring依赖项注入使用),

以上是实现只读/不可变对象的可接受方式吗?IFoo的不变性可以通过临时转换为Foo来打破


在一般(非关键)情况下,通过接口隐藏功能是否是一种常见模式?或者它被认为是惰性编码?或者甚至是反模式?

您可以使Foo类仅在程序集级别可见(在C#中为内部),或者使MyReadonlyVar的setter为内部,这样您的代码就不会在程序集之外进行不必要的强制转换。

使用接口隐藏使类的接口更小是一种正确的用法。我在Spring应用程序中见过很多这样的代码,其中依赖项只在类中表示(并由Spring依赖项注入使用),而不在接口中表示,因为它们不为域提供任何内容

你不能保护你的代码免受其他程序员的攻击。如果您担心有人会将接口强制转换为可变版本,那么如果您返回一个真正的只读快照,并且您的团队中有人向其添加了可变方法,也会发生同样的情况

这也取决于你的代码。在一个项目/应用程序中,你可能会信任你的同事。当开发一个框架时,情况就不同了。然后,您必须决定是否始终返回“保存”对象,例如列表的克隆,而不是可能被修改的真实列表

所以,是的,在一般(非关键)情况下,我认为用你的方式做是合适的

interface IFoo
{
    int MyReadOnlyVar { get; }
}


class Foo : IFoo
{
    int MyReadOnlyVar { get; set; }
}


public IFoo GetFoo()
{
    return new Foo { MyReadOnlyVar = 1 };
}