使用IoC框架时,最终只为IoC创建接口。我很想为那些使用命名约定。
例如,如果没有图中的IoC,您可能具有以下业务域驱动结构:
interface IBodyPart
{
string ScientificName { get; set; }
string StreetName { get; set; }
}
class Head : IBodyPart
{
public string ScientificName { get; set; }
public string StreetName { get; set; }
}
class BodyPartPoker
{
bool isSituationAcademic;
BodyPartPoker(bool isSituationAcademic)
{
this.isSituationAcademic = isSituationAcademic;
}
void Poke(IBodyPart bodyPart)
{
if (this.isSituationAcademic)
Debug.Print($"Proceeding to poke {bodyPart.ScientificName}");
else
Debug.Print($"Poking that {bodyPart.StreetName} LOL");
}
}
现在假设您要使用IoC来注入BodyPartPoker
个实例。您还想使用某种单元测试模拟框架来测试该逻辑。
在这种情况下,即使您没有业务域案例,也会引入IBodyPartPoker
接口:
interface IBodyPartPoker
{
bool IsSituationAcademic { get; set; }
void Poke(IBodyPart bodyPart);
}
class BodyPartPoker : IBodyPartPoker
{
我的问题是:为IBodyPartPoker
之类的接口设置命名约定是否有意义,所以我们明确地确定它与业务域相关的目的是什么?
说....
interface IIocBodyPartPoker
答案 0 :(得分:1)
在C#中,约定通常是利用语言的惯用命名约定,并使用前面的I
命名接口,如IBodyPartPoker
中所示。这使得BodyPartPoker
免费作为一个类的名称。
在Java中,惯例是命名一个没有匈牙利表示法的接口,因此接口通常会被命名为BodyPartPoker
,这通常会使人们将他们的单个类命名为BodyPartPokerImp
。
您应该将此视为代码气味,因为看起来接口存在的唯一原因是启用单元测试。你可以说它违反了Reused Abstractions Principle。
为界面指定另一个名称,例如IIocBodyPartPoker
,并不能解决根本问题。
如果一个接口专门用于支持单元测试,那么您很可能会发现测试过于依赖于实现细节,而且每次尝试重构生产代码时,测试都会中断。同样,命名约定不会解决此类问题。