12

将应用程序代码 (App_Code) 划分为单独文件的一般准则/问题应该是什么?

我发现随着时间的推移,原始文件与命名空间层次结构的演变方式并不匹配。如何随着时间的推移直观地组织应用程序代码容器?

文件划分的目的应该是什么?代码可移植性?关注点分离?一般功能上下文?变化频率?他们应该争取与班级的1-1关系吗?

将代码拆分为许多较小的文件与合并为几个文件有什么影响?

我经常考虑这一点,但从未真正得出适用于所有情况的一般结论。

4

5 回答 5

13

这个问题的答案不是绝对的,因为它通常取决于您手头的任务。如果您正在创建某种 SDK 以供其他人重用,那么命名空间非常重要;但是,如果您正在创建一个只有几个类的内部工具,那么名称空间就几乎不重要了。

课程

一般来说,类应该有自己的文件,因为这简化了人们在代码解决方案中导航的方式,有助于开发和维护(例如,当每个人都更改相同的文件时,合并更改要困难得多)。在某些情况下,将一个类拆分为多个文件是可以接受的,例如:

  • 当有嵌套类时,每个嵌套类都可以有自己的文件。

  • 当类有自动生成的部分时,例如设计器代码。

  • 当类有固定部分时,例如一组通用的隐藏属性或接口的通用实现。

在我们的一个项目中,我们有一个许多类公开的接口的通用实现。由于我们没有多重继承,我们采用混合方法,为每个类自动生成一个附加文件。这可以手动完成,而不是自动完成(并且最初是)。

还有其他情况,但这有点主观,取决于您自己的项目要求。

命名空间

命名空间通常应该专注于您的类型的合理分组。命名空间应该允许开发人员直观地找到他们正在寻找的东西。对于许多小型项目,单个命名空间例如MyAwesomeTool就足够了,但对于具有许多类的大型项目,则需要更合乎逻辑的分组。像 SDK 或 .NET BCL 这样的大型项目依赖命名空间来分解原本庞大的类型集合。每个命名空间级别都提供了可能在那里找到的附加信息,例如System.Windows.FormsorSystem.DrawingMicrosoft.VisualBasic

在创建命名空间时,必须考虑该命名空间和相关项目的用途。如果项目是内部的并且很小,请随意调用命名空间,因为它只是对类型进行分组的必要条件;如果项目在外部可见或包含大量类型,请仔细考虑逻辑和有意义的分组,这将使其他人能够直观地找到他们正在寻找的类型。

结论

没有适用于任何情况的硬性规则。您如何将代码安排到文件中与您自己的开发过程有关,这会影响您和您的团队;您在一个文件中的所有类都将难以开发,但编译后的产品不会有任何不同(前提是单文件方法不会导致错误),而您的命名空间的安排与未来的开发和消费者有关那些命名空间,所以弄错的后果可能会更严重。

  • 旨在以简化当前开发和未来维护的方式组织您的课程。
  • 旨在以简化所有开发的方式组织命名空间,并在适当的情况下简化最终用户的体验。
于 2009-01-26T23:14:08.293 回答
6

类和源文件之间应该存在一对一的映射。

命名空间应该被认为是一个包含一个或多个类的包。在可能的情况下,将它们表示为 Visual Studio 项目窗口中的文件夹/过滤器会很有用。

如果您发现一个相当大的类,您认为将其拆分为单独的文件会受益,那么请考虑重构和拆分类本身。

(可接受的)例外是生成 UI 的代码,Visual Studio 将其放置在单独的文件中。我建议将其保留在自己的文件中,并尽可能将其视为透明的编辑器拥有的文件。

于 2009-01-26T22:56:14.010 回答
4

我看到的大多数建议都说每个公共类型都应该在自己的文件中,并且命名空间应该代表应用程序的文件夹结构。

于 2009-01-26T22:55:34.913 回答
1

我做 99% 的 1 对 1 课程来归档。唯一的例外是,如果您有大量或非常简单的小类,它们都实现了相同的接口并且不应该改变太多。您可能只想继续将它们放在一个文件中。自定义异常就是一个很好的例子。大多数时候(根据我的经验),除了创建自定义消息或类似性质的东西之外,没有其他代码。

命名空间应该首先通过关注点分离来组织。例如,数据对象应该与域对象位于不同的命名空间中。然后,您可能在“聚合根”级别为每组对象拥有一个较小的子域。通常,这些最小的命名空间中的每一个都对应于它自己的项目和 DLL。

于 2009-01-26T23:32:42.220 回答
1

就类而言,我倾向于遵循 Java 规则:“每个文件一个公共类”如果该公共类是唯一用户,我可以在公共中包含一个私有类。(虽然,枚举使这个因素变得不那么重要了);但是,如果它被同一个命名空间中的许多公共类使用,那么我会将它放在它自己的文件中。

我将倾向于按照以下方式使用命名空间:

MyAwesomeApp.UI
MyAwesomeApp.Business
MyAwesomeApp.Data

以反映层的分离。

于 2009-10-02T17:35:18.780 回答