您认为每个命名空间“分支”有多少类是理想的?什么时候会决定将一个命名空间分解为多个命名空间?让我们不讨论类的逻辑分组(假设它们在逻辑上被正确分组),在这一点上,我专注于可维护与不可维护的类数量。
7 回答
“42?不行,不行……”
好的,让我们发挥我们的编程能力,看看微软的意见是什么:
# IronPython
import System
exported_types = [
(t.Namespace, t.Name)
for t in System.Int32().GetType().Assembly.GetExportedTypes()]
import itertools
get_ns = lambda (ns, typename): ns
sorted_exported_types = sorted(exported_types, key=get_ns)
counts_per_ns = dict(
(ns, len(list(typenames)))
for ns, typenames
in itertools.groupby(sorted_exported_types, get_ns))
counts = sorted(counts_per_ns.values())
print 'Min:', counts[0]
print 'Max:', counts[-1]
print 'Avg:', sum(counts) / len(counts)
print 'Med:',
if len(counts) % 2:
print counts[len(counts) / 2]
else: # ignoring len == 1 case
print (counts[len(counts) / 2 - 1] + counts[len(counts) / 2]) / 2
这为我们提供了有关每个命名空间类型数量的以下统计信息:
C:\tools\nspop>ipy nspop.py
Min: 1
Max: 173
Avg: 27
Med: 15
使用现代 IDE 和其他开发工具,我会说如果所有类都属于一个命名空间,那么为了可维护性,你应该分解一个命名空间的任意数量是不存在的。
我认为命名空间应该尽可能大。如果有合理的理由创建同级命名空间或子命名空间,那么就这样做。我认为将其拆分为命名空间的主要原因是为了简化开发,使开发人员更容易导航命名空间层次结构以找到他们需要的内容。
如果您有一个包含多种类型的名称空间,并且您觉得很难找到某些类型,那么请考虑将它们移至另一个名称空间。如果类型专门用于父命名空间类型,我将使用子命名空间,如果类型可以在没有原始命名空间类型的情况下使用或具有不同用途,我将使用同级命名空间。当然,这完全取决于您要创建的内容和目标受众。
如果命名空间的类型少于 20 种,则不太可能值得拆分。但是,您应该在设计期间考虑命名空间分配,以便在开发时预先知道哪些类型在哪些命名空间中。如果您在开发过程中进行命名空间分配,那么在您确定应该去哪里时,预计会进行大量重构。
这里没有涉及的一件事,尽管它在某种程度上与 Chris 的观点有关,但命名空间的可学习性不仅仅与项目的数量有关。
(顺便说一下,这适用于最广泛意义上的“命名空间”——一个类本身就是一般意义上的命名空间,因为它包含某些名称,这些名称在该上下文中的含义与在另一个上下文中的含义不同,枚举是一个命名空间这种感觉也是)。
假设我遇到了一个带有Element类的 XML 相关名称空间。我对此有所了解,当我查看Attribute类时,我发现了一些相似之处。然后,当我看到一个ProcessingInstruction类时,我可以对它的工作原理做出合理的猜测(如果我猜完全错误,这可能是一个设计缺陷,充其量差异不仅需要记录,还需要解释)。我可以猜到在我看到之前有一个Comment类。我会去寻找你的TextNode类,并想知道这些是否都继承自Node而不必从文档中了解它们。我想知道您对Lang采取了几种合理的方法中的哪一种类,而不是想知道它是否在那里。
因为这一切都与我已经了解的领域有关,所以这七个类的概念“成本”比称为Sheep、Television、FallOfSaigon、Enuii、AmandaPalmersSoloWork、ForArtsSakeQuotient和DueProcess的七个类要少得多。
这与 Chirs 的观点有关,因为他说为了可用性,我们被建议减少选择的数量。但是,如果我们可以按字母顺序选择国家/地区,我们会立即浏览整个列表并立即选择我们需要的国家,因此减少选择的建议并不适用(实际上,一次选择几个选项可以同时不太有用且可能具有侮辱性)。
如果您的命名空间有 200 个名称,但您只需要真正学习半打就可以理解很多,那么与拥有十几个彼此几乎没有关系的名称相比,理解要容易得多。
我知道您不想讨论逻辑分组,但是要进行拆分,您需要能够对两个不同的命名空间进行分组。我会开始考虑在大约 30 个类中使用一个新的命名空间;但是我不会认为这是一个主要问题。
我必须说,我发现以上所有内容都非常令人惊讶。
可用性专家告诉我们将菜单中的选项数量控制在有限的范围内,这样我们就可以立即看到所有选项。这同样适用于您组织工作的方式。
我通常期望命名空间中有 4-10 种类型。节省了很多寻找东西和上下滚动的时间。使用 resharper 移动东西是如此快速和容易,我看不出有什么理由不这样做。
应该提到的另一件事是,将包含扩展方法的类放在它自己的命名空间中通常是值得的,这样您就可以使用using
指令启用或禁用这些扩展方法。因此,如果命名空间中的事物是包含扩展方法的静态类,则答案是 1。