首页 > 解决方案 > 这被认为是低耦合和高内聚吗?有改善的机会吗?

问题描述

我正在尝试掌握 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;
    }
}

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

马克。

标签: javasolid-principlesloose-couplingcohesion

解决方案


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

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

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

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

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


推荐阅读