【问题标题】:How should I name an "umbrella" type sanely?我应该如何合理地命名“伞”类型?
【发布时间】:2010-02-24 09:49:30
【问题描述】:

这“一直”困扰着我……

假设我有一个接口IFiddle 和另一个接口,它只是聚合几个不同的IFiddles:

public interface IFiddleFrobbler
{
    IFiddle Superior { get; }
    IFiddle Better { get; }
    IFiddle Ordinary { get; }
    IFiddle Worse { get; }
    IFiddle Crackpot { get; }
}

(具体的IFiddleFrobblers 和IFiddles 取决于配置,由工厂创建。)

我反复偶然发现这种“伞”类型的命名 - 我想将“Frobbler”换成描述性的东西。

  • “集合”、“列表”和“集合”还不够好,因为它不是可以枚举、添加或删除元素的集合/列表/集合。
  • “经理”已退出,因为没有进行任何管理 - 工厂和配置会处理。
  • “Aggregator”听起来像是直接从 GoF 书中挑选出来的(尽管我认为他们不会违反“demeter 法则”——这不在本文的主题范围内)。

请赐教,我的“伞”类型有什么好的命名方案?


编辑:作为xtofl pointed out in a comment,这实际上比我上面第一次公开的语义更多。如果我改为执行以下操作,我认为我的需求会更清楚:

//
// Used for places where the font width might need
// to be tapered for a rendered  text to fit.
//
public interface ITaperableFont
{
    Font Font { get; }
    Boolean CanTaper { get; }

    void Taper();
}

//
// Used for rendering a simple marked-up text in
// a restricted area.
//
public interface ITaperableFonts
{
    ITaperableFont Biggest{ get; }
    ITaperableFont Big { get; }
    ITaperableFont Normal { get; }
    ITaperableFont Small { get; }
    ITaperableFont Smallest { get; }
}

事实上,我在上面的实际添加中将我的问题确定为设计缺陷,而不是命名问题,下面有几个人指出了这个问题。

【问题讨论】:

  • 如果你不能说出它的名字,那么我在设计中闻到了一些腥味。
  • @Pop:正确。这是一种让我的生活更轻松的务实方式,我知道它可能被视为一种气味。
  • 在我的公司,我们使用Bunny 表示我们无法命名的事物。
  • @Earwicker:是的,当其他一切都失败时,这总是一个紧急退出。 :)
  • IDuck?像鸭子一样走路,像鸭子一样颤抖,闻起来像鸭子......

标签: c# oop naming-conventions naming


【解决方案1】:

你能用复数吗:IFiddles

【讨论】:

  • 美在于小事。谢谢。
  • 缺点是它与IFiddle 的区别只有一个字符:这与一些风格指南相矛盾;我仍然认为读者应该能够看到差异,尤其是IFiddles 的成员与IFiddle 的成员完全不同。
【解决方案2】:

我同意你的观点,命名一个类、接口或抽象类真的很难正确。我之前使用过的一些可能的名称,您可能会喜欢:

  • xxxAssistant
  • Compositexxx
  • xxxCoordinator
  • xxxGroup

【讨论】:

    【解决方案3】:

    我会说您选择的名称应该取决于您要达到的目标。在代码示例中,我会说你正在做的是设置评级,所以我可能会称之为IFiddleRating

    作为一般性答案,我会说“这取决于”:) 我发现根据它试图做的事情来命名它是个好主意,而不是它“是什么”

    【讨论】:

    • 一般来说,我同意“我发现在它试图做的事情之后命名它是个好主意,而不是它的“是什么””,但在这种特定情况下不是。这只是一种无行为类型,几乎但不完全像集合/列表/集合。这是一种让我的生活更轻松的务实方式(我知道可能是一种气味,但这不是主题)
    • 至少在这种情况下,您似乎已经找到了这个集合背后的语义。
    • @xtofl: 嗯...你可能真的是对的,现在我想起来了!
    【解决方案4】:

    正如 Pop 所说:“如果你不能说出它的名字,那么我会在设计中闻到一些腥味。”

    也许重新考虑您的设计。

    IFiddles : IDictionary<SomeType, IFiddle>
    {
    }
    

    更新:如果您希望它是只读的,请自行创建一个接口:

    IReadOnlyDictionary<TKey,TValue>
    {
         TValue this[TKey] { get; }
         int Count { get; }
         ...
    }
    

    你的生活仍然可以像以前一样轻松。

    【讨论】:

    • 嗯...但是我明确不希望它看起来可以操纵由IFiddles 聚合的元素集,所以我必须将NotSupportedException 全部抛出@ 987654325@/RemoveICollection&lt;IFiddle&gt; 的实现记录了这一事实。
    • 我根据您的要求添加了帖子:)
    【解决方案5】:

    我认为这确实是个人喜好问题,所以我启动了一个词库并寻找“家庭”的同义词(这本身可能没问题)。

    亲属、分类、流派、团体、种类、细分、协会、从属关系、联盟、氏族、集团、俱乐部、联盟、组合、组合、邦联、联盟、国会、合作社、家庭、联邦、联谊会、兄弟会、帮派, 公会, 联盟, 暴民, 秩序, 组织, 戒指, 社会, 联谊会, 联谊会, 辛迪加, 搭档, 搭档, 部落, 部队, 剧团, 动物园

    我删除了一些具有特定技术含义的(如联合、环、池)...选择你最喜欢的。

    【讨论】:

      猜你喜欢
      • 2019-10-17
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 2022-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多