在哪里保留内部课程?

时间:2010-09-08 23:50:13

标签: c# namespaces

假设我正在使用一个小型API创建一个新库Jokes,。为了使我的API易于使用,我将它放在基本命名空间中:

namespace Jokes

    --> public interface IJoker
        --> string Joke();

    --> public static class Jokers
        --> public static IJoker NewSlapstickJoker()
        --> public static IJoker NewAbsurdJoker()
        --> public static IJoker NewCheesyJoker()

Jokers的实现是内部的:

--> internal class SlapstickJoker : IJoker
--> internal class AbsurdJoker : IJoker
--> internal class CheesyJoker : IJoker

现在我很确定以下是一个可以遵循的指南(有人可以验证吗?):

  • 不要从根命名空间访问子名称空间中的类型。 (例如,System中的类型不知道System.Drawing)中的类型。

本指南是否适用于内部课程?为了避免污染我的根命名空间,我想将我的内部类放在Jokes.Internal中。这意味着Jokes命名空间(Jokers)中的类型将知道子名称空间Jokes.Internal中的类型。这可以吗?

4 个答案:

答案 0 :(得分:2)

  

为了避免污染我的root命名空间,我想把我的内部类放在Jokes.Internal中。这意味着Jokes命名空间(Jokers)中的类型将知道子目录空间Jokes.Internal中的类型。这可以吗?

是的,没关系。关于命名空间中没有类型的主要指导依赖于“子”命名空间中的类型,更多的是关于公共API。内部类和仅由内部类型使用的名称空间实际上是一个实现细节,并且不在任何类型的指导之内。

我会坚持你认为合理的事情。使用Internal命名空间似乎是合理的(尽管我可能会执行类似命名空间Jokes.Implementations)。

另外,鉴于您的Jokers类正在构建新实例,它基本上是一个工厂。您可能需要考虑命名更像JokerFactory的内容,以使其显而易见。对我来说,Jokers会建议班级中包含Joker个实例的集合,而不是一组工厂方法。

答案 1 :(得分:1)

命名空间有几个关键用途:

  1. 它们有助于避免命名不同开发人员和不同组织之间创建和共享的类型之间的冲突。
  2. 它们有助于将类型组织成组,以便更容易理解它们的作用以及哪些类型相互关联或一起使用。
  3. 现在针对您的具体问题。从外部引用内部命名空间中的类型并不是很理想 - 但它也不是很可怕。虽然我现在想不到一个,但如果.NET框架本身存在这种情况,我不会感到惊讶。作为一般设计原则,最好是在层中构建代码;通常这些层的结构使得较少“专业”的代码不会意识到更多的“特定代码”。

    命名空间嵌套是将更专业的类型与不太专业的类型分开的一种方法。因此,名称空间System包含非常通用和广泛适用的类型 - 而System.Drawing更专业,包含与图像和视觉操作相关的类型。

    但是,您应该避免使用命名空间根据可访问性对类型进行分组。这肯定是滥用命名空间 - 并且很可能在长期内引起问题(特别是因为扩展类型的可访问性很常见 - 但是更改它所属的命名空间可能非常困难。)

    但是,在我看来,只要你在做的事情上保持一致,并且在命名空间之间划分类型是合理的,我认为你会没事的。

答案 2 :(得分:1)

为了避免污染你的根命名空间,我建议:

  • 声明类internal而不是public(以便在程序集之外,API的用户看不到它们)

  • 然后声明为Jokers的嵌套内部类(以便它们在Jokers类之外不可见)

答案 3 :(得分:0)

如果你按照你的建议行事,这不是什么大问题,但我认为避免使用“Jokes.Internal”命名空间会更好。我不认为内部类会“污染”你的根命名空间。

无论如何,我认为制作符合您的可见性声明的命名空间肯定是非正统的。