【问题标题】:Is this considered low coupling & high cohesion? Any chance to improve?这是否被认为是低耦合和高内聚?有改善的机会吗?
【发布时间】:2019-04-06 14:13:06
【问题描述】:

我正在尝试掌握 Robert C. Martin 的 SOLID 原则。目前我正在研究低耦合和高内聚。我创建了一些代码来代表我目前对这个主题的理解。你们能告诉我是否在正确的轨道上吗?有没有机会改进当前的设计?

创建两个地址并将其分配给员工的主应用程序:

public class App {

    public static void main(String[] args) {
        Address homeAddress = new HomeAddress("This is my Home Address");
        Address workAddress = new WorkAddress("This is my Work Address");        
        Employee employee = new Employee(homeAddress, workAddress);

        employee.getAddresses();
    }

}

员工类:

public class Employee {

    private Address homeAddress;
    private Address workAddress;

    Employee(Address homeAddress, Address workAddress) {
        this.homeAddress = homeAddress;
        this.workAddress = workAddress;
    }

    public void getAddresses() {
        System.out.println("homeAddress: " + homeAddress.getAddress());
        System.out.println("workAddress: " + workAddress.getAddress());
    }

}

地址接口:

public interface Address {

    String getAddress();

}

具体地址实现1(HomeAddress):

public class HomeAddress implements Address {

    String specificAddress;

    public HomeAddress(String specificAddress) {
        this.specificAddress = specificAddress;
        System.out.println("In HomeAddress Constructor");
    }

    public String getAddress() {
        return specificAddress;
    }
}

具体地址实现2(WorkAddress):

public class WorkAddress implements Address {

    String specificAddress;

    public WorkAddress(String specificAddress) {
        this.specificAddress = specificAddress;
        System.out.println("In WorkAddress Constructor");
    }

    public String getAddress() {
        return this.specificAddress;
    }
}

任何帮助/反馈将不胜感激!提前致谢。

马克。

【问题讨论】:

  • 为什么需要一种类型来区分工作地址和家庭地址?在您提供的代码中,您没有用新功能丰富任何子类,从而使它们变得多余。
  • 两个地址都是一样的。也许你实际上不需要两个实现
  • 关于低耦合和高内聚,您的代码是正确的。但请注意,对于如此轻量级的模型,很难不遵守这些原则。
  • 我同意。在这个例子中,两个地址都做同样的事情。因此,在这种情况下,只有一个实现可以做到这一点。如果他们都有不同的实现,我应该创建两个单独的。谢谢你。你们如何看待这个例子中的高内聚和低耦合?我在这里做对了吗?
  • @davidxxx 谢谢。我知道这只是一个简单的设计。对我来说,一切都是为了了解基础知识。

标签: java solid-principles loose-coupling cohesion


【解决方案1】:

这是一个小例子,但在耦合/内聚方面可以改进。

对象是有凝聚力的。为什么?在Employee 对象中,构造函数和getAddresses()(顺便说一下应该称为printAddresses())都引用了两个实例变量(这意味着它们关注的是同一件事)。 Address 对象也是如此。

在耦合部分,我认为你可以做得更好。就目前而言,Employee 对象“知道”(即耦合到)Address 对象的内部表示。那是因为您从 Address 对象“导出”数据(字符串),而不是在数据所在的位置打印它。

这会使您的对象更加耦合,并会导致 Address 对象中的任何更改(例如引入 Street 和 City 等)泄漏到 Employee。所以它有真正的缺点。

解决方案是在Address 中定义一个print() 方法并在那里执行System.out.println()。这符合其他概念,例如Law of DemeterTell Don't Ask

【讨论】:

  • 谢谢@Robert Bräutigam。很好的反馈。我同意。 Employee 了解(或决定)Address 对象的内部表示确实是个坏主意。在这种情况下,更改将影响三个类EmployeeHomeAddressWorkAddress。我个人也会将此描述为“错误的抽象级别”。
猜你喜欢
  • 2015-06-28
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
  • 2019-02-14
  • 2010-09-07
相关资源
最近更新 更多