41

一段时间以来,我一直在使用部分类修饰符,以便将辅助类放在自己的文件中。

今天我们来了一个新人,他说与他合作的最后一个团队不允许为此使用分部类,因为修改单独文件中的帮助程序类会导致主要分部类文件因更改而失控. 此外,他们只被允许在主类中放置一个辅助类作为最后的手段,这样一切都保持解耦。

你怎么看?使用这样的部分类有什么问题还是归结为偏好?

例如,我通常有这样的事情:

  • 主类.cs
  • MainClass.Helper1.cs
  • MainClass.Helper2.cs

...

// Inside of MainClass.cs I have code like this:

public abstract partial class MainClass
{
    // ...
}

// Then in the MainClass.Helper1.cs I have:

partial class MainClass
{
   private class Helper1
   {
       // ...
   }
}
4

10 回答 10

31

部分类主要用于代码生成器,例如设计人员-但我使用您引用的方法-特别是当对象实现多个(非平凡)接口时,我发现将每个接口实现分解为 1 个文件很有用. 我通常也有一个静态方法的文件,它们通常与实例方法有足够的不同以保证分离。

于 2008-12-08T23:50:17.353 回答
7

就个人而言,我看不出使用这样的部分类有什么问题,但这只是我自己的看法。唯一可能看起来像“坏习惯”的事情是将您的类命名为“Helper1”和“Helper2”(但这可能只是一个用于澄清的示例)。

如果您正在使用这样的部分类,请查看(免费)插件vsCommands(适用于 Visual Studio 2008),它可以非常轻松地在解决方案资源管理器中对文件进行分组(就像设计器文件一样),而无需编辑项目文件。

于 2008-12-08T23:10:29.210 回答
5

简短的回答:如果所有类都是您的代码,那么您实际上并不需要帮助类,这会使您对部分的需求无效。

长答案:我不确定是否有任何事情表明您的做法明显是错误的。根据我的经验,如果你有几个不同的文件组成了整个班级,你确实需要一个很好的理由这样做,因为:

  1. 部分类在一定程度上降低了可读性
  2. 如果您的类中有多个辅助类,则可能是设计不佳的症状,我认为我从未遇到过被迫为自己创建的类编写辅助类的情况。

但是,我认为使用部分类的最佳理由是代码生成,您希望能够在不丢失自定义工作的情况下重新生成文件。

于 2008-12-08T23:10:36.030 回答
2

我不是部分课程的忠实粉丝,我自己也不使用它们。

有一次我确实发现它们很有帮助并且可以使用,但是当您想向 LINQ to SQL 设计器代码添加一些东西时,除此之外,我发现您是否只是为了它而将代码分散到不同的文件中,它会使阅读和管理变得非常困难。

也许如果您将类拆分为许多文件,那么您的类可能正在做很多事情......只是一个想法:)

于 2008-12-08T23:09:49.103 回答
2

我其实也做过同样的事情。如前所述,对部分类的解密有轻微的可读性影响。

解耦是我喜欢这个解决方案的主要原因。私有内部类与其他所有东西的耦合要少得多,因为没有其他东西可以看到或使用它(尽管他们可能在谈论它访问父类的私有数据的潜力,这通常是一个坏主意)。

于 2008-12-09T00:10:51.600 回答
2

根据我的经验,普通类和部分类之间没有区别。如果您的设计需要大量的类结构或实现更多接口,那么选择部分类。无论如何两者都是一样的。

于 2012-12-28T02:19:14.417 回答
1

我认为,如果嵌套类足够大,以至于您觉得需要将它们拆分为自己的文件,那么它们可能不应该是嵌套类。改为让它们成为与 MainClass 相同命名空间的内部成员。

部分类实际上只存在于支持代码生成器,并且使用它们将程序员编写的代码分解为可管理的块是设计不佳的一个指标。

有关不使用部分类的有趣示例,请参阅这篇文章。

于 2008-12-08T23:42:23.420 回答
1

由于上述类似的原因,我通常从不使用部分类。

但!虽然并不频繁,但我有时会发现对一个类(通常是外部类)进行广泛的单元测试会导致巨大的单元测试类。将单元测试类拆分为部分类使其更容易理解和理解。

类似于从多个接口继承时的分组思想,单元测试可以针对功能进行分组。

于 2014-09-18T10:39:45.413 回答
0

我认为最好记住您的工具的默认行为是创建耦合而非内聚的低级形式;并以怀疑的态度看待它,并覆盖它,除非出于上面列出的某些特定原因它是有意义的。但这不是好的默认行为。

于 2008-12-09T00:36:16.370 回答
0

大多数情况下,我只在代码生成中使用部分类,因此我可以将我的类的行为扩展到需要一些自定义且不包含在代码生成中的分离类上。

于 2008-12-09T04:33:58.637 回答