2

我是初学者程序员,为任何愚蠢道歉。

来自 python 背景创建只有几个类的小项目,我大部分时间都将我的所有代码放在一个文件中。

我最近一直在学习 c#,并且正在编写一个相当大的控制台应用程序(10,000 行以上)。我显然不能将所有内容都放在一个文件中,但我不确定如何将项目分成更小的部分。

到目前为止,我这样做的方式是为我的解决方案中的每个命名空间创建一个新项目,并将每个类相应地拆分为一个单独的文件。到目前为止,我有大约四个命名空间。我已经独立编写了每个命名空间,以期在其他项目中使用每个命名空间。

我现在正处于一个阶段,我想将每个命名空间拼凑起来以构建我的控制台应用程序。我该怎么做呢?

另外,我是否以正确的方式构建我的代码?

另外+ 1,是否可以在项目中使用位于完全不同目录中的文件?

提前谢谢了。

4

4 回答 4

3

听起来或多或少在正确的轨道上。解决您的问题/结构:

1)不需要让每个唯一的命名空间都由它自己的项目来表示;如果它有助于组织您的类,您可以(并且可能应该)在同一个项目中拥有多个子命名空间。在您的情况下,听起来每个人都被编程为自己的独立组件,因此每个人的项目都是有意义的。

2)你把每个类分成一个单独的文件很好,继续这样做。

3)不确定您要如何将代码拼凑在一起。您的意思是如何在 Visual Studio 中物理引用/链接项目或最佳实践来编码/访问您的 API?如果是前者,可以右击工程下的“References”项,指向工程(不是其编译好的DLL)。如果是后者,您可以遵循多种编程模式,但通常您希望从项目中抽象出一个不错的 API,这样您就不必担心代码的内部工作。

4)您绝对可以从完全不同的目录中引用文件。只需右键单击项目或文件夹,选择“添加 -> 现有项目”,然后浏览到该文件。您可能希望将其添加为“链接”,因此它不会物理复制文件:http: //msdn.microsoft.com/en-us/library/9f4t9t92%28VS.80%29.aspx

这是另一个涉及可能的解决方案结构的 StackOverflow 问题:解决方案:每个应用程序或每个应用程序套件

于 2012-04-16T18:58:32.643 回答
3

当您从命名空间开始时,通常会使用您的公司或组织名称(例如,“A”)。如果您有多个产品/项目并且正在为该项目创建代码,您将需要添加一个限定符(例如“B”、“C”等,因此您将拥有 AB、AC 等)。

然后一般的方法是你想在一个相关的命名空间中将类型组合在一起。如果您创建一个类型并且它是针对常见问题的通用/实用程序/一次性解决方案,您将希望将其保留在范围更广的命名空间中。当您发现您正在创建许多类型以支持某些功能或目的时,您可能希望创建一个狭窄的命名空间来包含这些类型。例如,假设您需要为 AB 编写几个数据访问组件,其中包含数据传输对象、数据访问对象等。然后,您可能希望将这些类型放在 ABDataAccess 之类的东西中。

但是,请记住 .NET 使用 OOP 范例。一种 OOP 范式是代码重用。因此,如果您同时访问 AB 和 AC 中的数据,您最好创建可重用的数据访问组件以鼓励在两个项目中重用代码。在这种情况下,您可能希望有一个像 A.Common 这样的项目,其中包含您的任何产品使用的通用类型,其中包含可在 AB、AC 等中使用的通用、通用或抽象概念。

让我试着用这个例子更进一步。

  • 项目:A.Common(程序集名称)
  • 目的:任何项目的可重用类型
  • 命名空间:A、A.DataAccess
  • 类型:A.DataAccess.DataAccessObjectBase

  • 项目:AB(装配名称)
  • 用途:产品“B”的类型
  • 参考文献:A.Common
  • 命名空间:A、AB、ABDataAccess
  • 类型:ABDataAccess.DataAccessObject(实现 A.DataAccess.DataAccessObjectBase)

  • 项目:AC(组件名称)
  • 用途:产品“C”的类型
  • 参考文献:A.Common
  • 命名空间:A、AC、ACDataAccess
  • 类型:ACDataAccess.DataAccessObject(实现 A.DataAccess.DataAccessObjectBase)

这是一个非常简单粗暴的示例,但希望它能帮助您可视化程序集和命名空间之间的关系。

其他一些提示:

  • 不要过度创建命名空间,尤其是在创建深层命名空间(例如 ABSomething.SomeMoreStuff.EvenMoreStuff)时,除非它是明智的。这会让你更难找到东西。
  • 命名空间应该从更广泛的目的转向更窄的目的。此外,如果您在较窄的命名空间中创建一个类型,该类型严重依赖于较宽命名空间中的内容,请确保将其放在较宽的命名空间下。例如 ABBroader.Narrower。

最后,您应该继续为每个源文件创建一种类型。

于 2012-04-16T19:15:33.530 回答
2

命名空间可帮助您组织代码并提供关注点分离。它也可以通过创建文件夹或单独的项目来完成。通过良好的逻辑分离,您可以构建可维护和可扩展的应用程序。

当您决定是否创建新文件夹或新项目时,您应该依靠常识。例如,为hello world应用程序创建多个项目是大材小用。为单个班级创建文件夹也太过分了。但是,当您有多个彼此密切相关的类时,请考虑将此特殊关注点与其他应用程序分开。例如,如果你有CustomerRepository,那么你添加OrderRepositoryand VendorRepository。突出他们所代表的关注是一个很好的决定。创建Repositories文件夹并将所有这些类移到那里。

对于大型应用程序,将业务逻辑、数据访问逻辑和用户界面等关注点分开是很常见的。通常与这些问题相关的类会分到不同的项目中。请记住,这样做是为了使您的代码更易于理解和维护。因此,命名空间应该向您和任何将维护您的应用程序的人描述关注点。例如,您可以使用三个项目:

FooCompany.BLL
FooCOmpany.DAL
FooCOmpany.UI

那是业务逻辑层、数据访问层和用户界面的首字母缩略词。没有“标准”名称。你可以使用任何能更好地描述你的代码的东西。这是我通常用于公司 Foo 产品 Bar 的项目结构示例:

// Assembly for business logic
Foo.Bar.Domain
Foo.Bar.Domain.Model
Foo.Bar.Domain.Services
Foo.Bar.Domain.Repositories
// Assembly for data access
Foo.Bar.Persistence.NHibernate 
// Assembly for application services
Foo.Bar.Services
// Project for presentation    
Foo.Bar.Presentation.Web
Foo.Bar.Presentation.Web.Controllers
Foo.Bar.Presentation.Web.Views

顺便说一句,以您正在开发的公司名称开头命名空间名称的常见做法。请参阅命名空间命名指南。当您在不同的命名空间中有两个具有相同名称的类时,这可以避免名称冲突。

于 2012-04-16T20:22:03.197 回答
1

我将从最后一个问题开始。您可以使用位于项目中完全不同目录中的文件。我认为你走对了。关于不同的命名空间,您可以使用此代码

using System;
using namespace1; 
using namespace2;
于 2012-04-16T18:44:21.190 回答