我正在努力掌握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(家庭地址(:
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(工作地址(:
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;
}
}
如有任何帮助/反馈,我们将不胜感激!提前谢谢。
马克。
这是一个很小的例子,但它可以在耦合/内聚方面得到改进。
这些物体是有凝聚力的。为什么?在Employee
对象中,构造函数和getAddresses()
(顺便说一下,应该称为printAddresses()
(都引用了两个实例变量(这意味着它们涉及相同的事情(。与Address
对象相同。
在耦合方面,我认为你可以做得更好。目前,Employee
对象"知道"(即耦合到(Address
对象的内部表示。这是因为您从Address
对象"导出"数据(字符串(,而不是直接打印数据所在的位置
这会使对象更加耦合,并将导致Address
对象中的任何更改(例如引入Street和City等(泄漏到Employee
。所以它有真正的缺点。
解决方案是在Address
中定义一个print()
方法,并在那里执行System.out.println()
。这与其他概念是一致的,比如德米特定律,告诉不要问。