2

你如何组织你的代码,以便它可以轻松地跨业务项目移植而不会带来不必要的膨胀?

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

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

编辑: 我不是专门寻找 .Net 答案,但这是我正在使用的具体示例(因为在这种情况下,抽象示例会使问题更难理解)

4

6 回答 6

2

您是否为每个父命名空间创建一个项目,然后在其他项目中引用该项目 dll?

不必要。它通常以这种方式结束,因为我的库通常不是很大,但您会注意到 Microsoft 肯定不会这样做。即使您不包含 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 项目的几个地方看到类似这样的实现。

于 2009-08-08T15:38:41.180 回答
1

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

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

于 2009-08-08T16:03:03.130 回答
0

我将每个组件保留为一个独立的模块,并使用Maven来管理我的依赖项(它不仅适用于 Java,请参阅这个问题Byldan是一个 .Net 等价物)。

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

于 2009-08-08T15:23:09.353 回答
0

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

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

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

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

于 2009-08-08T15:23:40.930 回答
0

我从一个 dll 开始,随着它变大并开始包含一些相当独立的组件,我可能会选择将它们分解为单独的 dll。对我来说,这主要是一个美学问题——我喜欢让事情保持独立、正交和井井有条。考虑到现在可用的内存量和磁盘空间,一个大的 dll 没有任何问题。

于 2009-08-08T17:54:33.013 回答
0

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

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

于 2009-08-12T04:40:28.553 回答