代码之家  ›  专栏  ›  技术社区  ›  Hamish Smith

我应该更关心包之间还是分发单元之间的耦合?

  •  2
  • Hamish Smith  · 技术社区  · 18 年前

    我一直在研究以下指标 coupling 也看看 DSM .

    我一直在使用的一个工具着眼于“模块”之间的耦合,其中一个模块是分发单元(在本例中是.net程序集)。

    我觉得我应该对包(或名称空间)之间的耦合比对分发单元更感兴趣。

    我应该更关心包/命名空间之间的耦合(确保抽象只依赖于抽象,具体类型依赖于抽象并且它们在依赖关系中没有循环,这样重构和扩展就很容易了),还是应该关心我是否可以部署新版本而不需要更新不变的分发单元?

    其他人衡量什么?

    不管怎样,我的直觉是,如果我专注于包/名称空间耦合,那么分发耦合单元将免费提供,或者至少更容易。

    2 回复  |  直到 13 年前
        1
  •  3
  •   therealhoff    18 年前

    首先,很容易过度关注依赖关系和耦合。确保你没有把它复杂化。

    有了免责声明,以下是我的建议。

    依赖/耦合管理有三种不同的观点: 1) 物理结构(即组件依赖关系) 2) 逻辑结构(即命名空间依赖关系) 3) 实现结构(即类依赖关系)

    对于大型应用程序,您至少需要检查所有3个,但通常可以确定优先级。

    对于客户端部署的应用程序,数字1可能非常重要(即对于插件等)。对于部署在企业内部的应用程序(即asp.net),第1项通常并不那么重要(不包括跨多个应用程序重用的框架)。你通常可以很容易地部署整个应用程序,而不会为#1带来复杂结构的开销。

    第2项往往更像是一个可维护性问题。了解您的层边界及其与名称空间的关系(即,您是为每个名称空间做一层,还是在逻辑级别进行不同的打包)。有时,工具可以通过查看逻辑依赖关系结构来帮助您强制执行层边界。

    第3项实际上是关于做好课堂设计。每个优秀的开发人员都应该付出相当大的努力,以确保他只在类中承担适当的依赖关系。这说起来容易做起来难,而且通常是一项必须随着时间的推移而获得的技能。

    为了更接近问题的核心,第1项实际上是关于VS解决方案中项目的布局。所以这不是一个需要衡量的项目。它更像是你在开始时设置并让它运行的东西。第2项是您可以在构建过程中使用工具检查的东西,以查看开发人员是否违反了任何规则。这实际上更多的是一种检查,而不是一种衡量。第3项确实是你想好好看看测量的一个。在你的代码库中找到具有高耦合度的类将是未来的痛点,确保这些类的质量。此外,在这个级别进行测量可以让你对代码库的质量(整体)有一些了解。此外,如果有人将一些非常粗俗的代码检查到你的代码库中,它可能会给你一个危险信号。

    因此,如果你想确定优先级,请快速查看#1和#2。知道他们应该是什么样子。但对于大多数应用程序来说,第3项应该花费最多的时间。

    当然,这个答案不包括大型框架(如.NET BCL)。这些婴儿需要非常小心地照顾#1。 :-)

    否则,你最终会遇到这样的问题: “当前版本的.NET Framework包括各种基于GUI的库,这些库在Server Core中无法正常工作” http://www.winsupersite.com/showcase/win2008_ntk.asp

    你不能跑的地方。NET在Windows Server 2008的无GUI安装上运行,因为该框架依赖于GUI库。..

    最后一件事。确保你熟悉良好依赖/耦合管理背后的原则。你可以在这里找到一个很好的列表:

    http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod

        2
  •  0
  •   Nir    18 年前

    分发单元之间的耦合和依赖循环更“致命”,因为它会使部署程序变得非常困难,有时甚至会使编译程序变得非常难。

    你基本上是对的,一个好的顶层设计将代码划分为逻辑包和清晰预定义的依赖关系,这将为你提供大部分帮助,唯一缺少的是将包正确地分离为发行版单元。