2009-08-08 69 views
1

如何组织代码,以便它可以轻松移植到业务项目中,而不会带来不必要的膨胀?你如何构建可重用的库?

例如(在.net),假设你有下面的命名空间:

namespace Computers 
    - Hardware 
     - Motherboard 
     - GPU 
namespace Monitors 
    - Display 
     - Mirrors 
namespace Peripherals 
    - USB 
    - PS/2 
  • 你创建每个父命名空间的项目,然后引用该项目的DLL中的其他项目?
  • 你是否创建了一个大型类库并移植了这个东西(即使你只需要5%的库)?
  • 或者,您是否只创建一个文件并将您需要的代码复制到该文件中;把这个文件放在所有需要实现“即插即用”架构的项目中(尽管看起来很糟糕)?

编辑: 我不是在寻找对于.NET的答案明确,但它是我用具体的例子(因为一个抽象的例子将使它更难理解在这种情况下的问题)

+2

您是否在寻找.Net答案?如果是这样的话,你应该把它标记为 – 2009-08-08 15:19:05

回答

2

你创建每个父 项目命名空间,然后引用 项目DLL在其他项目?

不一定。它通常以这种方式结束,因为我的图书馆通常不是很大,但你会注意到微软当然不会这么做。即使您没有包含System.Web引用,System.Web仍然存在。如果你这样做,你会得到更多的课程。表明System.Web命名空间在几个不同的DLL中使用。

你周围建立一个大的类库 和端口的事情(即使 你只需要在图书馆的5%)?

是的。硬盘空间便宜,比维护冗余代码便宜。

或者,你只是创建一个文件和 复制你需要的代码到该文件; 将文件放在所有需要实现 “即插即用”体系结构的 项目中(就像看起来那样是坏的 )?

这取决于功能。我通常会在片段中放置这样的内容。例如,在我的Web项目显示了一个典型的功能是一样的东西:

void ShowErrorMessage(HtmlTableRow row, string message) 
{ 
    row.Cells.Clear(); 
    row.Cells.Add(new HtmlTableCell()); 
    row.Cells[0].InnerHtml = message; 
    row.Cells.Attributes.Add("class", "error"); 
    row.Visible = true; 
} 

它似乎从来没有像一个很好的候选人的库函数,因为那时我不得不在CSS类,我想用它来传递偶尔还有细胞的价值。但是你会看到在我的Web项目的几个地方坐着这样的实现。

0

我将每个组件保存为离散模块,并使用Maven来管理我的依赖关系(它不仅适用于Java,请参阅此question,Byldan是一个.Net等效项)。

通过这种方式,您可以重复使用代码,而无需将其包含在项目中。在上面的示例中,我可能会有三个工件,每个名称空间都有一个工件,除非有充分的理由将它们放在一起(这有助于实现松散耦合)。

0

我最近发现,我试图保持项目数量下降,如果只是为了减少最终创建的实际程序集数量 - 我只是觉得在开发过程中更容易处理。这可能是因为我发现很难创建真正模块化且彼此独立的项目。

我想一般的规则可能是:如果项目真的可以独立于其他项目开发并插入其他项目而没有任何其他依赖项,那么将其作为自己的项目。如果您发现总是需要引用其他项目才能使其工作(例如,可能在您的Monitors项目中,除非您还将计算机名称空间与GPU类一起包含在内,否则根本没有任何工作可行),那么我会把它们放在一个项目中。

除此之外,我不认为规则太硬和快。实际上取决于很多关于什么的组件,这是很难做出任意的规则...

只是我的两分钱,不值得了很多...

1

我从DNA中接受我的提示,并将我的一个庞大的类库的全部或部分从项目复制到项目,即使我只在任何一个项目中使用1%的库。我根据需要自由地重写方法和类。

虽然这种方法有点违背传统的编程智慧,但我不会认为它:在过去的35亿年里它已经非常成功地用于生物。与生活一样,替代方案(通过在整个项目中共享编译程序集来巩固界面和实现)抑制了变化并实际上保证了最终的灭绝。

+1

+1,但记住发生在恐龙身上的事情。 – Jem 2009-08-08 17:53:34

+0

你没读过侏罗纪公园吗?恐龙的味道就像鸡肉一样。 – MusiGenesis 2009-08-08 18:09:43

0

我从一个单独的dll开始,随着它变得更大并开始包含一些相当独立的组件,我可以选择将它们分解为单独的dll。对我而言,这主要是一个美学问题 - 我喜欢让事物独立,正交和组织良好。考虑到现在可用的内存量和磁盘空间,一个大的dll没有问题。

0

对于在多个项目中共享的东西,我通常会使用一个大的DLL方法。尽管如此,如果你有很多使用这个人的项目,我强烈建议你强有力地命名它并把它扔进GAC。随着您添加越来越多的项目,您最终会遇到什么问题,是希望对共享组件进行彻底更改。如果您没有使用强大的命名/ GAC,那么当您进行更改时,您必须更新每个应用程序,并且不可避免地会遗忘一个,生产中的某些内容将会爆炸。

严格命名它,在源代码控制的集中文件夹中保留发布版本,并始终引用该版本。然后将其部署在GAC中。