java - 这被认为是低耦合和高内聚吗?有改善的机会吗?
问题描述
我正在尝试掌握 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;
}
}
任何帮助/反馈将不胜感激!提前致谢。
马克。
解决方案
这是一个小例子,但可以在耦合/内聚方面进行改进。
对象是有凝聚力的。为什么?在Employee
对象中,构造函数和getAddresses()
(应该printAddresses()
顺便调用)都引用两个实例变量(这意味着它们关注的是同一件事)。对象也一样Address
。
在耦合部分,我认为你可以做得更好。就目前而言,Employee
对象“知道”(即耦合到)Address
对象的内部表示。那是因为您从对象“导出”数据(字符串),Address
而不是在数据所在的位置打印它。
这使您的对象更加耦合,并且会导致对象中的任何更改(例如引入 Street 和 City 等)Address
泄漏到Employee
. 所以它有真正的缺点。
解决方案是在其中定义一个print()
方法Address
并在System.out.println()
那里执行。这符合其他概念,例如Demeter 法则,Tell Don't Ask。
推荐阅读
- java - conn.prepareStatement(sql) 上的 java.lang.NullPointerException
- json - 如何将 REST API 调用返回的 JSON 解析为 JAX-RS 中的对象集合?
- swift - 如何检索firebase数据库值以计算平均值
- c++ - 为什么范围的算法与 std 的迭代器不兼容?
- earlgrey - 如何将earlgrey 配置为根本不跟踪网络呼叫?
- c++ - 我的变量在 C++ 中打印后无法获得 $ 打印符号
- python-3.x - Python - 如何输出列表中包含一定数量字母的字符串
- angular - Angular 6:设置空表单数组字段
- homebrew - 没有为自制软件找到 gpg-agent
- c - 在处理文件之前声明可变数量的变量