代码之家  ›  专栏  ›  技术社区  ›  MunkiPhD

如何构造可重用库?

  •  1
  • MunkiPhD  · 技术社区  · 16 年前

    您如何组织您的代码,以便在业务项目之间轻松移植,而不携带不必要的膨胀?

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

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

    编辑: 我不是专门寻找.NET答案,但它是我使用的具体示例(因为抽象示例会使理解此实例中的问题更加困难)

    6 回复  |  直到 16 年前
        1
  •  2
  •   Spencer Ruport    16 年前

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

        2
  •  1
  •   MusiGenesis    16 年前

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

    虽然这种方法在某种程度上与传统的编程智慧背道而驰,但我不会反对它:在过去的35亿年中,它在生物方面非常成功。在生活中,替代方法(通过在项目之间共享编译的程序集来巩固接口和实现)抑制了变化,实际上保证了最终的灭绝。

        3
  •  0
  •   Community CDub    8 年前

    我将每个组件作为一个独立的模块,并使用 Maven 要管理我的依赖项(不仅仅是Java),请参见 question , Byldan 是.NET等效项)。

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

        4
  •  0
  •   Gavin    16 年前

    我最近发现,我尽量减少项目的数量,如果这样可以减少最终创建的实际程序集的数量的话——我发现在开发过程中更容易处理。这可能是因为我发现很难创建真正模块化、相互独立的项目。

    我猜一般规则可能是:如果项目真的可以独立于所有其他项目开发,并且可以插入到没有任何其他依赖关系的其他项目中,那么就让它成为自己的项目。如果您发现总是有其他项目需要被引用才能使其工作(例如,在您的监视器项目中,您可能会发现,除非您还包含带有GPU类的计算机名称空间,否则什么都不会工作),那么我会将它们放在一个项目中。

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

    只是我的两分钱,不值钱…

        5
  •  0
  •   Larry Watanabe    16 年前

    我从一个DLL开始,当它变大并且开始包含一些相当独立的组件时,我可以选择将它们作为单独的DLL来考虑。对我来说,这主要是一个美学问题-我喜欢保持事物的独立性、正交性和良好的组织性。考虑到目前可用的内存和磁盘空间,一个大的DLL没有什么问题。

        6
  •  0
  •   Eric    16 年前

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

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