C# IoC预期接口的命名约定
当您使用IoC框架时,您最终只能为IoC创建接口。我很想用一个命名约定来命名那些 例如,如果图中没有IoC,您可能具有以下业务域驱动结构:C# IoC预期接口的命名约定,c#,unit-testing,oop,mocking,inversion-of-control,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; } pub
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
在C#中,约定通常是利用语言的惯用命名约定,并使用前面的I
命名接口,如IBodyPartPoker
。这使得BodyPartPoker
可以作为类的名称
在Java中,惯例是不使用匈牙利符号命名接口,因此该接口通常被命名为BodyPartPoker
,这通常会导致人们将其单个类命名为BodyPartPokerImp
你应该认为这是一种代码嗅觉,确切地说是因为似乎接口存在的唯一原因是启用单元测试。你可以说这违反了法律
给接口起另一个名字,比如IIocBodyPartPoker
,并不能解决根本问题
如果存在一个专门支持单元测试的接口,那么您很可能会发现测试与实现细节过于耦合,并且每次尝试重构生产代码时,测试都会中断。同样,命名约定不会解决此类问题。我认为这样做没有多大意义。我已经有了一种代码气味的印象,但是,我工作的环境中,这样说可能会引起很大争议。我在那种工作环境中是个新手,所以我会尽量按照现有的做法行事,除非我有很强的理由。我从团队和在线协议中了解到,大多数人并不介意仅仅为了国际奥委会而创建一个界面。现在我面临的挑战是如何将我的团队代码的重构版本进行PoC,它不会引入接口,因为同时还能工作。。。虽然是单元测试友好的。谢谢