这被认为是低耦合和高内聚性吗?有机会改善吗?

时间:2018-11-02 10:27:09

标签: java solid-principles loose-coupling cohesion

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

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

rating = int(input("Enter your rate between (1 to 5) "))

员工类别:

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());
    }

}

特定地址实现1(HomeAddress):

public interface Address {

    String getAddress();

}

特定地址实现2(工作地址):

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;
    }
}

任何帮助/反馈将不胜感激!预先感谢。

马克。

1 个答案:

答案 0 :(得分:0)

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

对象具有凝聚力。为什么?在Employee对象中,构造函数和getAddresses()(顺便应称为printAddresses())都引用了两个实例变量(这意味着它们与同一事物有关)。与Address对象相同。

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

这会使您的对象更紧密地耦合,并将导致Address对象中的任何更改(例如,引入街道和城市等)泄漏到Employee。因此它有真正的缺点。

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