C# 拥有实现接口的类是一种糟糕的做法吗?

C# 拥有实现接口的类是一种糟糕的做法吗?,c#,naming-conventions,C#,Naming Conventions,我有一个类东西,它实现了一个接口,名为IThing。每个使用IThing的人都可以假设它确实是一个东西,因为它是实现这个接口的唯一类,但同时他知道他只能访问东西的某个公共成员子集,这有一个很好的设计原因-基本上,IThing是Thing的只读版本(比这稍微复杂一点,但为了回答这个问题,我们假设它只是只读/写的区别) 这是一个好的会议吗?另一种选择是,我可以将这个接口命名为I ingreadonly,或者将类命名为thingwriteable,或者类似的名称,但是在一个大的代码库中,这些名称看起来

我有一个类
东西
,它实现了一个接口,名为
IThing
。每个使用
IThing
的人都可以假设它确实是一个
东西,因为它是实现这个接口的唯一类,但同时他知道他只能访问
东西的某个公共成员子集,这有一个很好的设计原因-基本上,
IThing
Thing
的只读版本(比这稍微复杂一点,但为了回答这个问题,我们假设它只是只读/写的区别)

这是一个好的会议吗?另一种选择是,我可以将这个接口命名为
I ingreadonly
,或者将类命名为
thingwriteable
,或者类似的名称,但是在一个大的代码库中,这些名称看起来会比较庞大,可读性较差

我还广泛使用接口和类的扩展方法,因此我有
ThingExtensions
I的ingextensions
。它非常有用,因为每个阅读此扩展代码的人都可以假设它分别只使用
Thing
IThing
的公共成员。然而,由于某种原因,在项目中同时拥有
ThingExtensions
iingExtensions
文件似乎有点不合适

那么,哪一个是更好的选择-将
东西和
我的东西放在一起,或者重命名其中一个

关于接近投票的更新


这是一个基于意见的问题,因为这是一个关于最佳实践的问题-但它不是一个主要基于意见的问题(请注意区别)。关于最佳实践有很多很好的问题和答案,所以我认为这个问题和其他我没有看到的最佳实践问题之间有区别,或者这个问题与任何其他最佳实践问题一样有权存在。

首先,我建议仅对您无法控制的类型使用扩展方法,例如.NET类型,如
IEnumerable
。但是,您可以考虑创建两个不同的接口,一个用于读取的基类接口(让我们称之为代码>读取/<代码>)和另一个表示您实际的“代码>事物<代码> >的类型(<代码> It编写Word/Cube >),并使用一些写修饰符。
无论如何,为每个类创建一个接口是一种很好的做法,通过模拟某些类型的UO来简化测试。

如果您确定不需要该接口的另一个实现,并且不需要为了测试目的而模拟该接口,您可以简单地删除该接口并使用具体的类

否则,继续使用IThing和Thing(这是正常的命名约定)。
虽然我在问题中描述了使用单独接口和类的另一个原因,
Thing
是否标记为内部和
IThing
公共?
i是否在
Thing
中显式实现了属性和方法?不,它们都是公共的。是的,它们是显式实现的。我不打算使用这些接口进行模拟,因此我并不真正需要
I ThingWrite
-我只使用一个单独的接口来区分写访问和只读访问。扩展方法对于您控制的类型非常有用,如果该类型是接口。