每个名称空间分支的理想类数

时间:2020-03-06 14:50:55  来源:igfitidea点击:

我们认为每个名称空间"分支"理想的类数是多少?在什么时候决定将一个名称空间分解为多个名称空间?让我们不讨论类的逻辑分组(假设它们在逻辑上正确分组),在这一点上,我将重点放在可维护类与不可维护类的数量上。

解决方案

使用现代的IDE和其他开发工具,我想说的是,如果所有类都属于一个名称空间,那么就没有一个为了维护可维护性而要分解该名称空间的任意数量。

我知道我们不想讨论逻辑分组,但是要进行拆分,我们需要能够将两个不同的命名空间分组。我将开始考虑大约30个类的新名称空间。但是,我认为这不是主要问题。

我认为名称空间应该足够大。如果出于逻辑原因需要创建同级名称空间或者子名称空间,则可以这样做。我认为将其拆分为名称空间的主要原因是简化开发,使开发人员更容易导航名称空间层次结构以找到所需的内容。

如果一个名称空间具有很多类型,而我们觉得很难找到某些类型的名称,请考虑将其移至另一名称空间。如果类型专门用于父名称空间类型,则使用子名称空间;如果类型可以在没有原始名称空间类型的情况下使用或者具有不同的用途,则使用同级名称空间。当然,这完全取决于我们要创建的内容和目标受众。

如果名称空间的类型少于20种,则不值得进行拆分。但是,我们应该在设计过程中考虑名称空间的分配,以便在开发时预先知道哪些类型的名称空间。如果在开发过程中进行名称空间分配,那么在确定应该去哪里应该进行大量的重构。

" 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

我必须说,我发现以上所有内容都很令人惊讶。

可用性专家告诉我们将菜单中的选择数量保持在有限的数量,以便我们可以立即看到所有选择。同样适用于组织工作的方式。

我通常希望在名称空间中使用4-10种类型。节省了很多寻找和查找和上下滚动的回合。使用Resharper来回移动内容非常快捷,容易,我看不出为什么不这样做。

应该提到的另一件事是,通常需要将包含扩展方法的类放在其自己的名称空间中,以便我们可以使用" using"指令启用或者禁用这些扩展方法。因此,如果名称空间中的东西是包含扩展方法的静态类,则答案为1.

尽管在某种程度上与Chris的观点有关,但这里未涉及的一件事是,名称空间的可学习性不仅与项目的数量有关。

(顺便说一句,从广义上讲,这适用于"名称空间",从广义上讲,类本身是名称空间,因为它包含某些名称,该名称在该上下文中与在另一上下文中的含义不同,枚举在此是名称空间也是)。

假设我遇到了一个带有Element类的与XML相关的名称空间。我对此有所了解,当我看Attribute类时,我看到了一些相似之处。然后,当我看到ProcessingInstruction类时,我可以对它的工作方式做出合理的猜测(如果我猜完全是错误的,那可能是设计缺陷,充其量其中的差异不仅需要记录在案,而且还要加以解释)。我可以猜到,甚至在看到它之前就有一个Comment类。我将寻找TextNode类,并想知道它们是否全部继承自Node,而不是必须从文档中学习它们。我想知道我们在Lang课堂上采用了几种合理的方法中的哪一种,而不是想知道它是否在那里。

因为所有这些都与我已经了解的领域有关,所以这七个类的概念"成本"比绵羊,电视,FallOfSaigon,Enuii,AmandaPalmersSoloWork,ForArtsSakeQuotient和DueProcess这七个类的所谓"成本"低得多。

这与Chirs的观点有关,因为他说我们建议我们出于可用性的考虑而减少选择的数量。但是,如果我们可以选择按字母顺序排列的国家/地区,则我们会立即查看整个列表并立即选择我们需要的国家/地区,因此建议不要使用降低选择的建议(实际上,一次选择几个选项既可以有用性和侮辱性较小)。

如果命名空间有200个名称,但是我们只需要真正学习六个就可以了解很多东西,那么比起具有很少相互关系的十二个名称要容易得多。