如何构建可重用的库?

时间:2009-08-08 15:08:21

标签: architecture namespaces structure portability reusability

如何组织代码,以便可以轻松地移植到业务项目中而不会造成不必要的臃肿?

例如(在.Net中),假设您有以下命名空间:

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

修改 我不是特意寻找.Net的答案,但这是我正在使用的具体例子(因为一个抽象的例子会让你更难理解这个例子中的问题)

6 个答案:

答案 0 :(得分: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类,偶尔传递单元格的colspan值。但是你会看到我的网络项目中的某些地方存在某种类似的实现。

答案 1 :(得分:1)

我从DNA中获取提示,并将我的一个庞大的类库的全部或部分从项目复制到项目,即使我在任何一个项目中只使用了1%的库。我可以根据需要随意重写方法和类。

虽然这种方法与传统的编程智慧有些相反,但我不会反击它:它在过去35亿年中非常成功地为生物工作。在生活中,替代方案(通过在项目之间共享编译的程序集来巩固接口和实现)会抑制变化并实际上保证最终的灭绝。

答案 2 :(得分:0)

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

这样您就可以重用代码而无需将其包含在项目中。在上面的示例中,我可能有三个工件,每个工作空间一个,除非有充分的理由将它们保持在一起(这有助于强制松散耦合)。

答案 3 :(得分:0)

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

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

除此之外,我不认为这些规则过于艰难和快速。真的很大程度上取决于装配中的内容,很难制定任意规则......

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

对于在多个项目中共享的东西,我通常采用一种大的DLL方法。虽然如此,如果你有很多项目使用这个人,我强烈建议强烈命名并将其投入GAC。当您添加越来越多的项目时,您最终会遇到的是希望对共享组件进行重大更改。如果您没有使用强命名/ GAC,那么您必须在进行更改时更新每个应用程序,并且不可避免地会忘记一个,生产中的某些东西会爆炸。

强名称,在源代码管理的集中文件夹中保留一个发布版本,并始终引用它。然后部署将其投入GAC。