Architecture 如何构造可重用库?

Architecture 如何构造可重用库?,architecture,namespaces,structure,portability,reusability,Architecture,Namespaces,Structure,Portability,Reusability,您如何组织您的代码,使其能够轻松地跨业务项目移植,而不会带来不必要的膨胀 例如(在.Net中),假设您有以下名称空间: namespace Computers - Hardware - Motherboard - GPU namespace Monitors - Display - Mirrors namespace Peripherals - USB - PS/2 是否为每个父命名空间创建一个项目,然后在

您如何组织您的代码,使其能够轻松地跨业务项目移植,而不会带来不必要的膨胀

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

namespace Computers
    - Hardware
         - Motherboard
         - GPU
namespace Monitors
    - Display
         - Mirrors
namespace Peripherals
    - USB
    - PS/2
  • 是否为每个父命名空间创建一个项目,然后在其他项目中引用该项目dll
  • 您是否创建了一个大型类库并将其移植到周围(即使您只需要5%的类库)
  • 或者,您只是创建一个文件并将所需的代码复制到该文件中;要实现“即插即用”体系结构(看起来很糟糕),需要将该文件放在所有项目中吗
编辑:
我不是在寻找.Net的具体答案,但这是我正在使用的具体示例(因为抽象示例会使理解本例中的问题变得更加困难)

我将每个组件作为一个离散的模块,并使用它来管理我的依赖项(不仅仅是Java,请看这一点,它是一个.Net等价物)


这样,您就可以重用代码,而不必将其包含在项目中。在上面的示例中,我可能有三个工件,每个名称空间对应一个工件,除非有充分的理由将它们放在一起(这有助于实现松耦合)。

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

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

除此之外,我不认为规则太严格太快。这在很大程度上取决于程序集中的内容,很难制定任意规则

只有我的两分钱,不值钱

您是否为每个家长创建项目 名称空间,然后引用该名称空间 其他项目中的项目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值。但是你会在我的web项目中的一些地方看到类似这样的实现。

我从DNA中获取线索,在一个项目到另一个项目复制我的一个巨大类库的全部或部分,即使我在任何一个项目中只使用了库的1%。我可以根据需要自由重写方法和类


尽管这种方法在某种程度上与传统的编程智慧背道而驰,但我不会批评它:在过去35亿年中,它在生物方面非常成功。就像在生活中一样,替代方案(通过在项目之间共享编译的程序集来巩固接口和实现)抑制了更改,实际上保证了最终的消亡。

我从一个dll开始,随着它变得越来越大,并开始包含一些相当独立的组件,我可以选择将它们作为单独的dll进行分解。对我来说,这主要是一个美学问题——我喜欢保持事物的独立性、正交性和组织性。考虑到当前可用的内存和磁盘空间的数量,一个大型dll没有问题。

对于在多个项目中共享的内容,我通常采用一个大型dll的方法。但这里有一个问题,如果你有很多项目使用这个家伙,我强烈建议你给它命名,并把它扔进GAC。当您添加越来越多的项目时,最终会遇到对共享组件进行突破性更改的愿望。如果您没有使用强命名/GAC,那么在进行更改时,您必须去更新每个应用程序,并且不可避免地会忘记其中一个应用程序,生产中的某些应用程序将会爆炸


强名称,将发布版本保存在源代码管理的集中文件夹中,并始终引用该版本。然后把它扔到GAC里

您只在寻找.Net答案吗?如果是这样的话,你应该给它贴上这样的标签。你没读《侏罗纪公园》吗?恐龙尝起来像鸡。