情况如下。
public interface IFoo { }
public abstract class FooBase : IFoo { }
现在我需要一些IFoo
的集合以及其他一些方法。
public class IFooCollection : List<IFoo>
{
public void UsefullMethod() { }
}
问题是IFooCollection
看起来像一个接口,而它是一个类。选项如下。
IFooCollection
- 我不喜欢这样,因为它看起来像一个界面。FooCollection
- 我不喜欢这样,因为它不是foos的集合。FooBaseCollection
,因为IFoo
的所有实现都来自FooBase
- 我不喜欢这样,因为这可能永远不会是真的。IList<IFoo>
提供扩展方法,因为只有一个完整的方法 - 我不喜欢这样,因为更改代码因为找不到类的名称。 ..是的,这很讨厌。那你会怎么做?我错过了一个命名约定吗?我们基本上使用此Microsoft .NET Library Standards。
更新
代码不会变得普遍 - 它只是在GUI工具中将一些数据放入服务器。所以我不关心将这些方法与其他集合一起使用或忽略这些方法。
答案 0 :(得分:10)
我喜欢FooCollection
你有一个概念对象“Foo”的集合,即使没有实际的Foo
类或接口。这与IFoo
保持一致,即使没有Foo
类,也是“Foo”的接口。 SpecialFoo
即使没有Foo
类,也会是一种特殊的“Foo”。
我绝对同意IFooCollection
因为隐含的界面而错误。
答案 1 :(得分:7)
FooCollection - 由于Foo没有任何意义,因此'Foo'并不明显,因此很难概念化。尝试使用“真正的”类/接口名称,它更有意义 - 例如。
public class ErrorHandlerCollection : List<IErrorHandler>
{
public void PublishErrors(){//...}
}
这是有道理的,因为ErrorHandlerCollection是错误处理程序的集合。实现IErrorHandler的任何东西都是一个错误处理程序,因此ErrorHandlerCollection中的任何内容都将是一个错误处理程序。
答案 2 :(得分:0)
我实际上比构建自己的集合类型更喜欢#4,因为最终用户会想要将他们的IFoo实现对象填充到他们自己的列表和其他集合中。这样,这些集合将按预期工作。
答案 3 :(得分:0)
您已经确定了大多数选择。
我能想到的唯一一个是CollectionOfIFoo,但这与惯例不一致。
我可能会选择IFooCollection。
答案 4 :(得分:0)
就个人而言,我喜欢使用扩展方法的想法。如果您担心人们能够轻松找到扩展方法,只需将它们放在与IFoo接口相同的代码文件中的静态类中。或者在同一名称空间中的单独文件中创建“IFooExtensions”类,以便在人们查看“IFoo”时轻松发现
答案 5 :(得分:0)
IMO#2是正确的命名,但我也建议使用FooList,因为你是从List派生的。
答案 6 :(得分:0)
CollectionOfIFoo
怎么样?
就个人而言,我不喜欢使用“我”前缀接口的惯例 - 它基本上是一种糟糕的匈牙利符号形式,这就是为什么它不好的一个例子。