IoC预期接口的命名约定

时间:2018-03-15 16:01:17

标签: c# unit-testing oop mocking inversion-of-control

使用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

1 个答案:

答案 0 :(得分:1)

在C#中,约定通常是利用语言的惯用命名约定,并使用前面的I命名接口,如IBodyPartPoker中所示。这使得BodyPartPoker免费作为一个类的名称。

在Java中,惯例是命名一个没有匈牙利表示法的接口,因此接口通常会被命名为BodyPartPoker,这通常会使人们将他们的单个类命名为BodyPartPokerImp

您应该将此视为代码气味,因为看起来接口存在的唯一原因是启用单元测试。你可以说它违反了Reused Abstractions Principle

为界面指定另一个名称,例如IIocBodyPartPoker,并不能解决根本问题。

如果一个接口专门用于支持单元测试,那么您很可能会发现测试过于依赖于实现细节,而且每次尝试重构生产代码时,测试都会中断。同样,命名约定不会解决此类问题。