C# 产品商标名称请求使用相同名称的类/命名空间 作者后期编辑:选择的解决方案 (原问题保留在此框下方)

C# 产品商标名称请求使用相同名称的类/命名空间 作者后期编辑:选择的解决方案 (原问题保留在此框下方),c#,.net,C#,.net,摘要:不应将类命名为与其命名空间相同的名称。因此,名称空间或主类应该使用产品名称吗? 选择的解决方案:我决定将产品名称应用于名称空间,并在主类名(例如,_模块)中添加后缀 理由:Visual Studio默认使用项目名称作为命名空间、程序集名称以及实际可交付的.exe或.dll——这些是最可见的项,因此我认为以我的产品名称命名命名空间是有意义的,然后按照Jon Skeet在回答中的建议操作,并将主类命名为uuuuu main或uuu程序或uuu模块。我想没有一个正确的答案 原始问题: 我完全明

摘要:不应将类命名为与其命名空间相同的名称。因此,名称空间或主类应该使用产品名称吗?

选择的解决方案:我决定将产品名称应用于名称空间,并在主类名(例如,_模块)中添加后缀

理由:Visual Studio默认使用项目名称作为命名空间、程序集名称以及实际可交付的.exe或.dll——这些是最可见的项,因此我认为以我的产品名称命名命名空间是有意义的,然后按照Jon Skeet在回答中的建议操作,并将主类命名为uuuuu main或uuu程序或uuu模块。我想没有一个正确的答案


原始问题:

我完全明白--不要将类命名为与其命名空间相同的名称

这几乎是一个重复的问题。。。除了我花了几个小时阅读文章(见下文),找不到或想不出一个似乎正确的解决方案

假设我有一款名为
acmefoobarinator
的产品。它有两个相关类型(例如设置、枚举),但不足以调用任何类型的命名空间层次结构

创建单个产品名称空间并将所有内容都放入其中是有意义的:

namespace Acme.Web.Foobarinator
{
    public class Foobarinator { } // BAD! Same name as namespace!
    public class FoobarinatorInfo { }
    public enum Mode { Disabled, Enabled }
}
糟糕名称空间和类名都相同

但是,我也希望主类是
Foobarinator
,因为它是商标产品名称,我希望消费者通过商标名称使用它:
var fb=new Foobarinator()

选项1:删除产品名称空间,将所有类型升级到父名称空间。但这会用特定于产品的类型(不一定是所有公共类型)污染父命名空间。随着产品的发展,污染将不断增加

namespace Acme.Web
{
    public class Foobarinator { }
    public class FoobarinatorInfo { }
    public enum FoobarinatorMode { Disabled, Enabled }
    // More pollution in future...
}
选项2:在主类中添加不必要的后缀。但这混淆了产品商标名称

namespace Acme.Web.Foobarinator
{
    public class FoobarinatorMain { } // Not the name of the product!
    public class FoobarinatorInfo { }
    public enum Mode { Disabled, Enabled }
}
选项3:对相关类型使用子类/类型。但是,随着产品的发展,将所有内容封装在一个类中最终会违反关注点的分离:

namespace Acme.Web
{
    public class Foobarinator
    {
        public class FoobarinatorInfo { }
        public enum Mode { Disabled, Enabled }
    }
}
你的想法? 我在哪里妥协

相关问题和文章:

我将使用:

namespace Acme.Web.Foobarinator
{
    public class Program { } // The entry point
    public class FoobarinatorInfo { }
    public enum Mode { Disabled, Enabled }
}
甚至:

namespace Acme.Web.Foobarinator
{
    public class EntryPoint { }
    public class FoobarinatorInfo { }
    public enum Mode { Disabled, Enabled }
}

第一个是Visual Studio默认设置(至少对于某些项目类型而言),第二个使类的角色非常明确。

创建一个更具体的名称空间,说明类的用途:

namespace Acme.Web.Foobarinator.Client {
   public class FoobarinatorInfo { }
   public enum Mode { Disabled, Enabled }
  public class Foobarinator { }
}

我会将名称空间的名称更改为产品的描述性名称,而不是产品的名称。因此,如果Foobarinator与图形有关,那么将您的名称空间
Acme.Web.graphics

设为一个选项,即使用复数。我倾向于这样做,即使我的名称空间中没有实际的商标产品名称

例如,假设您有一个票务系统:

namespace Acme.Web.Tickets
{
    public class Ticket { }
    public class TicketInfo { }
    public enum Mode { Disabled, Enabled }
}
您可以将其应用于您的产品:

namespace Acme.Web.Foobarinators
{
    public class Foobarinator { }
    public class FoobarinatorInfo { }
    public enum Mode { Disabled, Enabled }
}

同样,我倾向于第二个。我喜欢将名称空间视为一个类别,而类名是该类别中特定功能块的描述。我认为希望将主类命名为“Foobarinator”有点荒谬。将其称为“入口点”是一个更清晰的描述,实际上它是一个HTTP模块。
Acme.Web.Foobarinator.HttpModule
对您来说合适吗?我有很多这样的例子,很多时候,它只是一个类,只为类而尖叫
Acme.Web.Foobarinator
。但是,一旦您添加一个或两个助手类型,您就开始需要一个子名称空间。因此,我应该在各自的名称空间中单独拥有多个名为
HttpModule
的单类产品,还是应该在
Acme.Web
和子名称空间中同时拥有多个单类产品?@KevinR:如果没有
Foobarinator
的具体示例,就很难知道它的真正功能。。。你能不能不用Foobarinator这个词来描述这个模块的用途?@Jon:我正在开发一个URL“canonicalizer”HTTP模块。它发出301重定向以更正大写、尾随斜杠、主机名等。它被巧妙地命名为“Canonicalizer”,将在Canonicalizer.com上免费提供给社区。作为
Tek4.Web.HttpModule.Canonicalizer
,一切都很棒,直到我需要添加几个枚举和
CanonicalizerContext
类。我是否将这些类型放入父命名空间?如果是这样,如果事情后来演变成十几个或更多类型,会发生什么?我不会使用<代码> HttpModule < /代码>在你使用< <代码> HttpModule > />代码类的命名空间名称中:但是,我会考虑<代码>规范化模块< /代码>或类似的事情。老实说,我不确定……所以在本例中,
Acme.Web.HttpModule
。除了我有多个HttpModule产品。因此,这基本上是选项1,问题是是否“污染”Acme.Web.HttpModule
所有属于不同产品的帮助器类型。正如我在硬代码中所写的——Visual Studio默认使用项目名称作为命名空间、程序集名称、,以及.exe或.dll--这些是最可见的项,因此我认为以我的产品名命名名称空间是有意义的,然后按照Jon Skeet的建议,将主类命名为uuuuu main或uu Program或uuu Module。如果产品包含子功能,我可能会使用*.Graphics等子名称空间。我想没有正确的答案。Thx for your input.FYI-“普通法商标”适用于您使用和主张商标的任何时候,因此,如果您想要主张Foobarinator,您所做的就是在商业中使用它并将其作为Foobarinator(TM)主张。你不应该通过打电话来“稀释”你的用法