【问题标题】:How to avoid the type of coupling in the given code?如何避免给定代码中的耦合类型?
【发布时间】:2018-03-19 23:06:11
【问题描述】:

我遇到了一些基于Coupling 的随机问题。

具有各种获取候选人信息的方法的候选类。其中一种方法是候选人获得的getScore() 分数。假设我们有另一个类 CompScience,它存储了有资格申请计算机科学流录取的候选人的详细信息。 CompScience 类有一个名为 isEligibleToApply() 的方法,如果候选人的分数超过 350,则返回 true。该方法的结构之一 isEligibleToApply() 如下所示:

boolean isEligibleToApply(Candidate  c) {
integer score = c.getScore();
Return true if Score is more than 350
}

在这种情况下,如果我们以某种方式更改 Candidate 类的 getScore() 方法(例如,通过重命名它),我们可能还必须更改 CompScience 类的 isEligibleToApply() 方法。


如果我更改方法 getScore() 的名称,那么它也应该在 isEligibleToApply() 方法中更改。这总是在我们更改名称时发生,维基百科建议这是内容耦合。

是否有任何方法可以使 isEligibleToApply() 方法中的任何更改都无法更改,并且代码是松散耦合的。我搜索了松耦合,得到了一些使用接口使代码松耦合的建议。

任何提示/建议?

【问题讨论】:

  • 唯一的方法是只传入 int 分数作为参数;但是你遇到的问题是你可以传入 any int,而不仅仅是一个语义上是Candidate 的分数。这是一个真正的问题。重命名方法不是,因为有工具可以帮您完成。
  • 实际上没有任何区别。使用接口并不意味着您以后不想更改名称并遇到同样的问题。关键是不要更改名称,但如果您确实接受了上述建议并使用了 IDE。

标签: java software-design loose-coupling


【解决方案1】:

当您更改方法时,您无法逃避替换使用方法的位置的需要。你可以做一些事情,比如写一个CandidateScoreCalculator 类,它可能有一个叫做getScore(Candidate c); 的方法,你可以在isEligibleToApply() 方法中使用它,但是当那个 getScore() 方法改变你有在您使用该方法的位置也进行更改。

【讨论】:

    【解决方案2】:

    解决这个问题的方法是从Candidate 类中提取公共接口。该接口将声明不应以破坏方式更改的 API 合约。即使您决定从实现中重命名或删除getScore 方法,接口也会强制您提供旧方法的实现以实现兼容性。

    不用说,CompScience 在这种情况下会将接口作为isEligibleToApply 的参数。

    还有一个注意事项。仅当 CandidateCompScience 作为公共 API 的一部分公开时,这种方法才有意义。或者,至少,它们在您的项目中是公开的。

    在某些情况下,例如在私有模块内部,仅仅为了它而解耦是没有意义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      • 2012-05-02
      • 2011-08-12
      • 1970-01-01
      相关资源
      最近更新 更多