Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将界面拟人化——好主意还是坏主意?_C#_Interface_Role Based - Fatal编程技术网

C# 将界面拟人化——好主意还是坏主意?

C# 将界面拟人化——好主意还是坏主意?,c#,interface,role-based,C#,Interface,Role Based,一段时间以来,我一直试图将我给接口的名称拟人化(意思是人类可读),对我来说,这与给接口一个基于角色的名称是一样的——试图在名称中捕捉接口的用途 我和其他开发者讨论过,他们认为这有点奇怪和幼稚 这些人怎么想 示例(C#语法): 公共接口IShowMessages { 无效显示(字符串消息); 无效显示(字符串标题、字符串消息); } 公共类TraceMessenger:IShowMessages { } 公共接口IHaveMessageParameters { IList参数{get;} } 公共

一段时间以来,我一直试图将我给接口的名称拟人化(意思是人类可读),对我来说,这与给接口一个基于角色的名称是一样的——试图在名称中捕捉接口的用途

我和其他开发者讨论过,他们认为这有点奇怪和幼稚

这些人怎么想

示例(C#语法):

公共接口IShowMessages
{
无效显示(字符串消息);
无效显示(字符串标题、字符串消息);
}
公共类TraceMessenger:IShowMessages
{
}
公共接口IHaveMessageParameters
{
IList参数{get;}
}
公共类SomeClass:IHaveMessageParameters
{
}

是的,听起来是个好主意

替代方案是什么

代码应该是可读的。任何傻瓜都能写出计算机能理解的代码。困难的部分是编写人类能够理解的代码


人类必须维护代码,因此尽可能容易维护非常重要,这包括代码应尽可能可读。

使用简单的人类可读名称没有什么奇怪的。但是使用界面的
I
也代表第一人称
I
,就好像它在谈论自己一样。。。有点不寻常,是的


但底线是,任何对你有用、你和你的团队理解的东西都是好的。你必须使用有效的标识符。

当然,你应该始终选择人类可读的标识符。例如:将它们所传达的含义传达给那些不象您这样熟悉代码所要解决的问题的人

但是,使用长标识符并不能使标识符更具“可读性”。对于任何有经验的程序员来说,“tmp”传递的信息和“临时变量”一样多。“i”和“dummyCounter”等也一样

在您的特定示例中,接口名称实际上非常烦人,因为习惯于开发面向对象系统的人会将继承理解为“is a”。“SomeClass是IHaveMessageParameters”听起来很傻


试着改用IMessagePrinter和IMessageParameterProvider。

在我看来,这种方法只会给开发人员带来更大的负担,因为它将I整合为句子的一部分。例如,我不认为
IDisposable
ICANBesposed

接口描述行为更难阅读,因此我命名它们是为了传达它们所要求的行为。这“一般”意味着名称是动词(或副词)或描述短语的某种形式的动作。结合界面的“I”,这看起来就像你正在做的

ICanMove、iControl、ICanPrint、iSendMessages等

在Icontrolable、IDisposable、Inumerable等中使用副词与动词形式传达相同的思想,而且更简洁,所以我也使用这种形式


最后,比您所命名的接口更重要(或至少同等重要)的是使您所设计的接口尽可能小且逻辑上包含。您应该努力使每个接口表示尽可能小且逻辑连接的一组方法/属性。当一个接口有太多的内容,以至于没有明显的名称来描述它所要求的所有行为时,这表明它有太多内容,需要重构为两个或更多更小的接口。因此,以您提议的方式管理接口有助于实施这种类型的组织设计,这是一件好事。

只要尝试实现的内容的语义没有丢失,简洁性没有受到不可修复的损害(IdolotSofthings,包括以下Colonspace…)。除了我自己,我一般不会介意别人做这件事。尽管如此,在很多情况下,简洁是最重要的,这是不可接受的。

在OP的例子中,拟人化的方式与其他方式相比非常好——例如:IShowMessages与IMessageShower。但事实并非总是如此。我在编程游戏对象时使用的接口包括:IOPConsevable和ILockable。像IcanBeOpenedClosed和ICanBeLocked这样的替代方案会更加冗长。或者你可以简单地使用IAmOpenClosable和IAmLockable,但是你添加“Am”只是为了实现拟人化效果,而没有真正的信息优势。如果传达的信息量相同,我完全赞成尽量减少冗长。

在第一人称中故意使用“I for Interface”约定,老实说似乎有点愚蠢。一开始是一个可爱的双关语,后来就不可能始终如一地被理解了,最终使意思变得模糊不清。也就是说,您的独立示例读起来足够清晰,我不会有任何问题。

太糟糕了,没有对最有趣的回答进行单独投票。;)+1公共类手榴弹:我认为它是一个毫无用处的答案(不幸的是,这个笑话太老了,我不能忽略否决权,尽管它毫无用处)@弗雷里希:这个问题问到“这些人怎么想的?”我真的认为这是个坏主意
IShowMessages
IHaveMessageParameters
iReadandWriteStufToAndFromFiles
iThinkitsAtterribleIDEA
都同样无用,因为它们传达的目的的可读性/清晰度不如传统的等价物。这就是为什么我提到C#语法,从历史上看,我来自windows C++\COM背景,这个符号一直都是jsut。我知道很多人不使用“I”语法…
public interface IHazTe
public interface IShowMessages
{
    void Show(string message);
    void Show(string title, string message);
}

public class TraceMessenger : IShowMessages
{
}

public interface IHaveMessageParameters
{
    IList<string> Parameters { get; }
}

public class SomeClass : IHaveMessageParameters
{
}