作者编辑后:选择解决方案
(原始问题仍在此框下方)
摘要:您不应该将类命名为与其命名空间相同的类。因此,产品名称应该用于命名空间还是主类?
选择解决方案:我决定将产品名称应用于命名空间,并在主类名称中添加后缀(例如__Module)。
基本原理: Visual Studio默认使用项目名称作为命名空间,程序集名称以及实际可交付的.exe或.dll - 这些是最明显的项目所以我认为它在我的产品名称之后命名命名空间是有意义的,然后按照Jon Skeet在他的答案中建议并将主类命名为___Main或__Program或__Module。我猜想没有一个正确的答案。
原始问题:
我完全获取它 - 不要将其命名为同样的类别!
这几乎是一个重复的问题...除了我花了几个小时阅读文章(见下文),找不到或想出一个似乎正确的解决方案。
说我有一个名为ACME Foobarinator
的产品。它有几个相关类型(例如,设置,枚举),但不足以调用任何类型的命名空间层次结构。
创建单个产品命名空间并将所有内容放入其中是有意义的:
namespace Acme.Web.Foobarinator
{
public class Foobarinator { } // BAD! Same name as namespace!
public class FoobarinatorInfo { }
public enum Mode { Disabled, Enabled }
}
BAD !!! 名称空间和班级名称都相同!!
但是,我也希望主要课程为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 }
}
}
我在哪里妥协?
相关问题和文章:
How to avoid having the same name for a class and it's namespace, such as Technology.Technology?
Should a class have the same name as the namespace?
Namespace with same name as a class name
答案 0 :(得分:3)
我会用:
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默认值(至少对于某些项目类型),第二个清楚地说明了类的作用是什么。
答案 1 :(得分:1)
创建一个更具体的命名空间,说明这些类的用途:
namespace Acme.Web.Foobarinator.Client {
public class FoobarinatorInfo { }
public enum Mode { Disabled, Enabled }
public class Foobarinator { }
}
答案 2 :(得分:0)
我会更改名称空间的名称以描述产品而不是产品名称。因此,如果Foobarinator与图形有关,请创建名称空间Acme.Web.Graphics
。
答案 3 :(得分:0)
一种选择是使用复数。我倾向于这样做,即使我的命名空间中没有实际的商标名称。
例如,假设您有一个售票系统:
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 }
}