繁体   English   中英

拟人化界面 - 好的或坏的想法?

[英]Anthropomorphising interfaces - good or bad idea?

我有一段时间尝试过anthropomorphise(意思是人类可读的)我给接口的名字,对我来说,这就像给一个接口一个基于角色的名字一样 - 试图在名称中捕获接口的目的。

我和其他认为这有点奇怪和幼稚的开发人员进行了讨论。

SO的人怎么想?

示例(C#语法):

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
{
}

当然,您应该始终选择人类可读的标识符。 如下:将他们传达的意义传达给那些不熟悉代码所解决的问题的人。

但是,使用长标识符不会使您的标识符更具“可读性”。 对于任何有经验的程序员来说,'tmp'传达的信息与'temporaryVariable'一样多。 “i”与“dummyCounter”等相同。

在您的特定示例中,接口名称实际上非常烦人,因为用于开发面向对象系统的人将读取继承为“是a”。 而'SomeClass是一个IHaveMessageParameters'听起来很傻。

请尝试使用IMessagePrinter和IMessageParameterProvider。

是的,这听起来是个好主意。

有什么选择?

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

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

使用简单的人类可读名称并不奇怪。 但是用I的接口也代表了第一人称的I ,就好像它在谈论自己......是有点不寻常,是的。

但最重要的是,无论什么对你有用,你和你的团队都能理解。 你必须去做有用的事情。

在我看来,这种方法只会增加开发人员提出这些名称的负担,因为它将I作为句子的一部分进行整合。 我发现IDisposableICanBeDisposed更难以阅读。

接口描述行为,因此我将它们命名为以便传达它们强制要求的行为。 这种“通常”意味着名称是动词,(或副词)或某种形式的动作描述短语。 结合界面的“I”,这看起来就像你在做什么......

ICanMove,IControllable,ICanPrint,ISendMesssages等......

在IControllable,IDisposable,IEnumerable等中使用副词会传达与动词形式相同的思想,而且很简洁,所以我也使用这个形式......

最后,比您命名界面更重要(或至少同样重要)的是保持您设计的接口尽可能小且逻辑性地包含在内。 您应该努力让每个接口代表尽可能小的逻辑连接一组方法/属性。 当一个接口有如此之多以至于没有明显的名称可以描述它所要求的所有行为时,它表明它有太多的内容,并且它需要被重构为两个或更多更小的接口。 因此,以您提议的方式构建maming接口有助于实施此类组织设计,这是一件好事。

在OP的例子中,拟人方式与替代方案相比较 - 例如:IShowMessages与IMessageShower之类的东西。 但是 - 情况并非总是如此。 我在编写游戏对象时使用的接口包括:IOpenClosable和ILockable。 像ICanBeOpenedAndClosed和ICanBeLocked这样的替代品会更加冗长。 或者你可以简单地做IAmOpenClosable和IAmLockable - 但是你只是为了拟人化效果添加“Am”而没有真正的信息利益。 如果传达相同数量的信息,我就是为了尽量减少冗长。

只要试图实现的语义不会丢失,语气就不会受到不可挽回的损害(IDoLotsOfThingsWhichIncludesTheFollowingColonSpace ......)。 我一般都不会介意除了自己以外的其他人。 尽管如此,有很多背景,其中简洁至关重要,这是不可接受的。

说实话,故意使用第一人称的“I for Interface”惯例似乎有点傻。 什么开始作为一个可爱的双关语变得不可能始终如一地遵循,并在以后最终蒙上阴影。 也就是说,你的独立示例读得很清楚,我不会有问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM