我正在尝试掌握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;
}
}
任何帮助/反馈将不胜感激!预先感谢。
马克。
答案 0 :(得分:0)
这是一个很小的示例,但是可以在耦合/内聚方面进行改进。
对象具有凝聚力。为什么?在Employee
对象中,构造函数和getAddresses()
(顺便应称为printAddresses()
)都引用了两个实例变量(这意味着它们与同一事物有关)。与Address
对象相同。
在耦合部分,我认为您可以做得更好。就目前而言,Employee
对象“知道” Address
对象的内部表示(即与之耦合)。这是因为您是从Address
对象中“导出”数据(字符串),而不是直接在数据所在的位置打印出来。
这会使您的对象更紧密地耦合,并将导致Address
对象中的任何更改(例如,引入街道和城市等)泄漏到Employee
。因此它有真正的缺点。
解决方案是在print()
中定义Address
方法,然后在其中进行System.out.println()
。这符合其他概念,例如Law of Demeter,Tell Don't Ask。