假设我正在使用一个小型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
中的类型。这可以吗?
答案 0 :(得分:2)
为了避免污染我的root命名空间,我想把我的内部类放在Jokes.Internal中。这意味着Jokes命名空间(Jokers)中的类型将知道子目录空间Jokes.Internal中的类型。这可以吗?
是的,没关系。关于命名空间中没有类型的主要指导依赖于“子”命名空间中的类型,更多的是关于公共API。内部类和仅由内部类型使用的名称空间实际上是一个实现细节,并且不在任何类型的指导之内。
我会坚持你认为合理的事情。使用Internal命名空间似乎是合理的(尽管我可能会执行类似命名空间Jokes.Implementations
)。
另外,鉴于您的Jokers
类正在构建新实例,它基本上是一个工厂。您可能需要考虑命名更像JokerFactory
的内容,以使其显而易见。对我来说,Jokers
会建议班级中包含Joker
个实例的集合,而不是一组工厂方法。
答案 1 :(得分:1)
命名空间有几个关键用途:
现在针对您的具体问题。从外部引用内部命名空间中的类型并不是很理想 - 但它也不是很可怕。虽然我现在想不到一个,但如果.NET框架本身存在这种情况,我不会感到惊讶。作为一般设计原则,最好是在层中构建代码;通常这些层的结构使得较少“专业”的代码不会意识到更多的“特定代码”。
命名空间嵌套是将更专业的类型与不太专业的类型分开的一种方法。因此,名称空间System
包含非常通用和广泛适用的类型 - 而System.Drawing
更专业,包含与图像和视觉操作相关的类型。
但是,您应该避免使用命名空间根据可访问性对类型进行分组。这肯定是滥用命名空间 - 并且很可能在长期内引起问题(特别是因为扩展类型的可访问性很常见 - 但是更改它所属的命名空间可能非常困难。)
但是,在我看来,只要你在做的事情上保持一致,并且在命名空间之间划分类型是合理的,我认为你会没事的。
答案 2 :(得分:1)
为了避免污染你的根命名空间,我建议:
声明类internal
而不是public
(以便在程序集之外,API的用户看不到它们)
然后声明为Jokers
的嵌套内部类(以便它们在Jokers
类之外不可见)
答案 3 :(得分:0)
如果你按照你的建议行事,这不是什么大问题,但我认为避免使用“Jokes.Internal”命名空间会更好。我不认为内部类会“污染”你的根命名空间。
无论如何,我认为制作符合您的可见性声明的命名空间肯定是非正统的。