为什么命名空间类型不应该依赖于嵌套命名空间类型?

9
在 .Net 命名指南 (http://msdn.microsoft.com/en-us/library/893ke618(v=vs.71).aspx) 中有这样一句话:
"一个嵌套的命名空间应该依赖于包含命名空间中的类型。例如,System.Web.UI.Design 中的类依赖于 System.Web.UI 中的类。然而,System.Web.UI 中的类不依赖于 System.Web.UI.Design 中的类。"
我想知道: 为什么?

1
你有没有找到关于这个指南的更多信息?我感觉它是在没有任何支持信息的情况下创建的。回顾我过去的所有项目,每次都违反了这个指南。我理解这个指南。例如,我有一个依赖于Product.Business.Modules中的ModuleProduct.Business.Product.IEnumerable<Module> Modules { get; },这违反了指南,需要我将Module移动到父命名空间。 - David Anderson
到目前为止,这对我来说仍然没有太多意义。 - bcsanches
2个回答

7

因为当你考虑到这一点时,它就是有意义的。

让我用一个简单的例子来解释:

例如,一把刀片需要一个手柄才能成为“刀”。

但是,一个手柄不需要刀片就可以成为手柄,对吗?

using KitchenSet;
using KitchenSet.Knives; // This is where your knives (what uses Blades) would live.
using KitchenSet.Knives.Blades; // The actual blades. 

@bcsanches:我也想知道(因为我做类似的事情);也许你应该把它作为一个例子添加到你的问题中? - Chris Sinclair
1
@bcsanches:看看我的编辑。这样更容易理解吗? - Only Bolivian Here
@SergioTapia 有时我在 KitchenSet.Knives 中有一个 Knife 工厂,它使用 KitchenSet.Knives.Blades 中的实现类型;将工厂放在其他地方会更好吗? - Chris Sinclair
1
在我的看法中,类型 KitchenSet.Knives 会依赖于 KitchenSet.Knives.Blades 中的类型,对吗?如果是这样,那么这不就是 msdn 告诉我们要避免的吗? - bcsanches
5
我的风格是在 Kitchen.Knives 中创建一个名为 Blades 的基础类型(接口或抽象类),然后将各种实现(如Butcher,Paring,Butter)放到 Kitchen.Knives.Blades 中进行组织。 - Chris Sinclair
显示剩余2条评论

0
这是一个明智的规则,因为在 System.Web.UI 命名空间中定义的类对于在 System.Web.UI.Design 中定义的类是可见的,但在 System.Web.UI.Design 命名空间中定义的类对于在 System.Web.UI 命名空间中定义的类是不可见的。在后一种情况下,必须添加一个 using 语句(在 VB.NET 中使用 Imports) 。

但是当我阅读 MSDN 上的建议时,感觉好像我缺少了一些基本的设计准则或最佳实践。 - bcsanches

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接